有主线程发送message给子线程

时间:2022-05-16 07:41:46

 

  通常我们在处理耗时任务时候都会通过新建线程来处理,当任务处理完后通过Handler将结果发送回主线程。比如下面示例:

 1 package com.example.testlistener;
 2 
 3 import java.util.Timer;
 4 import java.util.TimerTask;
 5 
 6 import android.app.Activity;
 7 import android.content.res.Configuration;
 8 import android.os.Bundle;
 9 import android.os.Handler;
10 import android.os.Message;
11 import android.view.View;
12 import android.view.View.OnClickListener;
13 import android.view.View.OnLongClickListener;
14 import android.widget.Button;
15 import android.widget.EditText;
16 import android.widget.Toast;
17 
18 public class MainActivity extends Activity {
19     EditText txt;
20     final Handler hander = new Handler(){
21         public void handleMessage(android.os.Message msg) {
22             if(msg.what == 0x1234){
23                 Toast.makeText(MainActivity.this, msg.arg1 + "", 1000).show();
24             }
25         };
26     };
27     @Override
28     protected void onCreate(Bundle savedInstanceState) {
29         super.onCreate(savedInstanceState);
30         setContentView(R.layout.activity_main);
31         
32         new Timer().schedule(new TimerTask() {
33             int i = 0;
34             @Override
35             public void run() {
36                 i++;
37                 Message msg = new Message();
38                 msg.what = 0x1234;
39                 msg.arg1 = i;
40                 hander.sendMessage(msg);
41             }
42         }, 0, 2000);
43     }
44     
45 }

 

  那么,我们能不能通过Handler从主线程发送消息给子线程呢?答案是肯定的,需要用到Looper.prepare()和Looper.loop()。如下面的代码:

 1 public class MainActivity extends Activity {
 2     EditText txt;
 3     Button bt;
 4     TestThread testThread;
 5     int j = 0;
 6     
 7     @Override
 8     protected void onCreate(Bundle savedInstanceState) {
 9         super.onCreate(savedInstanceState);
10         setContentView(R.layout.activity_main);
11         txt = (EditText) findViewById(R.id.txt);
12         bt = (Button) findViewById(R.id.bn);
13         testThread = new TestThread();
14         testThread.start();
15         bt.setOnClickListener(new OnClickListener() {
16             
17             @Override
18             public void onClick(View arg0) {
19                 j++;
20                 Message msg = new Message();
21                 msg.what = 0x1000;
22                 msg.arg1 = j;
23                 testThread.thander.sendMessage(msg);
24             }
25         });
26         
27         
28     }
29     
30     //自定义子线程
31     class TestThread extends Thread{
32         public Handler thander;
33         @Override
34         public void run() {
35             //创建一个Looper对象
36             Looper.prepare();
37             thander = new Handler(){
38                 @Override
39                 public void handleMessage(Message msg) {
40                     if(msg.what == 0x1000){
41                         System.out.println("j = " + msg.arg1);
42                         //txt.setText(msg.arg1 + "");
43                     }
44                 }
45             };
46             //启动Looper
47             Looper.loop();
48         }
49     }
50     
51 }