关于handler的handleMessage延迟执行问题,急,求大神!

PK0071 2015-05-08 09:25:57
Handler mHandler = new Handler() {

@Override
public void handleMessage(Message msg) {
// TODO Auto-generated method stub
Log.d("handleMessage2", "enter");//--
//super.handleMessage(msg);
switch (msg.what) {
case UPDATE_EYES:
int index = msg.obj.toString().indexOf("eyefatiguevalue");//截取
String data = msg.obj.toString().substring(index + 16);
Log.d("handleMessage2", "eyes + :" + data);//--
tv_eyes.setText( data);
break;
default:
break;
}
}

};


class MyNetworkThread extends Thread {

@Override
public void run() {
try {
Socket socket = new Socket("192.168.252.1", 1235);
String line;
BufferedReader is = new BufferedReader(new InputStreamReader(socket.getInputStream()));
while (true) {
String str = is.readLine();
Log.d("myThread", str);//---
if(str == null){
break;
}
//更新数据
if (str.length() == 32) {
Message msg = new Message();
msg.what = UPDATE_EYES;
msg.obj = str;
EyeActivity.this.mHandler.sendMessage(msg);
Log.d("handleMessage", "send");//---
}

}
is.close();
socket.close();
} catch (Exception e) {
e.printStackTrace();
}

}

}

以上是一个handler的代码,和一个socket线程,在线程中获取字符串,发送handler截取显示出来。
问题是当数据返回的时候,myThread的Log正常打印数据,handleMessage的Log也一直在打印send,为什么handleMessage的Log打印等了3分钟才打印,而且打印了界面也不刷新数据,再等个两三分钟界面终于刷新传过来的最后一个数据,这是什么情况。。搞了一天没搞明白,为什么延时这么厉害
...全文
1275 22 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
22 条回复
切换为时间正序
请发表友善的回复…
发表回复
peakfa 2016-11-28
  • 打赏
  • 举报
回复
楼主请问题解决了吗?我也是在 handleMessage 做了一个耗时操作没法执行完毕有没有解决办法
那个发饰 2015-05-12
  • 打赏
  • 举报
回复
引用 20 楼 PK0071 的回复:
引用 19 楼 a1030260075 的回复:
是不是线程开太多了,消耗太多系统资源,导致卡了
就一个子线程用于网络获取数据啊,不过页面里,这个Activity implements SurfaceHolder.Callback, PreviewCallback,启动摄像头拍摄,不知道是不是摄像头拍摄所导致的
你要不先把耗时的操作听了看看
PK0071 2015-05-11
  • 打赏
  • 举报
回复
引用 19 楼 a1030260075 的回复:
是不是线程开太多了,消耗太多系统资源,导致卡了
就一个子线程用于网络获取数据啊,不过页面里,这个Activity implements SurfaceHolder.Callback, PreviewCallback,启动摄像头拍摄,不知道是不是摄像头拍摄所导致的
那个发饰 2015-05-11
  • 打赏
  • 举报
回复
是不是线程开太多了,消耗太多系统资源,导致卡了
狂发飘飘 2015-05-09
  • 打赏
  • 举报
回复
我看了你的代码,我觉得问题应该在你的handle上面,一般不会延时3分钟那么长的,而且还不刷新.怀疑你的handle不是运行在主线程.
tcmakebest 2015-05-09
  • 打赏
  • 举报
回复
引用 5 楼 PK0071 的回复:
[quote=引用 4 楼 tcmakebest 的回复:] 从代码上看连接的是TCP数据流,这样的话就应该防止大多数人自以为的情形: 1 对方发送几次,这边就收到几次 2 对方发送几个字节,这边就肯定一次性收到几个字节. TCP能够保证数据不丢并且连续,但它不保证哪几个字节总是一起被收到,它们可能是分批依次到达,也或者许多数据首尾连接一起到达.
每个str打印出来都有看到数据,就是sendMessage之后, handleMessage很久才进入,大概两三分钟,虽然说异步但,隔这么久才调用的,真正显示一个数在界面要5分钟,但是5分钟前已经成功send出去了[/quote] 我感觉那个长度32的判断是有疑问的,还有就是那个readline,楼主确定有换行符么
PK0071 2015-05-09
  • 打赏
  • 举报
回复
引用 16 楼 Green_shing 的回复:
我看了你的代码,我觉得问题应该在你的handle上面,一般不会延时3分钟那么长的,而且还不刷新.怀疑你的handle不是运行在主线程.
引用 16 楼 Green_shing 的回复:
我看了你的代码,我觉得问题应该在你的handle上面,一般不会延时3分钟那么长的,而且还不刷新.怀疑你的handle不是运行在主线程.
handler在onCreate的外面定义的,相当于类变量的位置
PK0071 2015-05-09
  • 打赏
  • 举报
回复
引用 13 楼 u011466828 的回复:
你要是想显示最后一个数据,那就读到最后一个数据才setText一次啊。 主要是你瞬间sendMessage 100多次,主线程处理不来。
我只取最后一条发,send的时间与界面刷新的时间,也是隔了好几分钟
PK0071 2015-05-08
  • 打赏
  • 举报
回复
引用 13 楼 u011466828 的回复:
你要是想显示最后一个数据,那就读到最后一个数据才setText一次啊。 主要是你瞬间sendMessage 100多次,主线程处理不来。
功能上来说都要显示一遍的
喝雪碧肚疼 2015-05-08
  • 打赏
  • 举报
回复
你要是想显示最后一个数据,那就读到最后一个数据才setText一次啊。 主要是你瞬间sendMessage 100多次,主线程处理不来。
PK0071 2015-05-08
  • 打赏
  • 举报
