Android击穿Handler使用产生内存泄漏(MemoryLeak)

实际开发用到的代码
ForgotPasswordActivity activity = mActivityWeakReference.get();
此API为获取到宿主Activity,之后才能操作上面的元素

 private MyHandle codeHandler=new MyHandle(ForgotPasswordActivity.this);
    private static class MyHandle extends Handler
    {//导os包
        WeakReference<ForgotPasswordActivity> mActivityWeakReference;
        public MyHandle(ForgotPasswordActivity mActivity){
            mActivityWeakReference =new WeakReference<ForgotPasswordActivity>(mActivity);
        }
        @Override
        public void handleMessage(Message msg) {
            super.handleMessage(msg);
            ForgotPasswordActivity activity = mActivityWeakReference.get();
            switch (msg.what){
                case 1:
                    activity.updateTimer();
                    break;
            }
        }
    };




TimerTask task = new TimerTask() {
            @Override
            public void run() {
                Message message = new Message();
                message.what = 1;
                codeHandler.sendMessage(message);
            }
        };
        mTimer = new Timer();
        mTimer.schedule(task,0,1000);

private void updateTimer(){
        mForgetGetCodeBtn.setText("重新获取(" + --mCodeLengthInt + ")");
        if (mCodeLengthInt == -1) {
            mTimer.cancel();
            mForgetGetCodeBtn.setBackgroundResource(R.drawable.btn_authcode_selector);
            mForgetGetCodeBtn.setTextColor(getResources().getColor(R.color.black));
            mForgetGetCodeBtn.setClickable(true);
            mForgetGetCodeBtn.setText("获取验证码");
        }
    }

内存泄漏正确打开姿势

public class Activity extends AppCompatActivity {
    private Activity mActivity;
    private MyHandle mHandler=new MyHandle(Activity.this);
    private static class MyHandle extends Handler
    {//导os包
        WeakReference<Activity> mActivityWeakReference;
        public MyHandle(Activity mActivity){
            mActivityWeakReference =new WeakReference<Activity>(mActivity);
        }
        @Override
        public void handleMessage(Message msg) {
            super.handleMessage(msg);
            switch (msg.what){
                case 0:
                     Log.e("1", "delay ");
                    break;
            }
        }
    };
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        // TODO Auto-generated method stub
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_second);
        final EditText text1 = (EditText) findViewById(R.id.text1);
        Button finish = (Button) findViewById(R.id.finish);
        finish.setOnClickListener(new View.OnClickListener() {

            @Override
            public void onClick(View v) {
                loadData();

//                Intent mIntent = getIntent();
//                mIntent.putExtra("bian", text1.getText().toString());
//                setResult(RESULT_OK, mIntent);
//                finish();
            }
        });
    }

    private void loadData() {
        mHandler.sendEmptyMessageDelayed(0,15000);

    }
}

检测工具LeakCanary(泄漏金丝雀)
步骤:
1moudle引入LeakCanary

debugCompile 'com.squareup.leakcanary:leakcanary-android:1.3'
releaseCompile 'com.squareup.leakcanary:leakcanary-android-no-op:1.3'

2Appliaction中必须配置

public class MyApplication extends Application {
    @Override
    public void onCreate() {
        super.onCreate();
        LeakCanary.install(this);
    }
}
<application
        android:name=".MyApplication"
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:roundIcon="@mipmap/ic_launcher_round"
        android:supportsRtl="true"
        android:theme="@style/AppTheme">

3
能够导致内存泄漏的Handler

public class Activity extends AppCompatActivity {
private Handler mHandler=new Handler(){//导os包
    @Override
    public void handleMessage(Message msg) {
        super.handleMessage(msg);
        switch (msg.what){
            case 0:
                Log.e("1", "delay11 ");
                break;

            case 2:

                break;

        }
    }
};
//
//    private MyHandle mHandler=new MyHandle();
//    private static class MyHandle extends Handler
//    {//导os包
//        @Override
//        public void handleMessage(Message msg) {
//            super.handleMessage(msg);
//            switch (msg.what){
//                case 0:
//                     Log.e("1", "delay ");
//                    break;
//            }
//        }
//    };
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        // TODO Auto-generated method stub
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_second);
        final EditText text1 = (EditText) findViewById(R.id.text1);
        Button finish = (Button) findViewById(R.id.finish);
        finish.setOnClickListener(new View.OnClickListener() {

            @Override
            public void onClick(View v) {
                loadData();

//                Intent mIntent = getIntent();
//                mIntent.putExtra("bian", text1.getText().toString());
//                setResult(RESULT_OK, mIntent);
//                finish();
            }
        });
    }

    private void loadData() {
        mHandler.sendEmptyMessageDelayed(0,15000);

    }
}

4静态内部+弱引用的Handler避免内存泄漏

public class Activity extends AppCompatActivity {
    Activity mActivity;
//private Handler mHandler=new Handler(){//导os包
//    @Override
//    public void handleMessage(Message msg) {
//        super.handleMessage(msg);
//        switch (msg.what){
//            case 0:
//                Log.e("1", "delay11 ");
//                break;
//
//            case 2:
//
//                break;
//
//        }
//    }
//};
//
    private MyHandle mHandler=new MyHandle(Activity.this);
    private static class MyHandle extends Handler
    {//导os包
        WeakReference<Activity> mActivityWeakReference;
        public MyHandle(Activity mActivity){
            mActivityWeakReference =new WeakReference<Activity>(mActivity);
        }
        @Override
        public void handleMessage(Message msg) {
            super.handleMessage(msg);
            switch (msg.what){
                case 0:
                     Log.e("1", "delay ");
                    break;
            }
        }
    };
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        // TODO Auto-generated method stub
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_second);
        final EditText text1 = (EditText) findViewById(R.id.text1);
        Button finish = (Button) findViewById(R.id.finish);
        finish.setOnClickListener(new View.OnClickListener() {

            @Override
            public void onClick(View v) {
                loadData();

//                Intent mIntent = getIntent();
//                mIntent.putExtra("bian", text1.getText().toString());
//                setResult(RESULT_OK, mIntent);
//                finish();
            }
        });
    }

    private void loadData() {
        mHandler.sendEmptyMessageDelayed(0,15000);

    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值