Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/228.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在Android/Java中从两个不同线程写入/读取字符串数据_Java_Android_String_Multithreading - Fatal编程技术网

如何在Android/Java中从两个不同线程写入/读取字符串数据

如何在Android/Java中从两个不同线程写入/读取字符串数据,java,android,string,multithreading,Java,Android,String,Multithreading,我有一个Android应用程序,它从线程a中的可编程设备接收ASCII字符串(因此字符串中的每个字符对应一个字节) 这些字符串以最大长度的块形式出现。例如,假设最大长度为4,我们收到以下字符串: “ABCD”(4)、“EFGH”(4)、“I\r\n”(3) 另一方面,我有另一个线程B,它需要读取这些字符串,但作为一个完整的行。在本例中,在接收到所有三个数据包后,此线程应读取一行: “ABCDEFGHI” 我的第一个赌注是使用公共底层BlockingQueue实现自定义InputStream和Ou

我有一个Android应用程序,它从线程a中的可编程设备接收ASCII字符串(因此字符串中的每个字符对应一个字节)

这些字符串以最大长度的块形式出现。例如,假设最大长度为4,我们收到以下字符串:

“ABCD”(4)、“EFGH”(4)、“I\r\n”(3)

另一方面,我有另一个线程B,它需要读取这些字符串,但作为一个完整的行。在本例中,在接收到所有三个数据包后,此线程应读取一行:

“ABCDEFGHI”

我的第一个赌注是使用公共底层BlockingQueue实现自定义InputStream和OutputStream。然后使用OutputStreamWriter在线程A中写入传入字符串,使用BufferedStream中包装的InputStreamReader使用线程B中的readLine()函数,但它不起作用

我可以看到,在线程A上使用自定义OutputStream时,字节(块)被添加到队列中,但当我从线程B调用readLine()时,它会阻塞并且永远不会返回字符串,即使我知道已将完整的行添加到基础队列中

我很确定我正在重新发明轮子,但我在网上搜索时一直找不到一个明确的答案。在Java/Android中一定有更好的方法来实现这一点。这听起来像是一种非常普遍的模式


我主要是用C#做事情,所以可能会错过一些课程。我也查看了ByteBuffer,但这样做似乎迫使我实现自己的readLine()函数,因为BufferedReader等没有要使用的InputStream。

您可以使用轻松地在线程之间发送数据

Greenrobot的EventBus是一个允许组件(活动、片段、服务和线程)之间通信的库

格雷德尔先生

dependencies {      
    compile 'org.greenrobot:eventbus:3.0.0'     
}
1。侦听器(线程A)

2。主线程(线程B-从线程A读取数据)

用户还需要在总线上注册和注销自己。只有在注册订阅服务器时,它们才会接收事件。在Android中,在活动和片段中,您通常应该根据它们的生命周期进行注册。在大多数情况下,onStart/onStop工作正常:

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


    EventBus.getDefault().register(this);
}

@Override
public void onStop() {
    EventBus.getDefault().unregister(this);

    super.onStop();
}
订阅者实现事件处理方法(也称为“订阅者方法”),在发布事件时将调用这些方法。这些是用@Subscribe注释定义的

@Subscribe(threadMode = ThreadMode.MAIN)
public void onMessage(ValidModal) {
    // You will get valid data from thread A here.
    //..
}

根据Ted Hopp的建议,我最终使用了PipedInputStreamPipedOutStream(包装在OutputStreamWriter和BufferedReader中)


它就像一个符咒,完全符合我的需要。谢谢大家!

不看代码就很难知道出了什么问题。您是否正在刷新输出流,以使输出不会卡在某个缓冲区中?您可能还想看看使用if I/O流。是的,我正在刷新我的输出流。我可以看到字节进入底层队列。无论如何,这个问题更多地与“好的”、“最好的”或“首选的”做我需要的事情的方式有关,而不是与我的自定义实现有关。谢谢,肯定有东西要看。非常感谢。
@Subscribe(threadMode = ThreadMode.MAIN)
public void onMessage(ValidModal) {
    // You will get valid data from thread A here.
    //..
}