在listview中更新android进度条的进度

时间:2014-11-26 11:59:24

标签: android android-listview android-asynctask android-progressbar android-download-manager

我正在使用android下载管理器下载文件。文件是多个,我在listview中显示它们的进度。我的代码工作正常但是当我的下载量超过4或5时,listview变得非常慢,事实上整个应用程序变慢了。在一瞬间它被卡住了,我要强行关闭,因为手机也被绞死了。 这是我更新listview的代码。

private class UpdaterAsyncTask extends AsyncTask<Void, Void, Void> {

    boolean isRunning = true;
    boolean progressBusy = false;
    public void stop() {
        isRunning = false;
    }

    @Override
    protected Void doInBackground(Void... params) {
        while (isRunning) {


            if(progressBusy==true){

            }
            else{
                progressBusy = true;
                publishProgress();
            }
            try {
                Thread.sleep(200);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }

        return null;
    }

    @Override
    protected void onProgressUpdate(Void... params) {
        super.onProgressUpdate();
        try {
            progressBusy = false;
            if (mScrollState == OnScrollListener.SCROLL_STATE_IDLE) {
                int start = Lv_DownloadItems.getFirstVisiblePosition();
                for (int i = start, j = Lv_DownloadItems
                        .getLastVisiblePosition(); i <= j; i++) {
                    View view = Lv_DownloadItems.getChildAt(i - start);
                    DownloadManager.Query q = new DownloadManager.Query();
                    q.setFilterById(Long.parseLong(progress_ids
                            .get(i)));
                    final Cursor cursor = downloadManager.query(q);
                    cursor.moveToFirst();

                    long bytes_downloaded = cursor
                            .getInt(cursor
                                    .getColumnIndex(DownloadManager.COLUMN_BYTES_DOWNLOADED_SO_FAR));
                    int bytes_total = cursor
                            .getInt(cursor
                                    .getColumnIndex(DownloadManager.COLUMN_TOTAL_SIZE_BYTES));

                    int len1 = (int)(bytes_downloaded * 100 / bytes_total);

                    int columnIndex = cursor
                            .getColumnIndex(DownloadManager.COLUMN_STATUS);

                    ProgressBar progress = (ProgressBar) view
                            .findViewById(R.id.progressBar1);
                    progress.setProgress(len1);

                    TextView txtStatus = (TextView) view
                            .findViewById(R.id.percentage);
                    // txtStatus.setPadding(10, 0, 0, 0);
                    txtStatus.setText(String.valueOf(len1) + "%");
                    cursor.close();


                }
            }

        } catch (Exception ec) {
            ec.printStackTrace();
        }

    }
}

我在onResume上调用了这个异步任务

UpdaterAsyncTask mUpdater = new UpdaterAsyncTask();
            mUpdater.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR,
                    (Void) null);

我完全陷入困境,不知道我哪里错了,请帮助我。任何帮助将非常感激。谢谢你:))

2 个答案:

答案 0 :(得分:0)

Thread.sleep(16);。 16毫秒?那很短。 onProgressUpdate将花费更多的时间。但更重要的是:如果你经常调用publishProgress(),它们都会堆叠起来,因为onProgressUpdate只有在OS有时间在UI线程上执行时才会被调用。通过一些调整,您可以阻止早期调用publishProgress()。添加到asynctask a volatile boolean progressBusy = false;在调用publishProgress()之前将其设置为true。在onProgressUpdate中再次将其设置为false。在doInBackground中,如果progressBusy为true,则不调用publishProgress()。

答案 1 :(得分:0)

从我为您提供的小代码中可以看出,

首先,对于大多数人来说,你不是在调用你的stop()方法,所以我假设你被锁定在一个无限循环中。

 public void stop() {
        isRunning = false;
    }

Google's Android Developer Documentation site上,他们有一个关于如何正确有效地使用AsyncTask类的优秀示例。

希望它有所帮助。