zoukankan      html  css  js  c++  java
  • android的handle

      Handler的定义:  用来接收子线程发送过来的数据,并利用该数据直接更新主线程的UI。

         安卓中,一个应用启动时会开启一个主线程(UI线程),他的责任是负责管理界面中的控件。比如当你点击一个Button,UI线程就会分发一个事件到该Button上,相应你的操作。如果你的操作时比较耗时的,比如联网操作,在服务器响应之前,程序主线程是阻塞的,反应到用户体验上是卡住了。如果超过5秒,安卓系统就会弹出“强制关闭”,怎么办呢?

        在响应操作中,开启一个新线程,这时耗时的操作在新线程中进行,主线程也就是界面依然可以操作。问题解决了, 但是还有个问题,如果子线程的操作完成后,获得了数据怎么更新界面UI呢,直接更新?Android主线程是线程不安全的(更新Ui必须在主线程中更新),子线程是不可以的。

        这个时候 就救世主来了。Handler。。

    Handler运行在主线程中(UI线程中),它与子线程可以通过Message对象来传递数据,这个时候,Handler就承担着接受子线程传过来的(子线程用sedMessage()方法传弟)Message对象,(里面包含数据)  , 把这些消息放入主线程队列中,配合主线程进行更新UI。

    handler可以分发Message对象和Runnable对象到主线程中, 每个Handler实例,都会绑定到创建他的线程中(一般是位于主线程)

            handler可以分发Message对象和Runnable对象到主线程中, 每个Handler实例,都会绑定到创建他的线程中(一般是位于主线程), 
            它有两个作用: (1):  安排消息或Runnable 在某个主线程中某个地方执行, (2)安排一个动作在不同的线程中执行 
            Handler中分发消息的一些方法 
            post(Runnable) 
            postAtTime(Runnable,long) 
            postDelayed(Runnable long) 
            sendEmptyMessage(int) 
            sendMessage(Message) 
            sendMessageAtTime(Message,long) 
            sendMessageDelayed(Message,long) 
            以上post类方法允许你排列一个Runnable对象到主线程队列中

    public class MyHandlerActivity extends Activity {
         Button button;
         MyHandler myHandler;
      
         protected void onCreate(Bundle savedInstanceState) {
             super.onCreate(savedInstanceState);
             setContentView(R.layout.handlertest);
      
             button = (Button) findViewById(R.id.button);
             myHandler = new MyHandler();
             // 当创建一个新的Handler实例时, 它会绑定到当前线程和消息的队列中,开始分发数据
             // Handler有两个作用, (1) : 定时执行Message和Runnalbe 对象
             // (2): 让一个动作,在不同的线程中执行.
      
             // 它安排消息,用以下方法
             // post(Runnable)
             // postAtTime(Runnable,long)
             // postDelayed(Runnable,long)
             // sendEmptyMessage(int)
             // sendMessage(Message);
             // sendMessageAtTime(Message,long)
             // sendMessageDelayed(Message,long)
            
             // 以上方法以 post开头的允许你处理Runnable对象
             //sendMessage()允许你处理Message对象(Message里可以包含数据,)
      
             MyThread m = new MyThread();
             new Thread(m).start();
         }
      
         /**
         * 接受消息,处理消息 ,此Handler会与当前主线程一块运行
         * */
      
         class MyHandler extends Handler {
             public MyHandler() {
             }
      
             public MyHandler(Looper L) {
                 super(L);
             }
      
             // 子类必须重写此方法,接受数据
             @Override
             public void handleMessage(Message msg) {
                 // TODO Auto-generated method stub
                 Log.d("MyHandler", "handleMessage......");
                 super.handleMessage(msg);
                 // 此处可以更新UI
                 Bundle b = msg.getData();
                 String color = b.getString("color");
                 MyHandlerActivity.this.button.append(color);
      
             }
         }
      
         class MyThread implements Runnable {
             public void run() {
      
                 try {
                     Thread.sleep(10000);
                 } catch (InterruptedException e) {
                     // TODO Auto-generated catch block
                     e.printStackTrace();
                 }
      
                 Log.d("thread.......", "mThread........");
                 Message msg = new Message();
                 Bundle b = new Bundle();// 存放数据
                 b.putString("color", "我的");
                 msg.setData(b);
      
                 MyHandlerActivity.this.myHandler.sendMessage(msg); // 向Handler发送消息,更新UI
      
             }
         }
    View Code

    http://www.cnblogs.com/tt_mc/archive/2012/01/30/2331876.html

    http://www.open-open.com/lib/view/open1335967054421.html

    http://www.cnblogs.com/bastard/archive/2012/06/08/2541944.html

    http://www.cnblogs.com/lijunamneg/p/3573093.html

       Handle   ,    Runnable    ,  Thread  ,消息队列(messageQueue)

  • 相关阅读:
    Python+Apache环境搭建
    离线Python环境搭建
    Docker+Nginx+Vue部署
    Docker部署Flask
    Web服务器根据url参数代理
    javaweb各种框架组合案例(五):springboot+mybatis+generator
    javaweb各种框架组合案例(四):maven+spring+springMVC+spring data jpa(hibernate)【失败案例】
    在无界面centos7上部署MYSQL5.7数据库
    关于通过ip或者域名直接访问工程的问题
    在无界面centos7上部署jdk和tomcat
  • 原文地址:https://www.cnblogs.com/zey23/p/4201348.html
Copyright © 2011-2022 走看看