Handler和线程是相关联的。 再次强调:不可以在主线程中做耗时操作,就比如示例里面主线程中的 handlerMessage(),不能执行耗时操作。
创建一个与自定义线程相关的Handler的代码: class MyThread extends Thread{ public Handler handler; @Override public void run() { Looper.prepare(); // 创建Looper,默认情况是根据当前线程去拿到Looper handler = new Handler(){ // 与子线程相关的Handler @Override public void handleMessage(Message msg) { System.out.printf("currentThread:"+Thread.currentThread()); // 打印当前线程的id } }; Looper.loop(); // 调用该方法实现对消息的循环处理 } } 要在线程中创建一个 Handler,需要先创建 Looper ,创建的方法很简单:Looper.prepare(); 之后就可以创建 Handler 了。在创建 Handler 之后别忘了调用 Looper.loop(); 这样才能实现对消息的循环处理。 摘自评论区: 推荐博客一篇:http://www.cnblogs.com/codingmyworld/archive/2011/09/14/2174255.html
主线程和子线程之间的交互的实现
本例的思路:
1. 在主线程中创建两个Handler对象 handler 和 handler2(图中是threadHandler),并直接初始化 handler,而handler2 不初始化。
2. 使用 HandlerThread 创建一个子线程 thread ,并启动 thread 。
3. 初始化 handler2(使用 thread 的 getLooper()作为参数),这样一来handler2就是子线程的 Handler 对象。
4. 重写 handler 和 handler2 的 handleMessage()方法,在里面创建Message对象,并使用对方的sendMessageDelayed(message,1000);方法发送消息。
5. 定义一个Button,定义点击事件,由点击事件触发如上交互的操作。
如上操作中,第4点是核心,也就是两个 Handler 各自重写 handleMessage(),方法里面却是使用对方的 sendMessage() 方法。这样就实现了主线程和子线程的相互发送信息。
--------------
摘自评论区,亲测有效:
取消发送,经测试,需要将UIhandler 和 threadhandler中的message的what 设置为1,取消的时候要同时removeMessage(1);
1 public class FourActivity extends Activity implements OnClickListener {
2 private Button button1, button2;
3 // 创建主线程的 Handler
4 private Handler handler = new Handler() {
5 public void handleMessage(android.os.Message msg) {
6 Message message = new Message();
7 System.out.println("----main handler");
8 // 向子线程发送消息
9 threadHandler.sendMessageDelayed(message, 1000);
10 };
11 };
12
13 private Handler threadHandler;
14
15 @Override
16 protected void onCreate(Bundle savedInstanceState) {
17 // TODO Auto-generated method stub
18 super.onCreate(savedInstanceState);
19 setContentView(R.layout.four);
20 button1 = (Button) findViewById(R.id.button1);
21 button2 = (Button) findViewById(R.id.button2);
22 button1.setOnClickListener(this);
23 button2.setOnClickListener(this);
24 HandlerThread thread = new HandlerThread("HandlerThread");
25 thread.start();
26 // 创建子线程的Handler
27 threadHandler = new Handler(thread.getLooper()) {
28 @Override
29 public void handleMessage(Message msg) {
30 // TODO Auto-generated method stub
31 Message message = new Message();
32 System.out.println("----thread handler");
33 // 向主线程发送消息
34 handler.sendMessageDelayed(message, 1000);
35 }
36 };
37 }
38
39 @Override
40 public void onClick(View v) {
41 // TODO Auto-generated method stub
42 switch (v.getId()) {
43 case R.id.button1:
44 handler.sendEmptyMessage(1);
45
46 break;
47 case R.id.button2:
48 handler.removeMessages(1);
49 break;
50 }
51 }
52 }