黑马程序员技术交流社区
标题:
Android线程---UI线程和非UI线程之间通信
[打印本页]
作者:
asd19860
时间:
2015-9-7 11:46
标题:
Android线程---UI线程和非UI线程之间通信
当主线程sendMessage后,子线程便会调用handleMessage来获取你所发送的Message。我的主线程向子线程发送消息时携带了数据,子线程根据主线程发送来的数据进行数据库查询,并将查询后的结果返回给该主线程:
1 public class UpdataPeople extends Activity {
2
3 EditText updata_name;
4 EditText updata_phone;
5 EditText updata_address;
6 Button updata_quxiao;
7 Button updata_baocun;
8
9 String name;
10 String phone;
11
12 //创建一个子线程对象
13 UpdataThread updataThread ;
14
15 //定义一个全局变量,该Handler在主线程中重写HandleMessage。
16 //若不定义成为全局变量,则在子线程中无发用到该Handler
17 private Handler mainHandler = null;
18
19 //创建一个非UI线程
20 class UpdataThread extends Thread {
21
22 public Handler mhandler;
23
24 public void run() {
25 Looper.prepare();
26 mhandler = new Handler() {
27
28 //定义处理消息的方法
29 @Override
30 public void handleMessage(Message msg) {
31 //---这里面做一些耗时操作
32 if (msg.what == 0x123) {
33 //获取msg所携带的数据
34 Bundle bundle = msg.getData();
35 if (bundle != null) {
36 String name = bundle.getString("name");
37 String phone = bundle.getString("phone");
38 Toast.makeText(getApplication(), "传值成功" + name + phone, Toast.LENGTH_LONG).show();
39 } else {
40 name = " ";
41 phone = " ";
42 }
43 //创建并连接数据库,若该数据库已经存在,则打开该数据库
44 CreateDatabaseHelper cdh = new CreateDatabaseHelper(getApplication(), "myPeople.db3", 1);
45 //使用游标查询数据库,并返回结果集
46 Cursor cursor = cdh.getReadableDatabase().rawQuery("select * from people where name = ? and phone = ?", new String[]{name, phone});
47 //创建一个Bundle存储查询出来的结果
48 Bundle dataAll = new Bundle();
49 //遍历cursor,并将结果赋值给Bundle
50 while (cursor.moveToNext()) {
51 dataAll.putString("name", cursor.getString(1));
52 dataAll.putString("phone", cursor.getString(2));
53 dataAll.putString("address", cursor.getString(3));
54 }
55 //↓↓↓↓↓↓↓这一块便是子线程将查询的结果返回给主线程↓↓↓↓↓↓↓
56 //创建Message
57 Message msg_main = new Message();
58 msg_main.what = 0x456;
59 //为Message添加数据
60 msg_main.setData(dataAll);
61 //向主线程发送消息
62 mainHandler.sendMessage(msg_main);
63
64 }
65 }
66 };
67 Looper.loop();
68 }
69 }
70
71 @Override
72 protected void onCreate(Bundle savedInstanceState) {
73 super.onCreate(savedInstanceState);
74 //实例化Thread
75 updataThread = new UpdataThread();
76 //启动新线程
77 updataThread.start();
78 setContentView(R.layout.updatapeople);
79 //获取布局文件里的控件
80 updata_name = (EditText) findViewById(R.id.updata_name);
81 updata_phone = (EditText) findViewById(R.id.updata_phone);
82 updata_address = (EditText) findViewById(R.id.updata_address);
83 updata_quxiao = (Button) findViewById(R.id.updata_quxiao);
84 updata_baocun = (Button) findViewById(R.id.updata_baocun);
85
86 //获取启动该Activity的Intent
87 Intent intent = getIntent();
88 //取出Intent所携带的数据包
89 Bundle datas = intent.getExtras();
90 //取出包中所携带的各种数据
91 if (datas != null) {
92 name = datas.getString("name");
93 phone = datas.getString("phone");
94 } else {
95 name = "空";
96 phone = "空";
97 }
98 //↓↓↓↓↓↓↓这一块便是主线程向子线程发送消息↓↓↓↓↓↓↓↓
99 //创建消息
100 Message msg = new Message();
101 //为msg标记一下(类似与--key--)
102 msg.what = 0x123;
103 //创建一个Bundle,并存放数据
104 Bundle bundle = new Bundle();
105 bundle.putString("name", name);
106 bundle.putString("phone", phone);
107 //将数据添加到msg
108 msg.setData(bundle);
109 //向新线程发送消息
110 updataThread.mhandler.sendMessage(msg);
111
112 //接受子线程返回的消息和子线程那边的用法一样
113 mainHandler = new Handler() {
114 @Override
115 public void handleMessage(Message msg_main) {
116 if (msg_main.what == 0x456){
117 //更新UI(因为在UI 线程中可以进行UI的更新。。。)
118 updata_name.setText(msg_main.getData().getString("name"));
119 }
120 }
121 };
另外建议APP开发完可以做一个全面的检测:http://www.ineice.com/
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2