У меня есть приложение, которое может записывать и загружать видеофайл. У меня есть механизм, который регистрирует onFailure Throwable
при каждой загрузке файла.Что не так с скоростью загрузки некоторых устройств с помощью Multipart OkHttp3/Retrofit 2
Я заметил, что из тысячи устройств, использующих приложение, есть некоторые, которые имеют постоянные тайм-ауты и имеют плохой коэффициент загрузки.
Проблематика устройство: Asus ZenPad C 7,0 Z170C
Я купил прибор и начал испытывать его, но первый позволяет дать вам вкус того, что код я использую.
В деятельности:
FileUploadService service = ServiceGenerator.createService(FileUploadService.class);
File file = new File(getRealPathFromURI(mediaForUpload.mediaUri));
ProgressRequestBody fileBody = new ProgressRequestBody(file,
new ProgressRequestBody.UploadCallbacks() {
@Override
public void onProgressUpdate(int uploadPercentage) {
// set current progress
}
@Override
public void onError() {}
@Override
public void onFinish() {}
});
MultipartBody.Part body = MultipartBody.Part.createFormData(mediaForUpload.mediaNameWithExtension, mediaForUpload.mediaNameWithExtension, fileBody);
Call<ResponseBody> call = service.upload(body);
call.enqueue(new Callback<ResponseBody>() {
@Override
public void onResponse(Call<ResponseBody> call, retrofit2.Response<ResponseBody> response) {
if (response.isSuccessful()) {
} else {
//Log
}
}
@Override
public void onFailure(Call<ResponseBody> call, Throwable t) {
//Log
}
});
В ServiceGenerator:
public static <S> S createService(Class<S> serviceClass) {
OkHttpClient client = new OkHttpClient.Builder()
.connectTimeout(120, TimeUnit.SECONDS)
.writeTimeout(120, TimeUnit.SECONDS)
.readTimeout(120, TimeUnit.SECONDS)
.build();
Retrofit.Builder builder =
new Retrofit.Builder()
.baseUrl("https://some.nice.api/")
.addConverterFactory(GsonConverterFactory.create());
Retrofit retrofit = builder.client(client).build();
return retrofit.create(serviceClass);
}
В FileUploadService:
@Multipart
@POST("/somepath")
Call<ResponseBody> upload(@Part MultipartBody.Part file);
Так как вы можете видеть, что мой тайм-аут составляет 120 секунд, это интересно, но этого недостаточно, чтобы успешно загрузить 15MB видеофайл без тайм-аута.
Я сделал пару тест из Asus ZenPad C 7.0 и Samsung Tab 3 7" просто чтобы показать вам разницу (Тест на 2,4 сети, в 5 метрах от маршрутизатора;. Tab 3 средняя скорость загрузки: 1 Мб/с, средняя скорость загрузки ZenPad C7: ~ 30KB/s, если происходит чудо)
Скриншоты из Android Monitor:
- Samsung Tab 3 7"
- Asus ZenPad C 7,0
неудачу с 120 тайм-аут после этого:
успех после этих двух, но в ожидании 1:35 минут:
Я протестировал загрузку OkHttp3 Multipart, чтобы быть уверенным, что это не проблема Retrofit 2, и результаты те же.
Вы пробовали использовать профайлер выборки? Можно пролить свет на то, что он тратит все свое время. –
Это может помочь: http://www.android-ide.com/blog/2014/01/26/using-androids-hidden-sampling-profiler/ –