发表于: 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等,其中arg1和arg2用于存放整型数据,what用于保存消息标示,obj是Object类型的任意对象,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;
//调用Handler的sendMessage方法将这条Message发送出去
mHandler.sendMessage(message);
}
}).start();
break;
}
明天计划的事情:继续学习异步消息处理机制, AsyncTask异步任务,服务的基本用法
学习遇到的问题:无
收获:了解了线程的简单使用,Message机制的基本
评论