为什么后台线程会生成自己的 Handler 和 Looper
Why would a background thread spawn its own Handler & Looper
为什么后台线程会产生自己的 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 线程处理程序并发布可运行的通过处理程序。
和
mWorkerHandler = new Handler(getLooper());
which is creating its own looper(background thread's looper),说明后台线程在创建自己的Message Queue。难道不应该只是玩弄主线程的消息队列而不是后台线程吗?
提前致谢。
我不能保证 Internet 上的随机文章,但这段代码正确使用了处理程序。
这一行创建了一个在 UI 线程上运行代码的处理程序:
private Handler mUiHandler = new Handler();
此方法创建一个在后台线程中运行代码的处理程序:
public void prepareHandler(){
mWorkerHandler = new Handler(getLooper());
}
这些行post后台线程的Runnable:
mWorkerThread.postTask(task);
mWorkerThread.postTask(task);
所以简而言之,后台线程会使用循环程序和处理程序,原因与 UI 线程使用它们的原因相同:因此其他线程上的代码可以 post 向它发送消息和可运行程序。
为什么后台线程会产生自己的 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 线程处理程序并发布可运行的通过处理程序。
和
mWorkerHandler = new Handler(getLooper());
which is creating its own looper(background thread's looper),说明后台线程在创建自己的Message Queue。难道不应该只是玩弄主线程的消息队列而不是后台线程吗?
提前致谢。
我不能保证 Internet 上的随机文章,但这段代码正确使用了处理程序。
这一行创建了一个在 UI 线程上运行代码的处理程序:
private Handler mUiHandler = new Handler();
此方法创建一个在后台线程中运行代码的处理程序:
public void prepareHandler(){
mWorkerHandler = new Handler(getLooper());
}
这些行post后台线程的Runnable:
mWorkerThread.postTask(task);
mWorkerThread.postTask(task);
所以简而言之,后台线程会使用循环程序和处理程序,原因与 UI 线程使用它们的原因相同:因此其他线程上的代码可以 post 向它发送消息和可运行程序。