这个Message 和Handler 究竟怎么传递消息:
我是这样理解的:
一个Handler 的对象只能给这个Handler传递消息。
一个线程中只有一个Looper 一个Looper管理一个MessageQueue
但是一个 Thread 中有多个Handler 的时候 多个Handler 绑定的是一个 Looper 那怎么解释 同一个 Looper 绑定的MessageQueue 对(好了,迷了,,是Handler的限制)
直接贴代码:
/** * @作者 杨铭; * @时间 2015年6月18日_下午9:50:11; * @联系qq <771365380>\<286384491>; */ package a14.yangming.test_handlermessagelooper; import android.content.Context; import android.os.Handler; import android.os.Message; import android.widget.Toast; public class Handler_Main_Thread extends Handler { private Context context; public Handler_Main_Thread(Context callContext) { this.context = callContext; } @Override public void handleMessage(Message msg) { switch (msg.what) { case 2: System.out.println("收到本类对象的消息"); Toast.makeText(this.context, "收到本类对象的消息", Toast.LENGTH_LONG).show(); break; default: break; } super.handleMessage(msg); } }
</pre><pre name="code" class="java">
/** * @作者 杨铭; * @时间 2015年6月18日_下午7:10:35; * @联系qq <771365380>\<286384491>; */ package a14.yangming.test_handlermessagelooper; import android.os.Handler; import android.os.Message; import android.widget.TextView; public class Handler_MainThread extends Handler { private TextView tv_main; public Handler_MainThread(TextView tv) { this.tv_main = tv; } @Override public void handleMessage(Message msg) { switch (msg.what) { case 1: this.tv_main.setText("主线程收到消息"); break; case 2: this.tv_main.setText(tv_main.getText()+"收到了非本类对象的消息"); break; case 3: break; default: super.handleMessage(msg);//把我们不关心的消息交给系统处理<做法很好> break; } } }
</pre><pre name="code" class="java">
package a14.yangming.test_handlermessagelooper; import android.app.Activity; import android.os.Bundle; import android.os.Message; import android.widget.TextView; public class MainActivity extends Activity { private TextView tv_mainThread; private Handler_MainThread myHandler; private Handler_Main_Thread my_Handler; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); init(); test(); } private void init() { tv_mainThread = (TextView) findViewById(R.id.tv_mainThread); myHandler = new Handler_MainThread(tv_mainThread); my_Handler = new Handler_Main_Thread(this); } private void test() { Message myMessage = Message.obtain();// Google鼓励使用Message.obtain()或Handler.obtainMessage()获取Message对象 myMessage.what = 1; myHandler.sendMessage(myMessage); Message myMessage2 = Message.obtain(); myMessage2.what=2; my_Handler.sendMessage(myMessage2); } }
接下来新开一条线程看看问题是 新开的线程中
加入:
Looper.prepare();
Looper.loop();
这两句话的作用是什么?,先不用它。
新建一个文件
/** * @作者 杨铭; * @时间 2015年6月18日_下午7:27:30; * @联系qq <771365380>\<286384491>; */ package a14.yangming.test_handlermessagelooper; import android.os.Handler; import android.os.Message; public class ThreadFirst extends Thread { /** 调用此线程者的 一个 handler 对象 */ private Handler handler; public ThreadFirst(Handler handler) { this.handler = handler; } @Override public void run() { Message message1 = handler.obtainMessage(); message1.what = 3; handler.sendMessage(message1); } }
对之前的MainActivity 做出修改
private void test() { Message myMessage = Message.obtain();// android鼓励使用Message.obtain()或Handler.obtainMessage()获取Message对象 myMessage.what = 1; myHandler.sendMessage(myMessage); Message myMessage2 = Message.obtain(); myMessage2.what=2; my_Handler.sendMessage(myMessage2); new ThreadFirst(myHandler).start(); }
对Handler_MainThread 做出修改
@Override public void handleMessage(Message msg) { switch (msg.what) { case 1: this.tv_main.setText("主线程收到消息"); break; case 2: this.tv_main.setText(tv_main.getText()+"收到了非本类对象的消息"); break; case 3: this.tv_main.setText(tv_main.getText()+"草泥马"); break; default: super.handleMessage(msg);//把我们不关心的消息交给系统处理<做法很好> break; } }
关于那两句话:是用于自己创建的线程的,从API【Handler Looper Message(一)】 可以知道:自己创建的线程中默认没有Looper
新建文件
/** * @作者 杨铭; * @时间 2015年6月19日_上午8:41:53; * @联系qq <771365380>\<286384491>; */ package a14.yangming.test_handlermessagelooper; import android.os.Handler; import android.os.Message; public class HandlerWithThreadSecond extends Handler { @Override public void handleMessage(Message msg) { switch (msg.what) { case 4: System.out.println("我的 线程中的Handler 收到消息"); break; default: break; } super.handleMessage(msg); } }
</pre><pre name="code" class="java">package a14.yangming.test_handlermessagelooper; import android.os.Looper; import android.os.Message; public class ThreadSecond extends Thread { @Override public void run() { HandlerWithThreadSecond handlerWithThreadSecond = new HandlerWithThreadSecond(); Message message = Message.obtain(); message.what = 4; handlerWithThreadSecond.sendMessage(message); } }
</pre>MainActivity 中 test() 方法 加入 new ThreadSecond().start();<p></p><p></p><p>运行会报错:<span style="color:#ff0000">java.lang.RuntimeException: Can't create handler inside thread that has not called Looper.prepare()</span></p><p>接下来把 </p><pre name="code" class="java">ThreadSecond 修改为:
<pre name="code" class="java">package a14.yangming.test_handlermessagelooper; import android.os.Looper; import android.os.Message; public class ThreadSecond extends Thread { @Override public void run() { Looper.prepare(); HandlerWithThreadSecond handlerWithThreadSecond = new HandlerWithThreadSecond(); Message message = Message.obtain(); message.what = 4; handlerWithThreadSecond.sendMessage(message); Looper.loop(); } }
就可以再线程之间传递消息了——以上都是线程自己给自己发消息:
接下来线程之间传递消息
仅仅实现了自建线程向主线程的消息传送,但是主线程向自建线程的消息传送却因为线程过快的结束了自己的生命而报出空指针错误,希望懂得大侠给出评论啊
自建线程·向主线程传递消息:
package a14.yangming.test_handlermessagelooper; import android.os.Looper; import android.os.Message; public class ThreadSecond extends Thread { @Override public void run() { Looper.prepare(); HandlerWithThreadSecond handlerWithThreadSecond = new HandlerWithThreadSecond(); Message message = Message.obtain(); message.what = 4; handlerWithThreadSecond.sendMessage(message); Looper.loop(); } }
/** * @作者 杨铭; * @时间 2015年6月19日_上午9:27:45; * @联系qq <771365380>\<286384491>; */ package a14.yangming.test_handlermessagelooper; import android.os.Handler; import android.os.Message; public class HandlerWithMain extends Handler { @Override public void handleMessage(Message msg) { switch (msg.what) { case 1: System.out.println("我是服务于主线程的Handler 我收到来自自建线程的消息"); break; default: super.handleMessage(msg); break; } } }
/** * @作者 杨铭; * @时间 2015年6月19日_上午8:41:17; * @联系qq <771365380>\<286384491>; */ package a14.yangming.test_handlermessagelooper; import android.os.Handler; import android.os.Looper; import android.os.Message; public class ThreadSecond extends Thread { /**向主线程发送消息的Handler*/ private Handler mainHandler; /**自己的 Hanlder*/ private HandlerWithThreadSecond threadHandler; public ThreadSecond(Handler yourHandler) { mainHandler = yourHandler; } @Override public void run() { Message mainMessage = Message.obtain(); mainMessage.what=1; mainHandler.sendMessage(mainMessage); // Looper.prepare(); // threadHandler=new HandlerWithThreadSecond(); // Looper.loop(); } // // public HandlerWithThreadSecond getHandler() // { // return this.threadHandler; // } }