package de.bvb.study.common; /** * 用於規范 Message.what此屬性,避免出現魔法數字 */ public final class What { public static final int ZERO = 0; public static final int ONE = 1; /** 標記異步操作返回時目標界面已經消失時的處理狀態 */ public static final int ACTIVITY_GONE = -1; }
package de.bvb.study.common; import android.app.Activity; import android.os.Handler; import android.os.Message; import android.support.v4.app.Fragment; import java.lang.ref.WeakReference; import de.bvb.study.util.LogUtil; /** * handler包裝類 */ public abstract class BaseHandler extends Handler { protected WeakReference<Activity> activityWeakReference; protected WeakReference<Fragment> fragmentWeakReference; private BaseHandler() {}//構造私有化,讓調用者必須傳遞一個Activity 或者 Fragment的實例 public BaseHandler(Activity activity) { this.activityWeakReference = new WeakReference<>(activity); } public BaseHandler(Fragment fragment) { this.fragmentWeakReference = new WeakReference<>(fragment); } @Override public void handleMessage(Message msg) { if (activityWeakReference == null || activityWeakReference.get() == null || activityWeakReference.get().isFinishing()) { // 確認Activity是否不可用 LogUtil.i("Activity is gone"); handleMessage(msg, What.ACTIVITY_GONE); } else if (fragmentWeakReference == null || fragmentWeakReference.get() == null || fragmentWeakReference.get().isRemoving()) { //確認判斷Fragment不可用 LogUtil.i("Fragment is gone"); handleMessage(msg, What.ACTIVITY_GONE); } else { handleMessage(msg, msg.what); } } /** * 抽象方法用戶實現,用來處理具體的業務邏輯 * * @param msg * @param what {@link What} */ public abstract void handleMessage(Message msg, int what); }
package de.bvb.study.ui.activity; import android.app.Activity; import android.os.Bundle; import android.os.Message; import de.bvb.study.common.BaseHandler; import de.bvb.study.common.What; public class LoginActivity extends BaseActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); new Thread(new Runnable() { @Override public void run() { handler.obtainMessage(What.ZERO, "data 0").sendToTarget(); } }).start(); new Thread(new Runnable() { @Override public void run() { handler.obtainMessage(What.ONE, "data 1").sendToTarget(); } }).start(); } MyHandler handler = new MyHandler(this); private static class MyHandler extends BaseHandler { public MyHandler(Activity activity) { super(activity); } @Override public void handleMessage(Message msg, int what) { switch (what) { case What.ZERO: break; case What.ONE: break; case What.ACTIVITY_GONE: break; } } } }