异步TaskUI更新

时间:2012-07-23 03:24:10

标签: java android multithreading download android-asynctask

我有一个文件下载应用程序,我需要使用Asnc Task方法更新进度 对话框和通知栏将同时显示进度,就像Google Play中的示例

一样

当我运行该方法时,Notification Bar显示极慢的响应。 在ONProgressUpdate中,我只更新了两个UI进度而没有同步化。

当我使用线程休眠来减慢进程时,它运行顺利,但下载速度非常低。

我们如何确保两个UI线程平稳运行,同时保持可接受的快速下载速度?

这是代码

请回答:)

@Override
protected void onProgressUpdate(Integer... values) {
    if (values.length>0) {
        //Log.d("Download Activity", "progressUpdate:"+values[0]);
        if (values[0] < 0) {
            this.cancel(true);
            showNetworkErrorDialog();
        } else {
            //size += values[0];
            //Log.d("Download Activity", "download size:"+size);
            //downloadedGoodListSize += values[0];
            //downloadProgressBar.incrementProgressBy(values[0]);
            setCurrentProgress(values[0]);
            downloadProgressBar.setProgress(values[0]);
            double currentProg = downloadProgressBar.getProgress()*1.0/downloadProgressBar.getMax()*100;
            //progressTextView.setText( decimalFormat.format(downloadedGoodListSize*1.0/downloadProgressBar.getMax()*100.0)+"%");
            progressTextView.setText(decimalFormat.format(downloadProgressBar.getProgress()*1.0/downloadProgressBar.getMax()*100)+"%");


            notification.contentView.setProgressBar(R.id.pb, 100, (int)currentProg, false);

            nm.notify(notificationID, notification);

        }
    }
}

@Override
protected void onPostExecute(Boolean result) {
    Log.i("Download Activity", "onPostExecute: starting");
    downloadProgressBar.setProgress(downloadProgressBar.getMax());
    progressTextView.setText(100+"%");
    wheelProgressBar.setVisibility(View.GONE);
    downloadingTextView.setText(getFinishedText());

   notification.contentView.setProgressBar(R.id.pb, 100, 100, false);
   nm.notify(notificationID, notification);
   nm.cancelAll();

    Log.i("Download Activity", "onPostExecute: set interface ok");
    finishDialog.show();

}

2 个答案:

答案 0 :(得分:1)

您正在更新通知栏,因此响应缓慢。在2-3秒内更新一次,你会没事的。

答案 1 :(得分:0)

以下是我的代码

@Override
    protected void onProgressUpdate(Integer... values) {
        if (values.length>0) {
            //Log.d("Download Activity", "progressUpdate:"+values[0]);
            if (values[0] < 0) {
                this.cancel(true);
                showNetworkErrorDialog();
            } else {
                //size += values[0];
                //Log.d("Download Activity", "download size:"+size);
                //downloadedGoodListSize += values[0];
                //downloadProgressBar.incrementProgressBy(values[0]);
                setCurrentProgress(values[0]);
                downloadProgressBar.setProgress(values[0]);
                double currentProg = downloadProgressBar.getProgress()*1.0/downloadProgressBar.getMax()*100;
                //progressTextView.setText( decimalFormat.format(downloadedGoodListSize*1.0/downloadProgressBar.getMax()*100.0)+"%");
                progressTextView.setText(decimalFormat.format(downloadProgressBar.getProgress()*1.0/downloadProgressBar.getMax()*100)+"%");


                notification.contentView.setProgressBar(R.id.pb, 100, (int)currentProg, false);

                nm.notify(notificationID, notification);

            }
        }
    }

@Override
    protected void onPostExecute(Boolean result) {
        Log.i("Download Activity", "onPostExecute: starting");
        downloadProgressBar.setProgress(downloadProgressBar.getMax());
        progressTextView.setText(100+"%");
        wheelProgressBar.setVisibility(View.GONE);
        downloadingTextView.setText(getFinishedText());

       notification.contentView.setProgressBar(R.id.pb, 100, 100, false);
       nm.notify(notificationID, notification);
       nm.cancelAll();

        Log.i("Download Activity", "onPostExecute: set interface ok");
        finishDialog.show();

    }