Android超时控制方法及场景
来源:互联网 发布:网络嗅探器5.5.0 编辑:程序博客网 时间:2024/06/11 21:19
刚刚和同事进行了一个非常有益的脑力训练——怎样控制超时。之前经常用,但并没有仔细想过,这次梳理了一下。
想到了三个流派:
Future/Callable/FutureTask
Future和Callable自带等待属性,(FutureTask中)带时间的get使用的是LockSupport做的等待(park、unpark)。这个方法的问题在于,需要用到Executor接口才能从Callable中拿到一个Future。
但是,FutureTask无需Executor。FutureTask继承自Runnable和Future,所以既能有等待功能,又能直接放到Thread中,非常完美。
Object#wait/LockSupport/concurrent库/Thread#join
主体思路就是自己写Future中的PV操作。优势在于更多的控制,随性使用各种多线程方法,劣势自然是麻烦、可能有问题。
扩展来说,这个方法有一个极大的好处,就是能够1等n。比如,我当前有一个线程要等10个任务最多1s,这时用CountDownLatch就非常合适(join其实是顺序的,可能不太好)。
回调+标志位
在UI中,主线程是不能用Object#wait、Future#get等方法的,此时的耗时操作+等待的方案就又有变化了。
伪码:
- UIThread:
final Runnable afterwards = new Runnable(){ private AtomicBoolean mHasRunned = new AtomicBoolean(false); public void run(){ if(mHasRunned.compareAndSet(false, true)){ doSomething(); } }}new Thread(new TimeConsumingRunnable(new Callback(){ public void call(){ afterwards.run(); }}).start();someView.postDelay(afterwards, WAIT_TIME);
- TimeConsumingRunnable#run
try{ consumeTime(); } catch (Throwable thr){ callback.call(); }
思路就是afterwards在两个位置(执行完耗时操作、超时)都调用,但是,用标记位保证代码只执行一遍。
这个的优势在于,不会阻塞主线程,后面怎么玩都是随性而为;劣势是理解和维护困难。
0 0
- Android超时控制方法及场景
- Oracle EBS控制会话时间及超时
- android service 生命周期及场景
- Android开机自启动程序设置及控制方法
- Android开机自启动程序设置及控制方法
- android网络编程及网络超时处理
- Java实现控制线程超时的简单方法
- 场景的生命周期及回调方法
- shell脚本调用方法及适用场景
- as3类开发,场景2帧如何实现控制方法
- android四大组件详解及使用场景
- android四大组件详解及使用场景
- Android内存泄漏场景及解决方法
- Android UI控制方法
- TUXEDO超时控制全功略
- tuxedo 超时控制
- TUXEDO超时控制全功略
- java超时控制
- Picasso
- C++- 随机投点法求圆周率
- [数学思维]以简化规则为目标去定义值
- 怎么把pdf首页改为其他页面
- 面向对象学习
- Android超时控制方法及场景
- CSS hack一览
- 看视频自学Java泛型
- CodeForces 782D Innokenty and a Football League
- Sublime Text 3快速生成HTML5的头部信息
- RunLoop的总结
- 2017年网易有道内推编程题
- 二叉树的简单实现
- QDialog,QWidget实现圆角,圆弧边框