Android线程与消息处理

一、实现多线程

1.创建线程
(1)通过Thread创建线程

Thread thread = new Thread(new Runnable(){
    @Override
    public void run() {
        // TODO Auto-generated method stub
    }
});

(2)通过实现Runnable()接口创建线程

public class MainActivity extends Activity implements Runnable{
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);

    @Override
    public void run() {
        // TODO Auto-generated method stub

    }
}

2.线程的开启

thread.start();

3.线程的休眠

Thread.sleep(1000);//休眠1秒

4.中断线程

public class MainActivity extends Activity implements Runnable{

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

        LooperThread thread = new LooperThread();
        thread.start();
        thread.interrupt();
    }

        @Override
    public void run() {
        // TODO Auto-generated method stub
        while(!Thread.currentThread().isInterrupted()){
            // do something
        }
    }
}

二、Handler消息传递机制

前面介绍了现成的用法,不过不能在新建的子线程中对UI进行修改。如果要操作,会报错Only the original thread that created a view hierarchy can touch its views。为此,Android引入Handler消息传递机制,来实现在线程中操作UI界面。

1.循环者(Looper)简介
在Android中,一个线程对应一个Looper对象,一个Looper对象对应一个MessageQueue(消息队列)。MessageQueue用于存放message。在MessageQueue中,存放的消息按照FIFO原则执行。

Looper对象用来为线程开启一个消息循环,从而操作MessageQueue。默认情况下,系统自动为主线程创建Looper对象,开启消息循环。所以,在主线程中用下面的代码创建Handler对象不会出错,而在非主线程中则会报错。

Handler handler = new Handler();

如果想在非主线程中创建Handler对象,必须用到Looper:

public class LooperThread extends Thread {
    public Handler h;

    @Override
    public void run() {
        // TODO Auto-generated method stub
        super.run();

        Looper.prepare();           //

        h = new Handler(){
            @Override
            public void handleMessage(Message msg) {
                // TODO Auto-generated method stub
                Log.i("Looper", String.valueOf(msg.what));
            }
        };
        Message m = h.obtainMessage();
        m.what = 0x11;
        h.sendMessage(m);

        Looper.loop();
    }
}

2.消息处理类(Handler)简介

Handler主要有以下两个作用:
(1)将Message或Runnable应用post()或sendMessage()方法发送到MessageQueue中,发送时可以指定延迟时间或者绑定的Bundle数据。当MessageQueue循环到该Message时,调用handlerMessage()方法对其处理。

扫描二维码关注公众号,回复: 5927867 查看本文章

(2)在子线程与主线程进行通信,也就是在工作线程中与UI进行通信

3.消息类(Message)简介
Message具有如下5个属性

1.arg1 int 用来存放整型数据
2.arg2 int 用来存放整型数据
3.obj Object用来存放发送给接收器的Object类型的任意对象
4.replyTo Messenger用来指定该Message该发往何处
5.what int 用户自定义消息代码
在使用时,需要注意以下3点:

1.通常使用Message.obtain()或Handler.obtainMessage()获取空消息对象,以节省资源
2.如果一个Message只需要携带简单的int信息,优先使用arg1和arg2来传递,这比Bundle节省内存
3.尽可能用Message.what来标识信息

猜你喜欢

转载自blog.51cto.com/14284753/2380429