android ProgressBar ProgressDialog可以在子线程中更新的原理
2012-09-27 14:01
369 查看
无意间在子线程中对ProgressBar 进行了更新,发现应用能正常运行。
我们都知道控件只能在UI线程中进行更新,于是到网上搜啊搜啊,找不到答案,只能到源码中找。
一下是在源码中找到的一些代码,个人感觉应该是这个原理,有错误,请高手改正。
无论是调用ProgressBar的.incrementProgressBy(len)还是setProgress(len)
都是要调用下面这个方法:
private synchronized void refreshProgress(int id, int progress, boolean fromUser) {
if (mUiThreadId == Thread.currentThread().getId()){//是否是UI线程,是的话直接更新
doRefreshProgress(id, progress, fromUser);
} else {//不是调用下面的post(r),r = new RefreshProgressRunnable
RefreshProgressRunnable r;
if (mRefreshProgressRunnable != null) {
// Use cached RefreshProgressRunnable if available
r = mRefreshProgressRunnable;
// Uncache it
mRefreshProgressRunnable = null;
r.setup(id, progress, fromUser);
} else {
// Make a new one
r = new RefreshProgressRunnable(id, progress, fromUser);
}
post(r);
}
}
private class RefreshProgressRunnable implements Runnable {
public void run() {//核心回调的代码
doRefreshProgress(mId, mProgress, mFromUser, true);
// Put ourselves back in the cache when we are done
mRefreshProgressRunnable = this;
}
}
post(r)----->执行到View的
public boolean post(Runnable action) {
Handler handler;
if (mAttachInfo != null) {
handler = mAttachInfo.mHandler;
} else {
// Assume that post will succeed later
ViewRoot.getRunQueue().post(action);
return true;
}
return handler.post(action);
}
AttachInfo是View的一个内部类
void dispatchAttachedToWindow(AttachInfo info, int visibility) {
//System.out.println("Attached! " + this);
mAttachInfo = info;
}
}//这个方法应该是由系统的UI来调用,由系统传入info,处于UI线程。
上面post方法中handler.post(action);就可以更新UI了。
ProgressDialog也能在子线程中更新:
public void incrementProgressBy(int diff) {
if (mProgress != null) {
mProgress.incrementProgressBy(diff);
onProgressChanged();
} else {
mIncrementBy += diff;
}
}
这个mProgress生命在ProgressDialog的53行
private ProgressBar mProgress;
也就是说,ProgressDialog更新UI调用的是ProgressBar来进行更新。
我们都知道控件只能在UI线程中进行更新,于是到网上搜啊搜啊,找不到答案,只能到源码中找。
一下是在源码中找到的一些代码,个人感觉应该是这个原理,有错误,请高手改正。
无论是调用ProgressBar的.incrementProgressBy(len)还是setProgress(len)
都是要调用下面这个方法:
private synchronized void refreshProgress(int id, int progress, boolean fromUser) {
if (mUiThreadId == Thread.currentThread().getId()){//是否是UI线程,是的话直接更新
doRefreshProgress(id, progress, fromUser);
} else {//不是调用下面的post(r),r = new RefreshProgressRunnable
RefreshProgressRunnable r;
if (mRefreshProgressRunnable != null) {
// Use cached RefreshProgressRunnable if available
r = mRefreshProgressRunnable;
// Uncache it
mRefreshProgressRunnable = null;
r.setup(id, progress, fromUser);
} else {
// Make a new one
r = new RefreshProgressRunnable(id, progress, fromUser);
}
post(r);
}
}
private class RefreshProgressRunnable implements Runnable {
public void run() {//核心回调的代码
doRefreshProgress(mId, mProgress, mFromUser, true);
// Put ourselves back in the cache when we are done
mRefreshProgressRunnable = this;
}
}
post(r)----->执行到View的
public boolean post(Runnable action) {
Handler handler;
if (mAttachInfo != null) {
handler = mAttachInfo.mHandler;
} else {
// Assume that post will succeed later
ViewRoot.getRunQueue().post(action);
return true;
}
return handler.post(action);
}
AttachInfo是View的一个内部类
void dispatchAttachedToWindow(AttachInfo info, int visibility) {
//System.out.println("Attached! " + this);
mAttachInfo = info;
}
}//这个方法应该是由系统的UI来调用,由系统传入info,处于UI线程。
上面post方法中handler.post(action);就可以更新UI了。
ProgressDialog也能在子线程中更新:
public void incrementProgressBy(int diff) {
if (mProgress != null) {
mProgress.incrementProgressBy(diff);
onProgressChanged();
} else {
mIncrementBy += diff;
}
}
这个mProgress生命在ProgressDialog的53行
private ProgressBar mProgress;
也就是说,ProgressDialog更新UI调用的是ProgressBar来进行更新。
相关文章推荐
- Android开发之ProgressDialog在独立Thread线程中更新进度
- Android ProgressDialog显示线程处理进度
- Android中子线程更新主线程UI和ProgressBar的应用
- Android开发之ProgressDialog与ProgressBar
- android中子线程可以更新UI,是真的吗?
- ProgressBar 为什么可以在非UI线程中更新进度。
- android 子线程中更新界面?被ProgressBar给迷惑了
- ProgressBar可以在子线程更新UI
- 【边做项目边学Android】知识点:Android控件系列之ProgressDialog与ProgressBar
- Android 非UI线程是否可以更新UI
- android 为什么可以在子线程更新UI
- Android Handler.post 难道真的可以在子线程更新UI???
- Android学习笔记_81_Android ProgressDialog ProgressBar 各种效果
- 使用postInvalidate可以直接在线程中更新界面
- android子线程更新UI
- 深入Android Handler源码,分析主线程、子线程通讯原理
- Android异步处理一:使用Thread+Handler实现非UI线程更新UI界面
- Android实现简洁的APP更新dialog数字进度条
- 子线程更新UI会发生android.view.ViewRoot$CalledFromWrongThreadException异常的解决方法
- Android异步处理一:使用Thread+Handler实现非UI线程更新UI界面