Android消息处理机制()

角色综述(回顾):

   (1)UI thread 通常就是main thread,而Android启动程序时会替它建立一MessageQueue

(2)然需要一Looper对象,管理MessageQueue

(3)可以构造Handler对象push息到Message Queue;或者接收Looper(Message Queue取出)所送息。

(4)线AHandler对象可以传递给别线程,让别线BC等能送来给线A(存于AMessage Queue)

(5)线AMessage Queue息,只有线A的对象可以理。

 

子线程传递消息给主线程

public class Activity2 extends Activity implements OnClickListener{

       Button button = null;

       TextView text = null;

       MyHandler mHandler = null;

       Thread thread ;

       @Override

       protected void onCreate(Bundle savedInstanceState) {

              super.onCreate(savedInstanceState);

              setContentView(R.layout.activity1);        

              button = (Button)findViewById(R.id.btn);

              button.setOnClickListener(this);

              text = (TextView)findViewById(R.id.content);

       }

       public void onClick(View v) {

              switch (v.getId()) {

              case R.id.btn:

                     thread = new MyThread();

                     thread.start();

                     break;

              }            

       }     

       private class MyHandler extends Handler{             

              public MyHandler(Looper looper){

                     super(looper);

              }

              @Override

              public void handleMessage(Message msg) {//处理消息

                     text.setText(msg.obj.toString());

              }            

       }

       private class MyThread extends Thread{

              @Override

              public void run() {

                     Looper curLooper = Looper.myLooper();

                     Looper mainLooper = Looper.getMainLooper();

                     String msg ;

                     if(curLooper==null){

                            mHandler = new MyHandler(mainLooper);

                            msg = "curLooper is null";

                     }else{

                            mHandler = new MyHandler(curLooper);

                            msg = "This is curLooper";

                     }

                     mHandler.removeMessages(0);

                     Message m = mHandler.obtainMessage(1, 1, 1, msg);

                     mHandler.sendMessage(m);

              }            

       }

}

说明:

Android替主线程建立Message Queue。在这个线里并没有建立Message Queue。所以,myLoopernull,而mainLooper指向主线Looper。于是,行到:

mHandler = new MyHandler (mainLooper);

mHandler于主线程。

   mHandler.sendMessage(m);

m息存入到主线程的Message QueuemainLooper看到Message Queue,就会作出处理,于是由主线行到mHandlerhandleMessage()来处息。

下一节将会写一个关于应多线程请求网络数据的例子。

更多相关文章

  1. 类和 Json对象
  2. [android深入学习]android窗口管理机制
  3. android横竖屏备忘
  4. android横竖屏总结
  5. Android架构组件(三)——ViewModel
  6. Android中的Notification的使用
  7. Android(安卓)CTS(兼容性测试)整个流程
  8. Android(安卓)4.2.2原生Launcher修改使之可以运行过程小结
  9. App Inventor for Android(安卓)- 大家都来写Android(安卓)App

随机推荐

  1. Kubernetes Pod水平自动伸缩(HPA)
  2. git常用命令
  3. OpenKruise v0.8.0 版本发布:K8s 社区首个
  4. Linux运维入门教程01-02 (UNIX和Linux操
  5. 冲着这份大数据分析案例,我立马下载该分析
  6. 掌握这8个Java实战小技巧,再也不用为了内
  7. Prometheus警报规则
  8. 厌倦了excel绘制地图的繁琐操作,来看看这
  9. 3种方法,隐藏苹果Mac档案、资料夹
  10. Kubernetes日志系统新贵Loki-Stack