回复
引用 10 楼 u011466828 的回复:
[quote=引用 9 楼 PK0071 的回复:] [quote=引用 7 楼 u011466828 的回复:] if (str.length() == 32) { Message msg = new Message(); msg.what = UPDATE_EYES; msg.obj = str; EyeActivity.this.mHandler.sendMessage(msg); Log.d("handleMessage", "send");//--- } } 这部分代码是每次都执行?也就是说每次都等于32?
长度等于32的就是带有数值的,带有数值的Log都会打印出send,说明sendMessage执行了,就是handleMessage要等3分钟才执行到,总共也才100来条数据,不知道哪里有问题[/quote] 。。。100多条,每次都setText,能显示才怪了。建议修改显示的逻辑。[/quote] 额,怎么修改呢
PK0071 2015-05-08
  • 打赏
  • 举报
回复
引用 8 楼 tcmakebest 的回复:
看一下Log的时间就知道到底是什时候调用的.是不是与看到它显示出来的时间相同.
Log的时间与send的时间差大概三分钟。。。
喝雪碧肚疼 2015-05-08
  • 打赏
  • 举报
回复
引用 9 楼 PK0071 的回复:
[quote=引用 7 楼 u011466828 的回复:] if (str.length() == 32) { Message msg = new Message(); msg.what = UPDATE_EYES; msg.obj = str; EyeActivity.this.mHandler.sendMessage(msg); Log.d("handleMessage", "send");//--- } } 这部分代码是每次都执行?也就是说每次都等于32?
长度等于32的就是带有数值的,带有数值的Log都会打印出send,说明sendMessage执行了,就是handleMessage要等3分钟才执行到,总共也才100来条数据,不知道哪里有问题[/quote] 。。。100多条,每次都setText,能显示才怪了。建议修改显示的逻辑。
PK0071 2015-05-08
  • 打赏
  • 举报
回复
引用 7 楼 u011466828 的回复:
if (str.length() == 32) { Message msg = new Message(); msg.what = UPDATE_EYES; msg.obj = str; EyeActivity.this.mHandler.sendMessage(msg); Log.d("handleMessage", "send");//--- } } 这部分代码是每次都执行?也就是说每次都等于32?
长度等于32的就是带有数值的,带有数值的Log都会打印出send,说明sendMessage执行了,就是handleMessage要等3分钟才执行到,总共也才100来条数据,不知道哪里有问题
tcmakebest 2015-05-08
  • 打赏
  • 举报
回复
看一下Log的时间就知道到底是什时候调用的.是不是与看到它显示出来的时间相同.
喝雪碧肚疼 2015-05-08
  • 打赏
  • 举报
回复
if (str.length() == 32) { Message msg = new Message(); msg.what = UPDATE_EYES; msg.obj = str; EyeActivity.this.mHandler.sendMessage(msg); Log.d("handleMessage", "send");//--- } } 这部分代码是每次都执行?也就是说每次都等于32?
PK0071 2015-05-08
  • 打赏
  • 举报
回复
引用 3 楼 u011466828 的回复:
[quote=引用 2 楼 PK0071 的回复:] [quote=引用 1 楼 u011466828 的回复:] str == null 时,为什么要break,不是continue么?
==null说明后面没数据了,就跳出来[/quote] o,看错了。 那你是否确定在线程运行时,str==null是最后才执行。或者可以Log一下str==null的执行。 没看到你的调用线程的代码,没法判断情况。[/quote] 我的意思是,线程的数据正常获取了,.sendMessage也执行了,就是很久才看到handleMessage里面的Log打印出来,正常来说不应该这么久的
PK0071 2015-05-08
  • 打赏
  • 举报
回复
引用 4 楼 tcmakebest 的回复:
从代码上看连接的是TCP数据流,这样的话就应该防止大多数人自以为的情形: 1 对方发送几次,这边就收到几次 2 对方发送几个字节,这边就肯定一次性收到几个字节. TCP能够保证数据不丢并且连续,但它不保证哪几个字节总是一起被收到,它们可能是分批依次到达,也或者许多数据首尾连接一起到达.
每个str打印出来都有看到数据,就是sendMessage之后, handleMessage很久才进入,大概两三分钟,虽然说异步但,隔这么久才调用的,真正显示一个数在界面要5分钟,但是5分钟前已经成功send出去了
tcmakebest 2015-05-08
  • 打赏
  • 举报
回复
从代码上看连接的是TCP数据流,这样的话就应该防止大多数人自以为的情形: 1 对方发送几次,这边就收到几次 2 对方发送几个字节,这边就肯定一次性收到几个字节. TCP能够保证数据不丢并且连续,但它不保证哪几个字节总是一起被收到,它们可能是分批依次到达,也或者许多数据首尾连接一起到达.
喝雪碧肚疼 2015-05-08
  • 打赏
  • 举报
回复
引用 2 楼 PK0071 的回复:
[quote=引用 1 楼 u011466828 的回复:] str == null 时,为什么要break,不是continue么?
==null说明后面没数据了,就跳出来[/quote] o,看错了。 那你是否确定在线程运行时,str==null是最后才执行。或者可以Log一下str==null的执行。 没看到你的调用线程的代码,没法判断情况。
加载更多回复(2)

80,472

社区成员

发帖
与我相关
我的任务
社区描述
移动平台 Android
androidandroid-studioandroidx 技术论坛(原bbs)
社区管理员
  • Android
  • yechaoa
  • 失落夏天
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