Handler的一个坑

如果有延期执行任务的需求,我们经常用handler的postDelay方法,但这个方法容易造成内存泄漏,因为啥,这里不展开,老司机都知道。但为了解决Handler的内存泄漏的问题,我们一般会再onDestroy或者onStop执行removeCallback的方法。具体的调用如下:

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的方法列表:

验证了确实没有,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");
        }
    }

}

猜你喜欢

转载自blog.csdn.net/hanshengjian/article/details/90026523
今日推荐