標籤:android 登入 攔截器
第二種方式主要思路是,啟動一條專門用於等待登陸結果的線程,在登陸的過程中處於掛起狀態,在登陸有結果後由其它線程來喚醒該條等待線程,繼續之前的工作。
抽空寫了個簡單的類來實現上面的方式LogonRequireTask,後期再進行擴充及修複。
使用時類似於以下代碼,直接使用execute方法執行你要做的事情,可以是跳轉至個人資訊頁,可以是做收藏功能,這樣的處理方式就很簡單明了了。但是別忘記了在登陸邏輯完成時調用LogonRequireTask.loginEnded()。
new LogonRequireTask() {@Overridepublic boolean logon() {return logon;//Utils.isLogin()}@Overridepublic void onLogout() {// TODO Auto-generated method stub}}.execute(new Runnable() {@Overridepublic void run() {//when login ok,go on//startActivity or do other things}});
建議將Runnable改成靜態,對context進行弱引用,防止產生記憶體問題。
下面是LogonRequireTask的全部代碼,登陸RUNNING狀態掛起線程,登陸完喚醒之。
package com.idroid.requirement;import java.util.concurrent.Callable;import java.util.concurrent.ExecutionException;import java.util.concurrent.Executor;import java.util.concurrent.Executors;import java.util.concurrent.FutureTask;import android.os.Handler;public abstract class LogonRequireTask {private static volatile Executor sDefaultExecutor = Executors.newSingleThreadExecutor();private final static int sDefaultWaitLong = 5 * 60 * 1000;private static final Handler sHandler = new Handler();private volatile Status mStatus = Status.IDLE;public enum Status {RUNNING, IDLE,}public abstract boolean logon();/** * 未登入時跳轉至頁 */public abstract void onLogout();public static void loginEnded() {synchronized (sHandler) {sHandler.notifyAll();}}public void setStatus(Status status) {mStatus = status;}public final void execute(Runnable r) { if (logon()) {sHandler.post(r);return;}if (mStatus != Status.RUNNING)onLogout();mStatus = Status.RUNNING;final WorkerCallable callable = new WorkerCallable() {@Overridepublic Boolean call() throws Exception {if (logon())return true;if (mStatus == Status.IDLE)return false;Process.setThreadPriority(Process.THREAD_PRIORITY_BACKGROUND);synchronized (sHandler) {sHandler.wait(sDefaultWaitLong);mStatus = Status.IDLE;return logon();}}};FutureTask<Boolean> future = new FutureTask<Boolean>(callable) {@Overrideprotected void done() {try {final boolean result = get();if (result) {sHandler.post(callable.runnable);} else {sHandler.removeCallbacksAndMessages(null);}} catch (InterruptedException e) {e.printStackTrace();} catch (ExecutionException e) {e.printStackTrace();} catch (NullPointerException e) {e.printStackTrace();}}};callable.runnable = r;sDefaultExecutor.execute(future);}private static abstract class WorkerCallable implements Callable<Boolean> {Runnable runnable;}}
本文出自 “Android Pool” 部落格,請務必保留此出處http://yeerik.blog.51cto.com/10547727/1682053
Android登入攔截器實現方式(二)