Handle發送消息機制

/**
 *
 handle主要用於線程之間的通信,傳遞消息,數據等;ui線程底層封裝了looper,可以直接new handle,在子線程中使用handle 
 要先調用looper.prepare(),實例完handle,要調用looper.loop(),looper用來不停的循環傳遞消息,messageque攜帶message 
 handle 收發消息,looper相當於傳送帶,messageque相當於貨箱,handle相當於工人。


 在主線程中 使用 handler,子線程像主線程發送消息

 public class MainActivity extends Activity {


 private Button btn1 ;

 private Handler handler = new Handler(){
 //從寫handleMessage方法  處理 工作線程發送過來的消息
 public void handleMessage(Message msg) {
 int str1 = msg.arg1;
 int str2 = msg.arg2;
 String str3 = (String)msg.obj;
 int str4 = msg.what;

 Bundle bundle = msg.getData();

 Log.i("==Tag==", "=Str1="+str1+"=str2="+str2+"=str3="+str3+"=str4="+str4+"==bundle="+bundle.getString("str"));
 };
 };
 @Override protected void onCreate(Bundle savedInstanceState) {
 super.onCreate(savedInstanceState);
 setContentView(R.layout.activity_main);

 btn1 = (Button)findViewById(R.id.btn1);

 btn1.setOnClickListener(new OnClickListener() {

 @Override public void onClick(View v) {
 // TODO Auto-generated method stub
 new Thread(){
 @Override public void run() {
 // TODO Auto-generated method stub
 super.run();

 //Message msg = new Message();//不能new  消耗內存
 Message msg = Message.obtain();
 msg.arg1 = 100;
 msg.arg2 = 200;//傳遞int 類型數據
 msg.obj = "sssss";//傳遞對象類型
 msg.what = 1;//標誌當前信息

 //傳遞一個數據量較大的數據
 Bundle bundle = new Bundle();
 bundle.putString("str", "bundle");
 msg.setData(bundle);
 handler.sendMessage(msg);//發送消息
 }
 }.start();
 }
 });
 }

 }

 在子線程中使用handler,主線程向子線程發送消息,子線程要準備一個looper

 public class MainActivity extends Activity {


 private Handler handler;
 @Override protected void onCreate(Bundle savedInstanceState) {
 super.onCreate(savedInstanceState);
 setContentView(R.layout.activity_main);
 }

 //開啓子線程
 public void start(View v){
 new MyThread().start();
 }


 //主線程向子線程發送數據
 public void send(View v){
 Message msg = Message.obtain();
 msg.what = 100;
 msg.obj = "asdfghjkl";
 handler.sendMessage(msg);

 }


 //自定義工作線程
 public class MyThread extends Thread{
 @Override public void run() {
 // TODO Auto-generated method stub
 super.run();
 Looper.prepare();//創建looper對象
 //接受主線程 發送來的數據
 handler = new Handler(){
 @Override public void handleMessage(Message msg) {
 // TODO Auto-generated method stub
 super.handleMessage(msg);
 int str = msg.what;
 String str1 =(String)msg.obj;
 Log.i("==TAG==", "==str=="+str+"==str1=="+str1);
 }
 };
 Looper.loop();//使用loop而裏的循環  取出數據
 }
 }


 }
 */
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章