Re: [问题] Looper.loop() 可以改成 non block吗

楼主: abcb1 (一票难求!)   2017-08-23 09:33:48
※ 引述《abcb1 (一票难求!)》之铭言:
: 标题: [问题] Looper.loop() 可以改成 non block吗
: 时间: Tue Aug 22 10:35:35 2017
:
: 请问各位前辈
: 我目前想做的功能是 我开一个 thread
: 可以接收 main thread 来的message做处理(转成自己的指令格式用socket传给server)
: 同时也要监听server是否有回应
:
: 现在的问题是 我用Looper来收 main thread message
: 但loop()当messgae queue没东西会卡住
: 我希望做到的是 在Message queue没东西时还能做其他的事 (像下面的架构)
:
:
: private class ClientThread implements Runnable {
:
: @Override
: public void run() {
:
: while(true) {
: ......
: ......
: looper.loop() // 正常会卡住
:
: ............. // 我想做的事
: }
: }
:
: }
:
: 请问有办法让 loop non block吗
: 我目前想到的另一个做法是把我要做的事 写成 IdleHanlder 绑定到 message queue
: 让 queue空的时候去做我指定的事
:
: 但还是想请问各位
: 1. loop() 有办法 nonblock吗
: 2. 或者有什么其他建议的做法 我想这个问题应该很多人会遇到
: (专门开一个 thread 只能做meesgae 处理好像有点?)
:
: 希望大家能多给些意见 先在此感谢各位的回答
:
:
作者: ssccg (23)   2017-08-23 09:52:00
你的想法有问题,while写成那样就是说一定要接到一个msg才轮到监听,一定要监听资料才处理下一个msg如果要用message处理机制达成non-blocking,本来就该用另一个thread监听再发message,不然监听这件事就会block thread
作者: kobe8112 (小B)   2017-08-23 10:02:00
我会建议初学可以去翻些实体书,对Android的各种同步、消息传递机制有大略的了解,再去依据需求到板上或Stack Overflow、CSDN等地方搜寻更深入的做法、讨论,一般刚接触的朋友应该不会管到Looper去才对啊QQ
作者: ssccg (23)   2017-08-23 10:05:00
如果监听是用non-blocking的API,那更单纯直接用Handler定期检查有没有新收到资料就好如果你真的就是要一送一收,block住等结果那就把送收都写在同个handleMessage就好总之都不会需要动到Looper,Looper+MessageQueue就是用来让在thread上做事变成event-driven/non-blocking,你要破坏这实作却说目标是要达成non-blocking让人无法理解...

Links booklink

Contact Us: admin [ a t ] ucptt.com