Handler日常使用简介
Android在多线程操作使用handler时注意两点:
1、不要阻塞UI线程
2、不要在UI线程之外访问Android UI工具包
例子
private Handler handler=new Handler(){
@Override
public void handleMessage(Message msg) {
super.handleMessage(msg);
switch (msg.what){
case 100:
textView.setText("下载完成");
break;
}
}
};
public void downloadClick(View v){
//使用线程模拟下载操作
new Thread(new Runnable() {
@Override
public void run() {
while(true){
try {
Thread.sleep(3000);
} catch (InterruptedException e) {
e.printStackTrace();
}
break;
}
//下载完成后,更新UI状态
// textView.setText("下载完成");
handler.sendEmptyMessage(100);//发送一个空消息,标记为100
// Message msg=handler.obtainMessage();//获取一个消息对象
// msg.what=100;
// msg.obj="要存储的信息";//任意类型
// handler.sendMessage(msg);//发送消息
// handler.sendEmptyMessageAtTime(200,System.currentTimeMillis()+3000);//在指定时间后发送
// handler.sendEmptyMessageDelayed(300,2000);//延迟多少时间后发送消息
}
}).start();
}
通过Handler调用UI组件
Handler内部实现原理
Handler实现机制:
1、Message对象,表示要传递的一个消息
2、MessageQueue对象,存放消息对象的消息队列,先进先出原则
3、looper对象负责管理当前线程的消息队列(MessageQueue)
4、Handler对象负责把消息push到消息队列中,以及接收looper从消息队列中取出的消息。
Android启动线程时会在UI线程创建一个MessageQueue。
流程图
内存泄漏问题
activity退出了,但handler依旧获取到activity的引用,导致activity没有完全退出,导致内存的泄漏。
1、定义一个内部类时,会默认拥有外部类对象的引用,所以建议使用内部类时,最好定义为一个静态内部类
2、引用的强弱:强引用-》软引用-》弱引用
使用Handler实现闪屏页
闪屏页的作用
1、欢迎界面
2、初始化工作
代码块
public class SplashActivity extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_splash);
handler.postDelayed(new Runnable() {
@Override
public void run() {
startMainActivity();
}
},3000);
}
private void startMainActivity(){
Intent intent=new Intent(this,MainActivity.class);
startActivity(intent);
}
private Handler handler=new Handler();
}