Я использовал Retrofit2 для загрузки файлов. Я не могу обновить ProgressBar со значением прогресса. Я получил значение прогресса. Так что нет проблемы. Когда я устанавливаю значение прогресса, чтобы индикатор выполнения не отображался в пользовательском интерфейсе.
Я говорю о индикаторе выполнения, который присутствует внутри адаптера RecyclerView.
Ниже приведен мой вызов модификации, и этот метод будет вызываться при нажатии элемента внутри RecyclerView.
private void downloadFileFromServer(String otpapi, String userName, String password, String code, String vmFileName, String filePath, String vmFileSize, int position, CircularProgressBar circularProgress) {
GetDataForApiCall getDataForApiCall= RetrofitInstance.getRetrofit(url,otpapi,context).create(GetDataForApiCall.class);
Call<ResponseBody> downloadVoicemail= getDataForApiCall.downloadVoiceMail(userName,password,code,vmFileName);
this.circularProgressBar=circularProgress;
this.circularProgressBar.setIndeterminate(false);
this.circularProgressBar.setProgress(0);
this.circularProgressBar.setMax(100);
this.circularProgressBar.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
AndroidLogger.log(5,"onClick","circularProgressBar onClick executed!!");
Toast.makeText(context,"cancel clicked",Toast.LENGTH_LONG).show();
cancelDownload = true;
}
});
downloadVoicemail.enqueue(new Callback<ResponseBody>() {
@Override
public void onResponse(Call<ResponseBody> call, Response<ResponseBody> response) {
boolean downloadResult = writeResponseBodyToDisk(response.body(),vmFileSize,filePath);
if(downloadResult) {
Toast.makeText(context, "File downloaded", Toast.LENGTH_SHORT).show();
updateVoiceMailFilePath(position, filePath);
updateViews(position);
}else {
deleteVoiceMailFileFromLocalSystem(filePath);
updateViews(position);
}
}
@Override
public void onFailure(Call<ResponseBody> call, Throwable t) {
}
});
}
private boolean writeResponseBodyToDisk( ResponseBody body, String fileSize, String filePath) {
try {
InputStream inputStream = null;
OutputStream outputStream = null;
try {
byte[] fileReader = new byte[8192];
//long fileSize = body.contentLength();
long fileSizeDownloaded = 0;
long lengthOfFile = Long.parseLong( String.format( "%.0f",Double.parseDouble(fileSize )) ) * 1024;
AndroidLogger.log(5,TAG,"filesize"+fileSize + "length of file"+lengthOfFile);
inputStream = body.byteStream();
outputStream = new FileOutputStream(filePath);
while (true) {
int read = inputStream.read(fileReader);
if(cancelDownload){
inputStream.close();
return false;
}
if (read == -1) {
AndroidLogger.log(5,TAG,"-1 value so break");
break;
}
outputStream.write(fileReader, 0, read);
fileSizeDownloaded += read;
if(lengthOfFile >0) {
AndroidLogger.log(5,TAG,"FileSize downloaded"+ fileSizeDownloaded);
int progress = (int) (fileSizeDownloaded * 100 / lengthOfFile);
AndroidLogger.log(5,TAG,"Length of file"+ lengthOfFile);
AndroidLogger.log(5,TAG,"Progress"+ progress);
this.circularProgressBar.setProgress(progress);
update(progress);
}
AndroidLogger.log(5,TAG, "file download: " + fileSizeDownloaded + " of " + fileSize);
}
outputStream.flush();
return true;
} catch (IOException e) {
return false;
} finally {
if (inputStream != null) {
inputStream.close();
}
if (outputStream != null) {
outputStream.close();
}
}
} catch (IOException e) {
return false;
}
}
Также я попытался Listener обновить значение, потому что вызов модификации выполняется в каком-то другом потоке. Поэтому для обновления пользовательского интерфейса я использовал прослушиватель, который не помог.
Я использую Retrofit2 для вызовов API. Поэтому для обновления пользовательского интерфейса во всех действиях я использовал прослушиватели интерфейса. Это работает идеально для всех видов деятельности. Но когда я попробовал то же самое в классе адаптера RecyclerView, я не смог обновить индикатор выполнения. Перед вызовом API я установил индикатор выполнения на 0 и максимум на 100.
Нижний корпус работает нормально,
Круговой индикатор выполнения перед вызовом API установлен на ноль
Круглая полоса прогресса после завершения загрузки изменится на галочку
Ниже не работает,
Круглая полоса прогресса с индикацией загрузки
ПРИМЕЧАНИЕ. Я сталкиваюсь с этой проблемой только при использовании Retrofit2 для вызова API. Если бы я использовал обычный HTTPUrlConnection для вызова API внутри Asynctask, то загрузка прогресса работала бы нормально.
Я проверил, происходит ли обновление прогресса в основном потоке или нет по приведенному ниже коду,
if(Looper.myLooper() == Looper.getMainLooper()) {
circularProgressBar.setProgress(progress);
}
Вышеупомянутое, если условие выполнено. Несмотря на то, что индикатор выполнения не обновляется.
Также я пробовал ниже,
Handler mainHandler = new Handler(Looper.getMainLooper());
Runnable myRunnable = new Runnable() {
@Override
public void run() {
AndroidLogger.log(5,TAG,"Running on UI thread");
circularProgressBar.setProgress(progress);
}
};
mainHandler.post(myRunnable);
}
Я поместил это внутри метода writeResponseBodyToDisk внутри цикла while, но он вызывался только два раза, а индикатор выполнения не обновлялся.
Я прокомментировал часть, где загрузка индикатора выполнения изменится на галочку. После этого, когда я попытался загрузить, после завершения загрузки я смог увидеть 100-процентную загрузку на индикаторе выполнения. До прогресса процентное обновление не отражалось.
Пожалуйста, помогите мне решить эту проблему.
Заранее спасибо.