gpt4 book ai didi

android - 在 AsyncTask doInBackground() 中更新进度条?

转载 作者:搜寻专家 更新时间:2023-11-01 08:02:57 24 4
gpt4 key购买 nike

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

我有一个 AsyncTask 正在其 doInBackground() 中移动一堆文件。我有一个向用户表示的进度条。

为了它(主要是由于懒惰),我决定在 doInBackground() 方法/线程中尝试 progressBar.setProgress([updated progress]),令我惊讶的是,它工作正常。

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

我不应该在这个后台线程中更新进度条吗?

最佳答案

ProgressBar 能够在不崩溃的情况下执行此操作,因为 setProgress()电话 refreshProgress() (一种线程安全的方法),当实际刷新 View 时。

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;
}
}
}

它发布了一个 Runnable如果方法调用是一个非 UI 线程,则转到 UI 线程,避免 CalledFromWrongThreadException

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

关于android - 在 AsyncTask doInBackground() 中更新进度条?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18453152/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com