Android串口通讯,在线程里一直监听是否有消息发来,接收到消息到runOnUiThread处理跳转页面,页面跳转关闭之后,在发送消息尽然还会执行在打开页面?

Mr_常 2016-06-06 04:45:02
我写了一个线程,在线程里死循环一直在监听接收单片机给我发来的消息,接收到之后,进到处理数据的方法里,方法里面有个runOnUiThread线程,用来更新ui信息,当接收到我需要跳转页面的信息时,执行跳转页面,并关闭当前页面(activity1)。但是跳转之后,在新页面(activity2)接收消息,它尽然会在activity1页面在接收一次,在次执行了一遍跳转之前的代码。之后就会恢复正常。
也就是说,activity1页面如果是执行跳转activity2页面的话,它会吧同一个页面打开两次。如果在activity1页面在跳转前还有接收显示信息的话,那么我接收5条信息,第一次接收它会在activity1页面显示,跳转之后我在activity2页面在发送接收5条信息,它还是会在activity1页面接收,但之后就好正常了。
下面是源码:
private class ReadThread extends Thread {

@Override
public void run() {
super.run();

while (!isInterrupted()) {
int size;
try {
byte[] buffer = new byte[30];
if (mInputStream == null)
return;


mInputStream.read(buffer);
size=Integer.parseInt(Integer.toHexString(buffer[2]))+3;
if (size > 3) {
onDataReceived(buffer, size);
}
} catch (IOException e) {
e.printStackTrace();
return;
}
}

}
}

void onDataReceived(final byte[] buffer, final int size) {
// TODO Auto-generated method stub
runOnUiThread(new Runnable() {

@Override
public void run() {

Toast.makeText(getApplicationContext(), "接收成功"+reString,
Toast.LENGTH_SHORT).show();

Intent intent=new Intent(Main1Activity.this,Main2Activity.class);
startActivity(intent);
Main2Activity.this.finish();

}
});
...全文
791 14 打赏 收藏 举报
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
fan3535 2017-08-07
  • 打赏
  • 举报
回复
博主解决了吗?
Mr_常 2016-06-12
  • 打赏
  • 举报
回复
引用 11 楼 crazyman2010 的回复:
跟据你的描述,应该是读取的操作没有被中断,所以线程还在跑。 那么解决办法是中断那个读的操作,保证线程退出。
你好,根据你的说发,我已经在onDestroy()加上了mInputStream.close();,可是结果依旧……如下代码, protected void onDestroy() { isStop=true; if (mReadThread != null) mReadThread.interrupt(); try { mInputStream.close(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } mApplication.closeSerialPort(); mSerialPort = null; super.onDestroy(); } 并且onDestroy()这段代码,已经执行了!
M_O_ 2016-06-12
  • 打赏
  • 举报
回复
onDestroy() 执行完之后,线程有退出吗? 可以加上打印看看
M_O_ 2016-06-08
  • 打赏
  • 举报
回复
跟据你的描述,应该是读取的操作没有被中断,所以线程还在跑。 那么解决办法是中断那个读的操作,保证线程退出。
M_O_ 2016-06-08
  • 打赏
  • 举报
回复
你可以打印,确保你的线程退出了,如果没有退出,再查找原因 如果 mInputStream.read(buffer); 会阻塞到下次数据来临,即使你while (!isStop&&!isInterrupted()) ,也没有用的
Mr_常 2016-06-08
  • 打赏
  • 举报
回复
引用 7 楼 crazyman2010 的回复:
6楼说的得有些道理,Thread.interrupt()并没有中断线程的执行,如果你的线程代码,不支持被中断,那么它会一直运行下去
我看过log日志,页面跳转之后它又执行了一次,也就只执行一次,就不会再工作了
Mr_常 2016-06-08
  • 打赏
  • 举报
回复
引用 6 楼 ZuiHouDeJueQiang 的回复:
Thread.interrupt()并没有什么暖用。自己写个flag条件停止线程吧。
不行,我试过了,及时这样都不行 private class ReadThread extends Thread { @Override public void run() { super.run(); while (!isStop&&!isInterrupted()) { int size; try { byte[] buffer = new byte[30]; if (mInputStream == null) return; mInputStream.read(buffer); //根据数据协议规则,判断每条数据的长度 size=Integer.parseInt(Integer.toHexString(buffer[2]))+3; if (size > 3) { onDataReceived(buffer, size); //调用更新UI方法 } Thread.sleep(10); } catch (Exception e) { e.printStackTrace(); return; } } } }
M_O_ 2016-06-08
  • 打赏
  • 举报
回复
6楼说的得有些道理,Thread.interrupt()并没有中断线程的执行,如果你的线程代码,不支持被中断,那么它会一直运行下去
ZuiHouDeJueQiang 2016-06-08
  • 打赏
  • 举报
回复
Thread.interrupt()并没有什么暖用。自己写个flag条件停止线程吧。
柯震惊 2016-06-06
  • 打赏
  • 举报
回复
看起来runOnUiThread和ReadThread没关系
Mr_常 2016-06-06
  • 打赏
  • 举报
回复
还有就是,我已经在onDestroy()方法里面给线程做了结束判断 @Override protected void onDestroy() { if (mReadThread != null) mReadThread.interrupt(); }
Mr_常 2016-06-06
  • 打赏
  • 举报
回复
写贴的时候,写错了。 是Main1Activity.this.finish();
ink_s 2016-06-06
  • 打赏
  • 举报
回复
Intent intent=new Intent(Main1Activity.this,Main2Activity.class); startActivity(intent); Main2Activity.this.finish(); 你这不是刚打开Main2Activity 又把Main2Activity finish 了吗
ink_s 2016-06-06
  • 打赏
  • 举报
回复
你activity1关闭了 但是线程没关闭吧

80,490

社区成员

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

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