2014-04-28 27 views
34

Şu anda Android ağ iletişimi için Square by Retrofit kullanıyorum. Bir görev sırasında, bir görüntüyü yüklerken Facebook'un kullandığı yönteme benzer bir ilerleme bildirimi oluşturmak için ilerlemesini almanın bir yolu var mı?Android Güçlendirme - devam Bildirimi görüntülemek için onProgressUpdate

Kullanım Koşulları, görüntüyü, sıkıştırma veya ölçekleme yapmadan tam görüntü kalitesinden umutlu bir şekilde yüklemek olacaktır.

Asenkronizasyonda bunun nasıl mümkün olduğunu görüyorum ama bu, Retrofit'i kullanma amacını ortadan kaldıracaktır. Ancak almam gereken rota bu olabilir.

+0

sen Can kullanım durumu üzerinde durmak? En basit Retrofit istekleri, ilerleme göstergelerine ihtiyaç duymayacak kadar kısadır, ancak sanırım resim gibi bir dosya yüklemek için PUT veya POST kullanıyorsunuzdur? – Hober

+0

Precisely @Hober, bir fotoğraf yüklemek için retrofit kullanmamanızı öneriyor musunuz? Ve eğer öyleyse, herhangi bir tavsiyeniz var mı? –

+0

Bunu bir süre önce uyguladım, ancak çözümü bulamadım, böylece bunun yerine belirsiz bir ilerleme çubuğu yaptım. – NujnaH

cevap

67

Bu cevap Güçlendirme 1 içindir. Retrofit 2 see this answer ile uyumlu çözüm.


Ben aynı sorunu vardı ve nihayet bunu başardı. Daha önce Spring Lib kullanmıştım ve Spring için çalışmış olduğum şeyler Bahar için çalışmıştı ama InputStream için kullanmayla ilgili bir hata yaptığım için tutarsızdı. Tüm API'larımı retrofit'i kullanacak şekilde taşıdım ve listenin en sondaki yüklemesiydi, sadece OutputStream'e okunan baytlarda beni güncellemek için TypedFile writeTo() işlevini geçersiz kıldım. Belki bu geliştirilebilir ama ben ilkbahar kullandığım zaman yaptım dediğim gibi, sadece yeniden kullandım. Bu, yükleme kodu ve benim uygulamada benim için çalışıyor, eğer geri bildirim indirmek istiyorsanız, @Streaming'i kullanabilir ve inputStream'i okuyabilirsiniz.

ProgressListener

public interface ProgressListener { 
void transferred(long num); 
} 

CountingTypedFile

public class CountingTypedFile extends TypedFile { 

private static final int BUFFER_SIZE = 4096; 

private final ProgressListener listener; 

public CountingTypedFile(String mimeType, File file, ProgressListener listener) { 
    super(mimeType, file); 
    this.listener = listener; 
} 

@Override public void writeTo(OutputStream out) throws IOException { 
    byte[] buffer = new byte[BUFFER_SIZE]; 
    FileInputStream in = new FileInputStream(super.file()); 
    long total = 0; 
    try { 
     int read; 
     while ((read = in.read(buffer)) != -1) { 
      total += read; 
      this.listener.transferred(total); 
      out.write(buffer, 0, read); 
     } 
    } finally { 
     in.close(); 
    } 
} 
} 

MyApiService

public interface MyApiService { 
@Multipart 
@POST("/files") 
ApiResult uploadFile(@Part("file") TypedFile resource, @Query("path") String path); 
} 

SendFileTask CountingTypedFile sadece TypedFile kopyası ama ProgressListener dahil olduğu

private class SendFileTask extends AsyncTask<String, Integer, ApiResult> { 
    private ProgressListener listener; 
    private String filePath; 
    private FileType fileType; 

    public SendFileTask(String filePath, FileType fileType) { 
     this.filePath = filePath; 
     this.fileType = fileType; 
    } 

    @Override 
    protected ApiResult doInBackground(String... params) { 
     File file = new File(filePath); 
     totalSize = file.length(); 
     Logger.d("Upload FileSize[%d]", totalSize); 
     listener = new ProgressListener() { 
      @Override 
      public void transferred(long num) { 
       publishProgress((int) ((num/(float) totalSize) * 100)); 
      } 
     }; 
     String _fileType = FileType.VIDEO.equals(fileType) ? "video/mp4" : (FileType.IMAGE.equals(fileType) ? "image/jpeg" : "*/*"); 
     return MyRestAdapter.getService().uploadFile(new CountingTypedFile(_fileType, file, listener), "/Mobile Uploads"); 
    } 

    @Override 
    protected void onProgressUpdate(Integer... values) { 
     Logger.d(String.format("progress[%d]", values[0])); 
     //do something with values[0], its the percentage so you can easily do 
     //progressBar.setProgress(values[0]); 
    } 
} 

. Eğer bir ProgressDialog, Bildirim üzerinde göstermek amacıyla maksimum değeri elde etmek istiyorsanız

+1

sonunda .. uzun aramadan sonra .. dolu Yığın Taşması !!! – faruk

+0

zaten @SiamakSiaSoft cevabına bağlı –

0

vb

ProgressListener

public interface ProgressListener { 
    void transferred(long num, long max); 
} 

CountingTypedFile

public class CountingTypedFile extends TypedFile { 

    private static final int BUFFER_SIZE = 4096; 

    private final ProgressListener listener; 

    public CountingTypedFile(String mimeType, File file, ProgressListener listener) { 
     super(mimeType, file); 
     this.listener = listener; 
    } 

    @Override 
    public void writeTo(OutputStream out) throws IOException { 
     byte[] buffer = new byte[BUFFER_SIZE]; 
     FileInputStream in = new FileInputStream(super.file()); 
     long total = 0; 
     try { 
      int read; 
      while ((read = in.read(buffer)) != -1) { 
       total += read; 
       this.listener.transferred(total, super.file().length()); 
       out.write(buffer, 0, read); 
      } 
     } finally { 
      in.close(); 
     } 
    } 
} 
İlgili konular