Android登录拦截器实现方式(二)
来源:互联网 发布:苏州网络电视台直播 编辑:程序博客网 时间:2024/06/11 01:43
第二种方式主要思路暂时用于研究讨论,大概是,启动一条专门用于等待登陆结果的线程,在登陆的过程中处于挂起状态,在登陆有结果后由其它线程来唤醒该条等待线程,继续之前的工作。 写了个简单的类来实现上面的方式LogonRequireTask,仅是说明这种思路。 使用时类似于以下代码,直接使用execute方法执行你要做的事情,可以是跳转至个人信息页,可以是做收藏功能,这样的处理方式就很简单明了了。但是别忘记了在登陆逻辑完成时调用LogonRequireTask.loginEnded()
new LogonRequireTask() { @Override public boolean logon() { return logon;//Utils.isLogin() } @Override public void onLogout() { // TODO Auto-generated method stub } }.execute(new Runnable() { @Override public 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() { @Override public 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) { @Override protected 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; } }
0 0
- Android登录拦截器实现方式(二)
- Android登录拦截器实现方式(一)
- Vue 实现登录拦截(二)
- Spring Security4.1.3实现拦截登录后向登录页面跳转方式(redirect或forward)返回被拦截界面
- Spring Security4.1.3实现拦截登录后向登录页面跳转方式(redirect或forward)返回被拦截界面
- SpringMVC 登录拦截器实现
- 登录拦截器的实现
- SpringMVC拦截器实现登录
- Android实现登录系统(二)--SMS短信验证登录
- Interceptor登录拦截(Spring拦截器)
- java拦截器实现强制登录(结合struts2)
- SpringMVC拦截器实现登录认证(2017修正版)
- Struts2拦截器 实现未登录拦截和权限控制
- Struts2拦截器 实现未登录拦截和权限控制
- Spring mvc拦截器实现登录验证拦截
- springmvc 自定义拦截器实现未登录用户的拦截
- 用拦截器实现session登录
- struts2拦截器实现登录控制
- HDU 1798 Tell me the area(计算几何,求相交圆面积)
- 人丑多读书之书集
- Struts框架中struts-config.xml文件配置小结
- CSS Hack
- 移动版&PC版微信登陆功能
- Android登录拦截器实现方式(二)
- H264 primer - A layman’s guide - by KUSH AMERASINGHE
- 文本溢出显示省略号
- Android入门第一篇
- PHP_PHP操作Word-PHPWord
- js事件重复绑定问题
- CentOS---tftp(安装、配置、使用)
- 黑马程序员——Java基础--多线程(2)
- WAS8.5安装和部署