Android 是否正在AsyncTask doInBackground()中更新progressbar?

Android 是否正在AsyncTask doInBackground()中更新progressbar?,android,multithreading,android-asynctask,android-progressbar,Android,Multithreading,Android Asynctask,Android Progressbar,在开始android开发(以及一般的初学者开发)时,我学到的第一件事是UI不应该(在许多情况下不能)由主UI线程之外的任何其他线程更新 我有一个AsyncTask,它正在doInBackground()中移动一堆文件。我有一个progressbar,它向用户表示这一点 更糟糕的是(主要是由于懒惰),我决定在doInBackground()方法/线程中尝试progressBar.setProgress([updated progress]),令我惊讶的是,它工作得很好 然而,这似乎违背了我所学到的

在开始android开发(以及一般的初学者开发)时,我学到的第一件事是UI不应该(在许多情况下不能)由主UI线程之外的任何其他线程更新

我有一个AsyncTask,它正在doInBackground()中移动一堆文件。我有一个progressbar,它向用户表示这一点

更糟糕的是(主要是由于懒惰),我决定在doInBackground()方法/线程中尝试progressBar.setProgress([updated progress]),令我惊讶的是,它工作得很好

然而,这似乎违背了我所学到的惯例。我知道AsyncTask有一个onProgressUpdate()或其他什么,但它让我有点困惑,我不确定是否值得切换,因为当前的实现似乎运行良好

我是否应该在此后台线程中更新progressbar?

能够做到这一点而不会崩溃,因为
setProgress()
在实际刷新视图时调用
refreshProgress()
(线程安全方法)

private synchronized void refreshProgress(int id, int progress, boolean fromUser) {
        if (mUiThreadId == Thread.currentThread().getId()) {
            doRefreshProgress(id, progress, fromUser, true);
        } else {
            if (mRefreshProgressRunnable == null) {
                mRefreshProgressRunnable = new RefreshProgressRunnable();
            }

            final RefreshData rd = RefreshData.obtain(id, progress, fromUser);
            mRefreshData.add(rd);
            if (mAttached && !mRefreshIsPosted) {
                post(mRefreshProgressRunnable);
                mRefreshIsPosted = true;
            }
        }
    }
如果方法调用是一个非UI线程,它会向UI线程发布一个
Runnable
,避免从错误线程异常调用

但是,始终使用UI线程进行与UI相关的调用;Android开发人员可以随时更改实现,视图通常不是线程安全的。

能够做到这一点而不会崩溃,因为
setProgress()
在实际刷新视图时调用
refreshProgress()
(线程安全方法)

private synchronized void refreshProgress(int id, int progress, boolean fromUser) {
        if (mUiThreadId == Thread.currentThread().getId()) {
            doRefreshProgress(id, progress, fromUser, true);
        } else {
            if (mRefreshProgressRunnable == null) {
                mRefreshProgressRunnable = new RefreshProgressRunnable();
            }

            final RefreshData rd = RefreshData.obtain(id, progress, fromUser);
            mRefreshData.add(rd);
            if (mAttached && !mRefreshIsPosted) {
                post(mRefreshProgressRunnable);
                mRefreshIsPosted = true;
            }
        }
    }
如果方法调用是一个非UI线程,它会向UI线程发布一个
Runnable
,避免从错误线程异常调用


但是,始终使用UI线程进行与UI相关的调用;Android开发人员可以随时更改实现,视图通常不是线程安全的。

您不应该修改
ProgressBar
和/或直接从
doInBackground()
内部调用其任何方法,因为Android UI工具包不是线程安全的


相反,从
doInBackground()
内部调用
publishProgress()
,您将在
onProgressUpdate()中的UI线程上收到后续回调
您可以随意修改
ProgressBar

您不应该修改
ProgressBar
和/或直接从
doInBackground()
内部调用其任何方法,因为Android UI工具包不是线程安全的


相反,从
doInBackground()
内部调用
publishProgress()
,您将在
onProgressUpdate()
中的UI线程上收到一个后续回调,在那里您可以随意修改
ProgressBar

您的意思是
publishProgress()
而不是
refreshProgress()
?你是说
publishProgress()
而不是
refreshProgress()