Androidの多线程之Handler创建新线程

来源:互联网 发布:查看端口占用linux 编辑:程序博客网 时间:2024/06/05 18:04

两个Handler,一个是主线程的mainHandler,一个是获取HandlerThread的looper的Handler.

mainHandler在新线程发出消息,在主线程处理接受的消息。

looperHandler拥有looper后即可post(Runnable),发起新线程,然后通过mainHandler在新线程里发送消息到主线程的handler。

这里创建两个handler,一个是mainHandler维护主线程的looper,一个是looperHandler拥护HandlerThread的looper。

1.mainHandler处理消息,复写handlerMessage()方法处理消息。

2.looperHandler应通过HandlerThread获取looper来构造,而且HandlerThread必须开启,否则得不到looper。

3.looperHandler来post一个runnable对象,在runnable里复写run()方法,在里面用mainHandler发送方消息。

 

 1 package com.bvin.handler; 2  3 import android.app.Activity; 4 import android.os.Bundle; 5 import android.os.Handler; 6 import android.os.HandlerThread; 7 import android.os.Message; 8 import android.util.Log; 9 import android.view.View;10 import android.widget.Button;11 import android.widget.LinearLayout;12 import android.widget.LinearLayout.LayoutParams;13 import android.widget.TextView;14 15 public class MainActivity extends Activity {16     /** Called when the activity is first created. */17     18     private Handler loopHandler ;19     private Handler mainHandler; 20     private TextView tv;21     @Override22     public void onCreate(Bundle savedInstanceState) {23         super.onCreate(savedInstanceState);24         25         initViews();26         HandlerThread ht = new HandlerThread("handler thread");27         ht.start();//loopHandler的runnable这里先开始le,而mainHandler是点击之后28         loopHandler = new Handler(ht.getLooper());29         mainHandler= new Handler(){30 31             @Override32             public void handleMessage(Message msg) {33                 // TODO Auto-generated method stub34                 super.handleMessage(msg);35                 if(msg.what==2012){36                     37                     tv.setText(msg.getData().getString("s"));38                 }39                 40             }41         };42     }43     44     45     private void initViews(){46         47         LinearLayout layout = new LinearLayout(this);48         layout.setOrientation(LinearLayout.VERTICAL);49         LayoutParams params = new LayoutParams(LayoutParams.FILL_PARENT,LayoutParams.WRAP_CONTENT);50         tv = new TextView(this);51         tv.setText("本来");52         Button bt = new Button(this);53         54         bt.setText("开动");55         bt.setOnClickListener(new View.OnClickListener() {56             57             @Override58             public void onClick(View v) {59                 // TODO Auto-generated method stub60                 mainHandler.post(new Runnable(){61 62                     @Override63                     public void run() {64                         // TODO Auto-generated method stub65                         Log.e("mainHandler所在当前线程", ""+Thread.currentThread().getName());66                         //tv.setText("对不对");67                     }68                 });69                  70                 loopHandler.post(new Runnable(){71 72                     @Override73                     public void run() {74                         // TODO Auto-generated method stub75                         Log.e("loopHandler所在当前线程", ""+Thread.currentThread().getName());76                         Message msg = mainHandler.obtainMessage();77                         msg.what = 2012;78                         Bundle bundle = new Bundle();79                         bundle.putString("s", "从"+Thread.currentThread().getName()+"线程传过来的");80                         msg.setData(bundle);81                         msg.sendToTarget();82                     }83                 });84                 85             }86         });87         layout.addView(bt,params);88         layout.addView(tv,params);89         setContentView(layout);90         91     }92 }