开发中通过FeatrueTask来同步拿到异步执行的结果。但是FeatrueTask的get方法会阻塞线程。如果是在主线程调用get方法的话,就会阻塞主线程,导致主线程的handler的handleMessage被阻塞。
案例一:
通过FeatrueTask的get方法去等待AbsMediaEngine的init方法的异步回调结果。AbsMediaEngine的init里调用的SEService的new方法,成功连接的时候通过handler发送一个message。在message里去处理AbsMediaEngine的init的异步回调。问题出来了,handler的handleMessage被FeatrueTask的get方法阻塞住了。导致超时毕现。
解决办法:不使用handler了。直接在SEService的成功连接或者失败连接的时候回调AbsMediaEngine的init的异步回调。
案例二:
demo先绑定控件的服务,控件的服务在主线程去绑定钱包的服务。如果通过featrueTask去等待绑定钱包的服务的结果没有问题。有问题的是钱包绑定控件,控件在主线程去绑定钱包的服务,如果在主线程去等待绑定服务的返回,就会导致绑定服务卡住。通过过FeatrueTask去等待,通过do while去等待,通过CountDownLatch去等待都回卡住。目前无好的解决办法。要么到子线程去等,要么在主线程异步处理,要么提前把钱包服务绑定好。