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
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
Precisely @Hober, bir fotoğraf yüklemek için retrofit kullanmamanızı öneriyor musunuz? Ve eğer öyleyse, herhangi bir tavsiyeniz var mı? –
Bunu bir süre önce uyguladım, ancak çözümü bulamadım, böylece bunun yerine belirsiz bir ilerleme çubuğu yaptım. – NujnaH