Not able to publish progress from async task do in

2019-02-27 20:46发布

I want to update dialog's download progress from doInBackground.
I am printing log as well as publishing progress.
Neither of them are working.

It updates the dialog in the end and prints all the log values at once in the end

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();
    }
}

2条回答
戒情不戒烟
2楼-- · 2019-02-27 20:58

remove super from onProgressUpdate and then try

@Override
protected void onProgressUpdate(Void... values) {
    //super.onProgressUpdate(values);
    mProgressDialog.setProgress(progress);
}

if it doesn't work than add a sleep statement in your loop so that this loop will free the processor and give time to publish the progress

try {
    Thread.sleep(200);
} catch (InterruptedException e) {
    e.printStackTrace();
}
查看更多
冷血范
3楼-- · 2019-02-27 20:59

One possible explanation for the behaviour is that reading from remote input stream and writing it into output buffer is extremely fast. I tried the same code but with just a loop running for 10 times.

int total = 0;
while(total <= 100){
    progress = total;
    total += 10;
    publishProgress();
}

Even I could not see the progress dialog at first, so put a Thread.sleep() in the loop and the progress dialog works just fine.

int total = 0;
        while(total <= 100){
            try {
                Thread.sleep(1000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            progress = total;
            total += 10;
            publishProgress();
        }

Try to log the time (System.currentTimeMillis()) at which you are writing into the output buffer.

Hope it helps.

查看更多
登录 后发表回答