Не удалось опубликовать прогресс в async-задании в фоновом режиме while loop - Android
Я хочу обновить ход загрузки диалога с doInBackground.
Я печатаю журнал, а также публикую прогресс.
Ни один из них не работает.
Он обновляет диалоговое окно в конце и одновременно печатает все значения журнала
private class DownloadEReport extends AsyncTask<String, Void, Void> {
int progress = 0;
protected void onPreExecute() {
mProgressDialog = new ProgressDialog(EReport.this);
mProgressDialog.setTitle("Downloads");
mProgressDialog.setMessage("Downloading, Please Wait!");
mProgressDialog.setIndeterminate(false);
mProgressDialog.setMax(100);
mProgressDialog.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL);
mProgressDialog.setCancelable(false);
mProgressDialog.show();
}
@Override
protected void onProgressUpdate(Void... values) {
super.onProgressUpdate(values);
mProgressDialog.setProgress(progress);
}
@Override
protected Void doInBackground(String... strings) {
String mUrl = strings[0];
String json = "";
int count;
try {
URL url = new URL(mUrl);
URLConnection conection = url.openConnection();
conection.connect();
// getting file length
int lenghtOfFile = conection.getContentLength();
// input stream to read file - with 8k buffer
InputStream input = new BufferedInputStream(url.openStream(), 8192);
// Output stream to write file
OutputStream output = new FileOutputStream("/sdcard/downloadedfile.txt");
byte data[] = new byte[1024];
long total = 0;
while ((count = input.read(data)) != -1) {
total += count;
// writing data to file
output.write(data, 0, count);
// publishing the progress....
// After this onProgressUpdate will be called
Log.e("JSON Download Progress", "" + (int) ((total * 100) / lenghtOfFile));
progress = (int) (total * 100 / lenghtOfFile);
publishProgress();
}
// flushing output
output.flush();
// closing streams
output.close();
input.close();
} catch (Exception e) {
Log.e("Error: ", e.getMessage());
}
return null;
}
@Override
protected void onPostExecute(Void aVoid) {
super.onPostExecute(aVoid);
mProgressDialog.dismiss();
}
}
Ответы
Ответ 1
удалите super из onProgressUpdate, а затем попробуйте
@Override
protected void onProgressUpdate(Void... values) {
//super.onProgressUpdate(values);
mProgressDialog.setProgress(progress);
}
если он не работает, чем добавить оператор sleep в ваш цикл, чтобы этот цикл освободил процессор и дал время для публикации прогресса
try {
Thread.sleep(200);
} catch (InterruptedException e) {
e.printStackTrace();
}
Ответ 2
Одним из возможных объяснений поведения является то, что чтение из удаленного потока ввода и запись его в выходной буфер происходит очень быстро.
Я попробовал один и тот же код, но всего за цикл, который работает в 10 раз.
int total = 0;
while(total <= 100){
progress = total;
total += 10;
publishProgress();
}
Даже я не мог видеть диалог прогресса вначале, поэтому поставьте Thread.sleep() в цикле, и диалог прогресса работает просто отлично.
int total = 0;
while(total <= 100){
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
progress = total;
total += 10;
publishProgress();
}
Попробуйте записать время (System.currentTimeMillis()
), в которое вы записываете в выходной буфер.
Надеюсь, это поможет.