首页 新闻 会员 周边

Android。在无限循环的线程中创建Message对象,无限出现GC调用。

0
悬赏园豆:30 [已解决问题] 解决于 2015-03-03 10:26

我在Android开发中。开启了一个线程,这个线程是无限循环的。并且在这个线程里,我通过创建Handle的Message对象,然后handler.sendMessage(msg)。可是这样一来,LOGCat上就一直出现GC_CONCURRENT。请问我该怎么修改代码,或者用哪种方式才能即实现功能,又能减少GC的调用。

具体代码如下:

//线程
private class getData_thread extends Thread {
private Handler handler;
public read_thread(Handler h) {
this.handler = h;
}
Message msg = null;
@Override
public void run() {
while (READ_FLAG) {
msg = Message.obtain();
msg.obj = getData();
handler.sendMessage(msg);
super.run();
}
}
}

 

private static class dataHandler extends Handler{

@Override
public void handleMessage(Message msg) {
if (msg.obj != null) {
disposeData((byte[]) msg.obj);
}

super.handleMessage(msg);
}
}

车边の小站的主页 车边の小站 | 初学一级 | 园豆:175
提问于:2015-02-05 11:35
< >
分享
最佳答案
0

先说一下你的核心需求是什么,你的getData执行的是什么操作?

收获园豆:30
林J | 菜鸟二级 |园豆:202 | 2015-02-05 15:16

getData()是调用背地方法读取硬件信息的一个方法。我是开启一个线程,进行读取这个硬件的信息,然后将这个信息发送给HANDLER进行处理。基本上就是这么个流程。

车边の小站 | 园豆:175 (初学一级) | 2015-02-05 15:25

@车边の小站:那这个getData是个无阻塞的方法对吗?

如果是个无阻塞的并且执行速度很快的方法,你的写法占内存很正常,而且需求也不是非常实时的获取这个硬件信息。推荐两种解决方案:

1.直接在while里加个Thread.sleep(100)操作。

2.使用Handler.postDelayed(runnal,delayMillis),设置延时任务,你的runnal内部根据READ_FLAG判断是否要继续调用Handler.postDelayed(runnal,delayMillis)实现循环。

推荐第二种。

如果你的需求是要实时获取硬件信息,并且在硬件信息更改时第一时间获取,更好的解决方案是通过回调函数主动通知主线程。

林J | 园豆:202 (菜鸟二级) | 2015-02-05 15:36
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册