Android登入攔截器實現方式(二)

來源:互聯網
上載者:User

標籤: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登入攔截器實現方式(二)

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.