Handler leakjiej

google推荐方法添加static,但我的目前并不喜欢那样子java

目前对几种handler写法进行了测试,测试方法与结果以下:android

package com.android.chaos;

import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;

import com.example.myreveallayout.R;

public class MainActivity extends Activity{

   private Button button;

   @Override
   protected void onCreate(Bundle savedInstanceState) {
      super.onCreate(savedInstanceState);
      setContentView(R.layout.activity_main);
      button = (Button) findViewById(R.id.button);
      button.setOnClickListener(new View.OnClickListener() {
         @Override
         public void onClick(View v) {
            Intent intent = new Intent();
            intent.setClass(MainActivity.this,TestActivity.class);
            startActivity(intent);
         }
      });

   }

}

 

package com.android.chaos;

import android.app.Activity;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;

import com.example.myreveallayout.R;

import java.lang.ref.WeakReference;

/**
 * 项目名称:
 * 类描述:
 * 建立人:
 * 建立时间:2016/6/15 15:02
 * 修改人:
 * 修改时间:2016/6/15 15:02
 * 修改备注:
 */
public class TestActivity extends Activity {
    //2,3写法虽然不会被lint检查出来,但任然会形成leak,第四,五种测试目前不会形成内存没法回收
    //第5种写法,会让调用方法都要写成static,对应的一些成员变量也要变成static
    //测试方法:不停点击mainActivity中button,在studion 中查看内存状况
    //建议在onDestory中添加handler.removeCallbacksAndMessages(null);移除
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        //第四种方案
        MyHandler handler = new MyHandler(this);
        handler.sendEmptyMessageDelayed(111,60 * 10 * 1000);

        finish();
    }
    //第一种方案
    /*private static Handler handler = new Handler(){
        @Override
        public void handleMessage(Message msg) {
            super.handleMessage(msg);
        }
    };*/

    //第二种方案
    private Handler handler = new Handler(new Handler.Callback() {
        @Override
        public boolean handleMessage(Message msg) {
            return false;
        }
    }) ;

    //第三种方案  public class TestActivity extends Activity  implements Handler.Callback
    //实例化时  Handler handler = new Handler(this)

    //第五种方案
    /*private static Handler handler = new Handler(new Handler.Callback() {
        @Override
        public boolean handleMessage(Message msg) {
            return false;
        }
    }) ;*/
    
    private static class MyHandler extends Handler {
        WeakReference<Activity > mActivityReference;

        MyHandler(Activity activity) {
            mActivityReference= new WeakReference<Activity>(activity);
        }

        @Override
        public void handleMessage(Message msg) {
            final TestActivity activity = (TestActivity) mActivityReference.get();
            if (activity != null && !activity.isFinishing()) {
                activity.set();
            }
        }
    }

    private void set(){
        // TODO: 2016/6/15
    }

}
相关文章
相关标签/搜索
本站公众号
   欢迎关注本站公众号,获取更多信息