1:如果有打开Dialog,一定要在Activity的Destroy释放,否则有可能造成Activity异常退出时的内存泄露。
@Override
protected void onDestroy()
{
super.onDestroy();
if (progressDialog != null) {
progressDialog.dismiss();
progressDialog.cancel();
progressDialog = null;
}
}
2:利用Handler时,Handler 类应该是静态的否则可能发生泄漏。当我们
Activity异常结束
结束后,Message
持有Handler
的引用,而Handler
有持有Activity
的引用,这个Activity
所有的资源,在这个消息处理之前都不能也不会被回收,所以就发生了内存泄露。
解决办法如下:
建立一个对外部Activity保持弱引用的内部类。
private static class MHandler extends Handler{
private final WeakReference<Activity> mActivity;
public MHandler(Activity activity) {
mActivity = new WeakReference<Activity>(activity);
}
@Override
public void handleMessage(Message msg) {
if(mActivity.get() == null) {
return;
}
}
}
private Handler myHandler = new MHandler(this) {
public void handleMessage(Message msg) {
if (progressDialog != null) {
progressDialog.dismiss();
progressDialog.cancel();
progressDialog = null;
}
switch (msg.arg1) {
case 0:
if(index==1){
mess1 = "你好,没有相关数据!";
runOnUiThread(textRunSuccess_0);
}else{
//totalPage=list.get(0).getPageTotal();
index=index-1;
Toast.makeText(CustomerListActivity.this, "已经是尾页", Toast.LENGTH_LONG).show();
}
break;
case 1:
setView(list);
break;
case -1:
mess1 = "网络中断,或服务器异常";
runOnUiThread(textRunSuccess_0);
break;
default:
break;
}
super.handleMessage(msg);
}
};
3:子线程异常处理,子线程一定要放在错误处理里面,不然有可能引起程序异常退出。
new Thread() {
public void run() {
Looper.prepare();
try {
//
} catch (Exception e) {
Message message = new Message();
message.arg1=-1;
myHandler.handleMessage(message);
}
}
}.start();