作者abcb1 (一票难求!)
看板AndroidDev
标题Re: [问题] Looper.loop() 可以改成 non block吗
时间Wed Aug 23 09:33:48 2017
※ 引述《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 处理好像有点?)
:
: 希望大家能多给些意见 先在此感谢各位的回答
:
: --
: Everything is allright
: Tomorrow"ll be fine
:
: --
:
※ 发信站: 批踢踢实业坊(ptt.cc), 来自: 61.216.178.86
: ※ 文章网址: https://webptt.com/cn.aspx?n=bbs/AndroidDev/M.1503369340.A.212.html
: → ssccg: looper就用来处理message queue的,有事要做就发到message 08/22 12:51
: → ssccg: queue就好干麻要动looper? 08/22 12:51
: → ssccg: 专门一个thread处理message有点什麽? 08/22 12:52
: → ssccg: 嫌thread太闲就多发点message不就好了 08/22 12:55
: 推 KeySabre: 原po完全误解looper用途吧 08/22 21:19
: → y3k: 你用Handler就好了 08/22 22:53
抱歉 补充一下我的想法
我looper会接收 main thread来的 message 然後走socket发指令给 server端
但同时也要监听有没有server端回来的 resposne
如果response也要包成message的话 我就要多开一个 thread专门去做监听的动作
然後再包成 message丢回来 (应该是这样没错?)
但我想把两个thread的事情合在一个 thread里
while (true) {
1.接收并处理 UI thread 送来的 messagee //
2.监听有无response
}
不知道这样有解释到我想问能不能有 non-block looper的疑问了?
y3k: 你用Handler就好了
不好意思 y3k大 我刚学 android没多久 这个叙述太简单了 我不太理解你的意思
我的确是有 handler 去处理 message
但我的 Idlehandler 是透过 MessageQueue addIdleHandler(MessageQueue.Idlehandler)
去让 looper在 queue没 message的时候 做我要做的事
感谢各位的回答 希望能跟各位再讨论一下
--
Everything is allright
Tomorrow"ll be fine
--
※ 发信站: 批踢踢实业坊(ptt.cc), 来自: 61.216.178.86
※ 文章网址: https://webptt.com/cn.aspx?n=bbs/AndroidDev/M.1503452032.A.D46.html
1F:→ ssccg: 你的想法有问题,while写成那样就是说一定要接到一个msg才 08/23 09:52
2F:→ ssccg: 轮到监听,一定要监听资料才处理下一个msg 08/23 09:53
3F:→ ssccg: 如果要用message处理机制达成non-blocking,本来就该用另一 08/23 09:56
4F:→ ssccg: 个thread监听再发message,不然监听这件事就会block thread 08/23 09:56
5F:→ kobe8112: 我会建议初学可以去翻些实体书,对Android的各种同步、 08/23 10:02
6F:→ kobe8112: 消息传递机制有大略的了解,再去依据需求到板上或 08/23 10:03
7F:→ kobe8112: Stack Overflow、CSDN等地方搜寻更深入的做法、讨论, 08/23 10:04
8F:→ kobe8112: 一般刚接触的朋友应该不会管到Looper去才对啊QQ 08/23 10:04
9F:→ ssccg: 如果监听是用non-blocking的API,那更单纯直接用Handler定 08/23 10:05
10F:→ ssccg: 期检查有没有新收到资料就好 08/23 10:05
11F:→ ssccg: 如果你真的就是要一送一收,block住等结果那就把送收都写在 08/23 10:07
12F:→ ssccg: 同个handleMessage就好 08/23 10:08
13F:→ ssccg: 总之都不会需要动到Looper,Looper+MessageQueue就是用来让 08/23 10:12
14F:→ ssccg: 在thread上做事变成event-driven/non-blocking,你要破坏这 08/23 10:22
15F:→ ssccg: 实作却说目标是要达成non-blocking让人无法理解... 08/23 10:22