你的位置:首页 > 操作系统

[操作系统]Android线程


    近期自学到了线程这一块,用了一上午的时间终于搞出来了主、子线程间的相互通信。当主线程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     //将数据添加到msg108     msg.setData(bundle);109     //向新线程发送消息110     updataThread.mhandler.sendMessage(msg);111 112     //接受子线程返回的消息和子线程那边的用法一样113     mainHandler = new Handler() {114       @Override115       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     };