qq_35071078
下课睡觉
采纳率45.7%
2017-05-22 07:22 阅读 1.4k

android 如何停止处于I/O状态的线程?

我又一个线程,读数据的线程,线程执行到这句话就会阻塞

 Log.e("info", "****************正 在 读 取****************");
                    size = mInputStream.read(buffer);

但是我想在activity退出的时候结束掉这个线程。
网上说不建议使用.stop来结束线程。我就用了interrupt,但是没有没有抛出中断的异常。
我又让哪个Thread 实现了InterruptibleChannel接口,也没有用啊。
这是actiity 的onDestroy的方法:

     /**
     * activity销毁的时候关闭串口
     */
    @Override
    protected void onDestroy() {
        //mReadThread就是读数数据的线程
        if (mReadThread != null) {
            canRead = false;
            mReadThread.interrupt();
        }
        //mInputStream就是读取数据的流
        if (mInputStream!=null){
            try {
                mInputStream.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
        handler.removeCallbacksAndMessages(null);
        handler = null;

        closeSerialPort();
        super.onDestroy();
    }
  • 点赞
  • 写回答
  • 关注问题
  • 收藏
  • 复制链接分享

4条回答 默认 最新

  • 已采纳
    oyljerry oyljerry 2017-05-22 07:38

    你这个阻塞在read了,所以线程不能中断,你需要调用read的非阻塞接口,就不会一直阻塞在I/O。当你想结束的时候,可以让线程退出。

    点赞 1 评论 复制链接分享
  • oyljerry oyljerry 2017-05-22 08:27

    用NIO等接口。

    或者用一些其他方法来让它退出
    http://stackoverflow.com/questions/6579539/how-to-unblock-inputstream-read-on-android

    点赞 1 评论 复制链接分享
  • dcxy0 Q544471255 2017-05-22 08:29
    点赞 1 评论 复制链接分享
  • qq_35071078 下课睡觉 2017-05-22 12:10

    谢谢,我知道为什么了。因为这个InputStram 我是用c语言获取的 FileDescriptor对象,获取的时候我设置的是阻塞的方式,所以在java里close也close不掉。
    fd = open(path_utf, O_RDWR | flags | O_NDELAY);

    现在我改成这样就ok了

    点赞 评论 复制链接分享

相关推荐