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 voidhandleMessage(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                         CreateDatabaseHelpercdh = 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 = newBundle();

 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 = newMessage();

 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(BundlesavedInstanceState) {

 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开发完可以做一个全面的检测:www.ineice.com

你可能感兴趣的:(Android线程---UI线程和非UI线程之间通信)