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

 private MyHandle codeHandler=new MyHandle(ForgotPasswordActivity.this);
private static class MyHandle extends Handler
{//导os包
WeakReference mActivityWeakReference;
public MyHandle(ForgotPasswordActivity mActivity){
mActivityWeakReference =new WeakReference(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 mActivityWeakReference;
public MyHandle(Activity mActivity){
mActivityWeakReference =new WeakReference(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);
}
}
        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 mActivityWeakReference;
public MyHandle(Activity mActivity){
mActivityWeakReference =new WeakReference(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);

}
}