发表于: 2017-02-16 23:15:28

1 877


今天完成的事情:线程,异步消息处理

最常用的写法,匿名类的方式:


new Thread(new Runnable() {
    @Override
    public void run() {
        //处理具体的逻辑
    }
}).start();//调用start()方法,run()方法中的代码就会在子线程中执行


耦合低的写法:实现Runnable接口来定义一个线程:

class MyThread implements Runnable{
    @Override
    public void run() {
        //处理具体逻辑
    }
}
MyThread thread = new MyThread();
//Thread构造函数接收一个Runnable参数,把实现了Runnable接口的对象传进去
new Thread(thread).start();


如果在子线程中更新UI会出现异常,必须在主线程中进行;

如果是耗时操作的UI操作,可以通过异步消息处理的方法实现.

Android中异步消息处理主要由4个部分组成:Message, Handler ,MessageQueue

,Looper;

Message: Mesage机制主要是为了线程之间的安全,不关心消息的接收者,使消息本身和线程剥离开,方便实现定时和异步等操作;

Message是线程之间传递的消息,它内部可以携带少量的信息,用于在不同线程之间交换数据. 包含必要的描述和属性数据,此对象可以被发送给Handler处理.

属性字段: arg1,arg2,what,obj,replyTo,其中arg1arg2用于存放整型数据,what用于保存消息标示,objObject类型的任意对象,replyTo是消息管理器.会关联到一个handler

 

Looper:  1.主要用于一个线程循环获取消息列队中的消息,

       2.主要作用负责管理消息列队,负责消息的出列和入列;

Looper是MessageQueue的关键,调用Looper的loop()方法进入到一个无限循环中,每当MessageQueue中存在消息,就将它取出,并传递给Handler的sendMessage()方法中,每个线程中只会有一个Looper对象.

 

Handler: 主要用途,1. 定时处理和分发消息

  2. 可以添加一个执行的行为在其他线程执行

//定义一个整型常量用于表示更新TextView的动作;
private static final int UPDATA_TEXT = 1;

//创建一个Handler对象,重写父类的handleMessage()方法,根据参数选择对此消息是否做出处理
private Handler mHandler = new Handler() {
    @Override
    public void handleMessage(Message msg) {
        //如果发现Message what字段的值等于UPDATA_TEXT
        switch (msg.what){ //根据收到消息的what类型处理
            case UPDATA_TEXT:
                mTextl.setText("异步消息处理");
                break;
        }
    }
};

 


   @Override
    public void onClick(View v) {
        switch (v.getId()){
            case R.id.change_text:
                new Thread(new Runnable() {
                    @Override
                    public void run() {
                        //创建一个Message对象
                        Message message = new Message();
                        //Message对象的what字段设置为UPDATA_TEXT
                        message.what = UPDATA_TEXT;
                        //调用HandlersendMessage方法将这条Message发送出去
                        mHandler.sendMessage(message);
                    }
                }).start();
                break;
    }

明天计划的事情:继续学习异步消息处理机制, AsyncTask异步任务,服务的基本用法

学习遇到的问题:

 

收获:了解了线程的简单使用,Message机制的基本

 



返回列表 返回列表
评论

    分享到