Android 是否正在AsyncTask doInBackground()中更新progressbar?
在开始android开发(以及一般的初学者开发)时,我学到的第一件事是UI不应该(在许多情况下不能)由主UI线程之外的任何其他线程更新 我有一个AsyncTask,它正在doInBackground()中移动一堆文件。我有一个progressbar,它向用户表示这一点 更糟糕的是(主要是由于懒惰),我决定在doInBackground()方法/线程中尝试progressBar.setProgress([updated progress]),令我惊讶的是,它工作得很好 然而,这似乎违背了我所学到的惯例。我知道AsyncTask有一个onProgressUpdate()或其他什么,但它让我有点困惑,我不确定是否值得切换,因为当前的实现似乎运行良好 我是否应该在此后台线程中更新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]),令我惊讶的是,它工作得很好 然而,这似乎违背了我所学到的
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()
?