首页 > 代码库 > android的handle

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)

 

android的handle