handler可能会导致内存泄漏的问题:
因为handler是异步操作,而且会持有activity的引用,如果activity要被销毁,但是handler还在执行,那么在垃圾回收的时候就无法回收activity,就会造成一个内存泄漏。
可能会造成内存泄漏的写法:
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_time);
timetextview=findViewById(R.id.tv_time);
Handler handler=new Handler(){
@Override
public void handleMessage(Message msg) {
super.handleMessage(msg);
if(msg!=null&&msg.what==INT){
timetextview.setText(String.valueOf(9));
}
}
};
Message message=Message.obtain();
message.what= INT;
handler.sendMessageDelayed(message,1000);
}
解决办法:
使用静态的Handler+弱引用:
修改之后的写法:
public class TimeActivity extends AppCompatActivity {
public static final int INT = 1001;
private TextView timetextview;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_time);
timetextview=findViewById(R.id.tv_time);
TimeHandler handler=new TimeHandler(this);
Message message=Message.obtain();
message.what= INT;
message.arg1=10;
handler.sendMessageDelayed(message,1000);
}
public static class TimeHandler extends Handler{
final WeakReference<TimeActivity> timeActivityWeakReference;
//构造器
public TimeHandler(TimeActivity timeActivity) {
this.timeActivityWeakReference = new WeakReference<>(timeActivity);
}
@Override
public void handleMessage(Message msg) {
super.handleMessage(msg);
TimeActivity activity=timeActivityWeakReference.get();//获取活动
switch (msg.what){
case INT:
int value=msg.arg1;
activity.timetextview.setText(String.valueOf(--value));
//重新构造一个mssage:
Message message=Message.obtain();
message.what=INT;
message.arg1=value;
if(value>0)
{
sendMessageDelayed(message,1000);
}
break;
}
}
}
}
主要是这里:
重写了一个静态的Handler类,在构造器中传入一个弱引用Acitivity。
public static class TimeHandler extends Handler{
final WeakReference<TimeActivity> timeActivityWeakReference;
//构造器
public TimeHandler(TimeActivity timeActivity) {
this.timeActivityWeakReference = new WeakReference<>(timeActivity);
}
@Override
public void handleMessage(Message msg) {
super.handleMessage(msg);
TimeActivity activity=timeActivityWeakReference.get();//获取活动
switch (msg.what){
case INT:
int value=msg.arg1;
activity.timetextview.setText(String.valueOf(--value));
//重新构造一个mssage:
Message message=Message.obtain();
message.what=INT;
message.arg1=value;
if(value>0)
{
sendMessageDelayed(message,1000);
}
break;
}
}
}
好滴~~上面就实现了一个用handler倒计时的方法啦~
除了这个,关于handler,还做了个下载文件并更新进度条的demo:
源码放评论区~