为什么后台线程会产生自己的Handler& Looper只是为了修改UI的组件。我用简单的术语知道:
Looper:在消息队列中循环并执行任务
处理程序:将任务发布到队列
看看我从互联网上的文章中获取的这个片段
public class MyActivityV2 extends Activity {
private Handler mUiHandler = new Handler();
private MyWorkerThread mWorkerThread;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mWorkerThread = new MyWorkerThread("myWorkerThread");
Runnable task = new Runnable() {
@Override
public void run() {
for (int i = 0; i < 4; i++) {
try {
TimeUnit.SECONDS.sleep(2);
} catch (InterruptedException e) {
e.printStackTrace();
}
if (i == 2) {
mUiHandler.post(new Runnable() {
@Override
public void run() {
Toast.makeText(MyActivityV2.this,
"I am at the middle of background task",
Toast.LENGTH_LONG)
.show();
}
});
}
}
mUiHandler.post(new Runnable() {
@Override
public void run() {
Toast.makeText(MyActivityV2.this,
"Background task is completed",
Toast.LENGTH_LONG)
.show();
}
});
}
};
// MyWorkerThread == HandlerThread
mWorkerThread.start();
mWorkerThread.prepareHandler();
// 2 starting of thread
mWorkerThread.postTask(task);
mWorkerThread.postTask(task);
}
@Override
protected void onDestroy() {
mWorkerThread.quit();
super.onDestroy();
}
}
//MyWorkerThread.java
class MyWorkerThread extends HandlerThread {
private Handler mWorkerHandler;
public MyWorkerThread(String name) {
super(name);
}
public void postTask(Runnable task){
mWorkerHandler.post(task);
}
public void prepareHandler(){
mWorkerHandler = new Handler(getLooper());
}
}
要么我完全误解了Android中的代码或缺乏线程基础。所以我很抱歉。
后台线程基本上重复(两次)。主要思想是通过后台线程操纵UI组件。
看看这个:
mWorkerHandler
为什么后台线程会创建自己的处理程序,如果它是操作UI组件的问题,为什么它只是引用UI线程处理程序并通过处理程序发布runnable。
和
mWorkerHandler = new Handler(getLooper());
创建自己的looper(后台线程的looper),表示后台线程创建自己的Message Queue。不应该只是玩主线程的消息队列而不是后台线程。
提前致谢。
答案 0 :(得分:0)
我无法在互联网上保证随机文章,但此代码正确使用处理程序。
这一行创建了一个在UI线程上运行代码的处理程序:
private Handler mUiHandler = new Handler();
此方法创建一个在后台线程中运行代码的处理程序:
public void prepareHandler(){
mWorkerHandler = new Handler(getLooper());
}
这些行将Runnable发布到后台线程:
mWorkerThread.postTask(task);
mWorkerThread.postTask(task);
因此简而言之,后台线程会使用looper和处理程序,原因与UI线程使用它们相同:因此其他线程上的代码可以将消息和runnable发布到它。