1、Handler的定义理解
Handler 是一个消息分发对象。Handler是Android给我们提供用来更新UI的一套机制,也是一套消息处理机制,我们可以发消息,也可以通过它处理消息。
看Android官方文档描述:
Handler有两个主要的用途:
(1)安排消息和可运行对象在将来的某个时间点执行;(定时任务)
(2)在不同的线程上排队执行一个动作。(在不同线程中执行任务)
2、Handler的基本使用
1、方式一 sendMessage
在Activity中定义一个接收的Handler,用来接收消息Message,进行UI更新等工作。
private Handler mHandler=new Handler(){
@Override
public void handleMessage(@NonNull Message msg) {
switch (msg.what){
case MSG_DOWN_FAIL:
mTvState.setText("下载失败!");
break;
case MSG_DOWN_START:
mTvState.setText("开始下载!");
break;
case MSG_DOWN_SUCCESS:
mTvState.setText("下载成功!");
Log.i("TAG","返回:"+msg.what+" "+msg.arg1+" "+msg.arg2+" "+(msg.obj==null?"":msg.obj.toString()));
break;
default:
break;
}
}
};
在子线程中发送消息:
class DownLoadThread extends Thread{
@Override
public void run() {
mHandler.sendEmptyMessage(MSG_DOWN_START);
try {
Thread.sleep(3000);
} catch (InterruptedException e) {
e.printStackTrace();
mHandler.sendEmptyMessage(MSG_DOWN_FAIL);
}
Message message=new Message();
message.what=MSG_DOWN_SUCCESS;
message.arg1=321;
message.obj="想不到吧,哈哈哈~";
mHandler.sendMessage(message);
}
}
启动线程(看下图代码),在子线程中睡他个3s(看上图代码),然后发消息
new DownLoadThread().start();
2、方式二 post
class PostThread extends Thread{
@Override
public void run() {
Log.d("TAG","run threadid="+Thread.currentThread().getId()+
",name="+Thread.currentThread().getName());
mHandler.postDelayed(new Runnable() {
@Override
public void run() {
Log.d("TAG", "Runnable threadid="+Thread.currentThread().getId()
+",name="+Thread.currentThread().getName());
//更新ui
mTvState.setText("download success");
}
},3000);
}
}
可以在Activity中也打印一下主线程,对比对的
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Log.d("TAG","MAIN threadid="+Thread.currentThread().getId()+
",name="+Thread.currentThread().getName());
initView();
}
勇敢的跑起来看看效果:
方式三,obtainMessage
class ObtainThread extends Thread{
@Override
public void run() {
mHandler.obtainMessage(MSG_DOWN_START).sendToTarget();
try {
Thread.sleep(3000);
} catch (InterruptedException e) {
e.printStackTrace();
mHandler.obtainMessage(MSG_DOWN_FAIL).sendToTarget();
}
mHandler.obtainMessage(MSG_DOWN_SUCCESS).sendToTarget();
}
}
可携带数据
2、检查项目质量
通过Android Studio 的菜单栏Analyze选项下拉选择第一个选项Inspect Code.
- This 'Handler' class should be static or leaks might occur (anonymous android.os.Handler)
在Java中,非静态的内部类和匿名内部类都会隐式地持有其外部类的引用。静态的内部类不会持有外部类的引用。
所以我们可以通过静态内部来解决这个问题。
private SHandler mHandler=new SHandler();
public static class SHandler extends Handler{
@Override
public void handleMessage(@NonNull Message msg) {
super.handleMessage(msg);
switch (msg.what){
case MSG_DOWN_FAIL:
break;
case MSG_DOWN_START:
break;
case MSG_DOWN_SUCCESS:
Log.i("TAG","返回:"+msg.what+" "+msg.arg1+" "+msg.arg2+" "+(msg.obj==null?"":msg.obj.toString()));
break;
default:
break;
}
}
}
内存泄露问题解决了
学会了使用,接下来可以进入