【问题标题】:Android App Progress Bar Won't Update When Using Thread and AsyncTask使用 Thread 和 AsyncTask 时,Android 应用程序进度条不会更新
【发布时间】:2012-08-12 20:02:24
【问题描述】:

我有一个带有类 WifiAudioActivity 的 android 应用程序,它扩展了 Activity 类。

简而言之,当按下应用程序上的按钮时,会运行一个方法,该方法使用进度条显示该方法的进度。

我显示进度条并使用 AsyncTasks 对其进行更新。

问题是,为了获取方法的进度,我让它在另一个线程上运行,所以 AsyncTask 线程上的while循环可以不断更新进度值并显示它在进度条中。但是,当我调用 progessUpdate() 更新进度条时,我在运行的线程上设置方法时,它不会更新进度条,它不会甚至不跳转到 onProgressUpdate() 方法代码。

有趣的是,我可以在打开方法运行线程之前使用虚拟值更新进度。

我认为这是我的线程有问题 - 谁能帮忙?

private ProgressDialog downloadAllDialog;
private ProgressDialog usingDialog;

private int totalDownloadSize;

private Download downloadAll;

private int totalBlocksLeft;

private boolean downloadComplete;
private boolean downloadFailed;

public void downloadAllClick(View view)     //When the download all button is clicked
{
    new PerformTask().execute();
}

private class PerformTask extends AsyncTask<Void, Integer, Integer> 
{
    protected void onPreExecute()
    {
        showDialog();
    }

    protected Integer doInBackground(Void... voi) 
    {
        int retryCount = 0;

        downloadComplete = false;   //Assume the download is not complete
        downloadFailed = false;

        totalBlocksLeft = 0;

        progressUpdater.run();       //Running method thread

        publishProgress(20);     //THIS DOES NOT WORK

        while ((retryCount < Consts.RETRY_TOTAL) && (!(downloadComplete)))
        {
            int blocksDownloaded = 0;

            while ((downloadComplete == false) && (downloadFailed == false))   
            {
                 blocksDownloaded = totalDownloadSize - downloadAll.getTotalBlocksLeft();    //GOT FROM THE RUNNING THREAD METHOD

                 publishProgress(blocksDownloaded);   //DOES NOT WORK
            }  

            ...
        }

        return totalBlocksLeft ;
    }

    Thread progressUpdater = new Thread()
    {
        @Override
        public void run() 
        {
            downloadComplete = downloadAll.downloadAudio(totalBlocksLeft);  //Download the audio

            if (!(downloadComplete))
            {
                downloadFailed = true;
            }
        }
    };

    protected void onProgressUpdate(Integer... progress) 
    {
        usingDialog.setProgress(progress[0]);
    }

    protected void onPostExecute(Integer result) 
    {
        removeDialog();
    }
}

protected Dialog onCreateDialog() 
{   
    downloadAllDialog = new ProgressDialog(this);

    downloadAllDialog.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL);

    downloadAllDialog.setMax(totalDownloadSize);

    downloadAllDialog.setProgress(0);

    downloadAllDialog.setMessage("Download All");

    usingDialog = downloadAllDialog;

return downloadAllDialog;
}

}

就目前而言,在代码的关键位中:

blocksDownloaded = totalDownloadSize - downloadAll.getTotalBlocksLeft();    //GOT FROM THE RUNNING THREAD METHOD

publishProgress(blocksDownloaded);   //DOES NOT WORK

blocksDownloaded,它从线程运行方法中获取其更新值,随着进度更新。我确信这在技术上是不正确的,但是在 AsyncTask 中拥有线程确实会运行该方法,同时在 main 方法中获取进度更新。因此,只有进度条的更新不起作用。

【问题讨论】:

  • 你根本不需要线程,你的方法是错误的,首先你在AsyncTask的doInBackground中做r​​unOnUIThread这是错误的,你应该只在runOnUIThread中做UI相关的东西。然后您不需要 progressUpdater 线程,因为 AsyncTask 本身就是一个最佳线程。尝试重构并使代码可读,以便有人可以帮助您。
  • 您会注意到,您告诉我要解决的问题正是我的问题——我不知道该怎么做。如果方法不在单独的线程上运行,getTotalBlocks() 方法将不会获取新值。

标签: java android multithreading android-asynctask progress-bar


【解决方案1】:

您似乎没有正确使用 AsyncTask。您似乎正在 UI 线程上调用下载代码,这可能会阻止进度条更新。

我可以提出以下建议。这将确保您正确使用 AsyncTask。当您正确使用 AsyncTask 时,代码也应该得到很多简化。

  1. 不要创建任何线程,也不要使用 runOnUIThread 方法。 AsyncTask 为您提供在适当线程上运行的回调方法。
  2. 主要下载代码应该在doInBackground方法中。
  3. 您应该在下载代码中的某个位置调用 publishProgress。

【讨论】:

  • 感谢您的建议,但是将下载代码放在 doInBackground 方法中并不可行,因为它分布在 4 个类中,是一个绝对庞大的方法。我已经删除了 runOnUIThread,但我仍然不知道如何同时下载和更新进度条。
  • 如果您希望在单独的线程上运行下载,您应该调用 progressUpdater.start() 而不是 progressUpdater.run()
  • 非常感谢!不完全确定原因,但已经解决了!
  • 好吧,调用run方法根本没有启动一个新线程。下载在 AsyncTask 后台线程上运行。因此,在下载完成之前不会调用 publishProgress。
【解决方案2】:

你需要打电话

progressUpdater.start(); 

而不是

progressUpdater.run(); 

【讨论】:

    猜你喜欢
    • 2012-08-18
    • 2019-01-08
    • 2018-09-20
    • 1970-01-01
    • 1970-01-01
    • 2017-08-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多