本篇文章继续对安卓开发面试必备的基础知识进行梳理。
一、关于Handler
public class MainActivity extends Activity {
private TextView textView;
private int i=0;
private boolean flag =false;
private Runnable runnable = new Runnable() {
@Override
public void run() {
i++;
textView.setText(i+"");
handler.postDelayed(runnable, 500);
}
};
private Handler handler = new Handler();
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
textView =(TextView) findViewById(R.id.textView);
handler.postDelayed(runnable, 500);
}
//button的点击事件的回调方法
public void remove(View view){
if(!flag){
flag =true;
handler.removeCallbacks(runnable);
}else{
flag =false;
handler.postDelayed(runnable, 500);
}
}
}
上述例子通过post(Runnable)的方法,传递一个runnable对象给主线程,runnable中的run方法是在UI现线程中执行的。并且通过button的回调可以控制循环的开始和停止
sendMessage用法:public class MainActivity extends Activity {
private TextView textView;
private Handler handler = new Handler(){
public void handleMessage(android.os.Message msg) {
textView.setText("Hanlder");
};
};
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
textView =(TextView) findViewById(R.id.textView);
new Thread(){
public void run() {
try {
Thread.sleep(1000);
handler.sendEmptyMessage(1);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
};
}.start();
}
}
二、关于Handler机制
Handler:发送和处理消息,发送消息必须有Looper
Looper:通过loop方法读取MessageQueue中的消息并交给Handler处理
MessageQueue:消息队列,持有Message
Message:消息对象
三、关于Handler内存泄漏
原因:静态内部类持有外部类的匿名引用,导致外部activity无法释放
解决方式:1,把handler改为静态内部类
2,在activity的onDestory生命周期方法中调用handler.removeCallback()
四、关于AsyncTask
AsyncTask本质上是一个封装了线程池和handler的异步框架,主要用来执行异步任务,避免了直接使用线程类Thread和Handler直接处理后台操作,适合于耗时较短的操作,耗时较长的操作最好使用线程池
使用方法:3个参数,5个方法
AsyncTask<Integer,Integer,String>
第一个参数,在执行AsyncTask时所要传入的参数,后台任务所需
第二个参数,在执行AsyncTask时界面上显示进度第三个参数,在执行AsyncTask结束时需要返回的参数
5个方法:
onPreExecute(),执行在耗时操作之前,常用于初始化操作,运行在主线程
doInBackground(),执行耗时操作,其中可以调用publishProgress()发布一个进度单位来显示后台进行的计算,如进度
onProgressUpdate(),通常在publishProgress()方法调用之后执行,动态显示数据,如进度条
onPostExecute(),后台计算完成之后调用
五、关于handlerThread
本质是一个线程类,内部持有looper,可以进行looper循环,所以在类中可以创建Handler来发送和处理消息 ,内部为串行处理,性能消耗少,但多任务时效率低,因其只有一个线程,所以线程相对安全