如果有延期执行任务的需求,我们经常用handler的postDelay方法,但这个方法容易造成内存泄漏,因为啥,这里不展开,老司机都知道。但为了解决Handler的内存泄漏的问题,我们一般会再onDestroy或者onStop执行removeCallback的方法。具体的调用如下:postDelayed中传入test字符串,是将它作为callback的一个token。
public class NotesActivity extends BaseActivity {
private NotesPresenter mNotesPresenter;
private Handler mHandler = new Handler();
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_notes);
mHandler.postDelayed(new Runnable() {
@Override
public void run() {
Log.i("NotesActivity","lllllll");
}
},"test",2000);
}
@Override
protected void onDestroy() {
super.onDestroy();
mHandler.removeCallbacksAndMessages("test");
}
}
但是运行postDelayed的时候,奔溃了,奔溃信息如下:
java.lang.NoSuchMethodError: No virtual method postDelayed(Ljava/lang/Runnable;Ljava/lang/Object;J)Z in class Landroid/os/Handler; or its super classes (declaration of 'android.os.Handler' appears in /system/framework/framework.jar!classes2.dex)
at com.jose.hxl.notes.ui.NotesActivity.onCreate(NotesActivity.java:33)
at android.app.Activity.performCreate(Activity.java:7258)
at android.app.Activity.performCreate(Activity.java:7249)
at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1221)
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2909)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:3041)
at android.app.ActivityThread.-wrap11(Unknown Source:0)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1711)
at android.os.Handler.dispatchMessage(Handler.java:106)
at android.os.Looper.loop(Looper.java:164)
at android.app.ActivityThread.main(ActivityThread.java:6958)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:441)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1408)
竟然是NoSuchMethodError,没有这个方法,太坑人了。系统的framework下的Handler没有这个方法,虽然信息给了,但仍然要去源码看一眼,我下了6.0的系统源码,导入到Android Stduio,查看Handler的方法列表:
验证了确实没有三个参数的postDelayed,sdk有,framework(8.0系统也没有,因为同样会被崩)没有。但怎么解决问题呢,总不能因为这个崩溃,不去优化了吧,建议这么写,虽然很不优雅,但不至于崩溃
public class NotesActivity extends BaseActivity {
private NotesPresenter mNotesPresenter;
private Handler mHandler = new Handler();
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_notes);
mHandler.postDelayed(mMyRunnable,2000);
}
@Override
protected void onDestroy() {
super.onDestroy();
mHandler.removeCallbacks(mMyRunnable);
}
private MyRunnable mMyRunnable = new MyRunnable();
private class MyRunnable implements Runnable{
@Override
public void run() {
Log.i("NotesActivity","lllllll");
}
}
}