我想在子线程中创建一个handler
MainActivity:
private static String TAG = MainActivity.class.getName();
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
findViewById(R.id.button1).setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
new Thread(){
public void run() {
new HandlerTest().sendHandler();
};
}.start();
}
});
}
这个acitivy点击按钮然后调用handlerTest中的方法
public class HandlerTest {
private static String TAG=HandlerTest.class.getName();
Handler mHandler = new Handler(){
@Override
public void handleMessage(Message msg) {
super.handleMessage(msg);
Log.e(TAG,"handleMessage~~~~");
}
};
public void sendHandler(){
Log.e(TAG,"sendHandler~~~~");
mHandler.sendEmptyMessage(1);
}
}
好,现在我已经在子线程中写好了代码,然后运行结果出现了下面的问题:
我们没有准备looper.prepare,于是将代码改进为:
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
findViewById(R.id.button1).setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
new Thread(){
public void run() {
Looper.prepare();
Log.e(TAG, "Looper.prepare()~~~~");
new HandlerTest().sendHandler();
};
}.start();
}
});
}
在一次去查看log,这一次发现并没有报错
但是你会发现他发送了消息,但是handler并没有成功接收到。这是为什么了,因为这样做仅仅是搭建好了looper,但是并没有开启loop的消息循环。
于是再一次的改进代码:
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
findViewById(R.id.button1).setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
new Thread(){
public void run() {
Looper.prepare();
Log.e(TAG, "Looper.prepare()~~~~");
new HandlerTest().sendHandler();
Looper.loop();
};
}.start();
}
});
}
查看log:
ok,这一次成功了,这样我们就大功告成了。有人会问为什么我们在主线程上面写不需要自己搭建了,你可以去看看源码,其实在main主函数中已经为我们初始化过了。
下面引用老罗的文章的一段话:
在Android应用程序进程启动过程的源代码分析一文中,我们分析了Android应用程序进程的启动过程,Android应用程序进程在启动的时候,会在进程中加载ActivityThread类,并且执行这个类的main函数,应用程序的消息循环过程就是在这个main函数里面实现的,我们来看看这个函数的实现,它定义在frameworks/base/core/java/android/app/ActivityThread.java文件中:
public final class ActivityThread {
......
public static final void main(String[] args) {
......
Looper.prepareMainLooper();
......
ActivityThread thread = new ActivityThread();
thread.attach(false);
......
Looper.loop();
......
thread.detach();
......
}
}
欢迎吐槽。