Android Handler的使用

子线程和主线程的通信 Android 4.0以上已经禁止在主Ui线程下联网,当需要进行WebService时必须创建新的线程。可以选择AsynTask或者Thread去实

现,AsynTask本身就是支持直接返回到主线程的,Thread线程则可以搭配Handler来通知主线程。

package org.wp.webservice02;

import android.app.Activity;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.widget.TextView;

public class MainActivity extends Activity {

    private TextView info = null;

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

        info = (TextView) super.findViewById(R.id.info);

        // 创建一个新线程,用外部处理程序初始化,便于将线程的数据送回
        MyThread thread = new MyThread(handler);
        // 开始新线程
        thread.start();
    }

    // handler:处理程序
    Handler handler = new Handler() {

        @Override
        public void handleMessage(Message msg) {
            super.handleMessage(msg);

            // 接收消息里面的包中的String数据
            String string = msg.getData().getString("key");
            // 将线程中的得到的数据显示
            info.setText(string);
        }

    };

    public class MyThread extends Thread {
        private Handler handler = null;

        // 初始化线程
        protected MyThread(Handler handler) {
            this.handler = handler;
        }

        @Override
        // 线程的start()执行时自动调用此函数
        public void run() {
            super.run();

            // …………
            // 执行子线程里实现的功能
            // …………

            // 线程中产生的数据,可以是任何类型的值,此处用String类型作为例子
            String string = "Hello ,new Thread!";
            // 定义消息,之后发送出去
            Message msg = handler.obtainMessage();
            // 定义数据包,数据包里可以put不同类型的数据
            Bundle bundle = new Bundle();
            // 将String数据放入包中
            bundle.putString("key", string);
            // 将包放入消息中
            msg.setData(bundle);
            // 将消息发送出去
            handler.sendMessage(msg);
        }

    }
}

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对象到主线程队列中,        

sendMessage类方法, 允许你安排一个带数据的Message对象到队列中,等待更新.

posted on 2015-06-03 18:08  2015xbx  阅读(273)  评论(0编辑  收藏  举报

导航