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
    }

}
相關文章
相關標籤/搜索
本站公眾號
   歡迎關注本站公眾號,獲取更多信息