我想在子线程中创建一个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(); } }); }
但是你会发现他发送了消息,但是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(); ...... } }
欢迎吐槽。
原文:http://blog.csdn.net/linhui9010/article/details/19193243