Android攻城狮 Handler与子线程

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 }

 

原文地址:https://www.cnblogs.com/my334420/p/6758675.html