Android - 在线程之间传递数据

3

我需要在两个线程之间传输大量的数据(原始字节) - 监听线程和另一个处理数据操作的线程。什么是最好和最快的方法?


你的问题过于模糊,无法提供具体的答案。既然你似乎想要某种类型的管道,请查看PipedInputStream文档(http://docs.oracle.com/javase/7/docs/api/java/io/PipedInputStream.html)。这已经是最具体的回答了。 - Deepak Bala
3个回答

3
正如其他人所指出的,这真的取决于您所拥有的任务。我建议使用一个消息。例如,如果您的其中一个线程是生成器,并且另一个线程是消费者,则可以使用以下方式:
public class ProducerThread extends Thread{
    byte[] data;

    public void run(){
        while (isRunning){
            Looper.prepare(); 
            data = someMethodToGetYourByteData(); 
            Message dataToSend = Message.obtain();
            Bundle bundle = new Bundle();
            bundle.putByteArray("data", data);
            dataToSend.setData(bundle);
            if (ConsumerThread.mHandler!=null){  
               ConsumerThread.mHandler.sendMessage(dataToSend);
            }
            Looper.loop();  
         }
     }

以及你的消费者线程:

public class ConsumerThread extends Thread{
    public static Handler mHandler;  
    byte[] data;

    public void run(){
       while (running){
          Looper.prepare();
          mHandler = new Handler(){
            @Override
            public void handleMessage(Message msg) {
                super.handleMessage(msg);
                mHandler.obtainMessage();
                data = msg.getData().getFloatArray("data");
                doSomethingWithData(data);
           };
         }
         Looper.loop();
      }

请记住,这可能不是最好的模式,因为许多人在其他地方指出,扩展线程并不是最好的想法,但通常取决于用例。


0
假设有两个线程T1和T2。我们使用单独的AsyncTasks A1和A2来实现它们。现在,在A1的onPostExecute方法中执行A2,并将必要的参数传递给execute方法。这样做是可行的,因为onPostExecute方法在前台运行,并且相对于UI线程,所以只有当A1完成执行后,A2才会被执行。

0

既然你谈到了大量数据,最好的方法是将byte[]封装在一个对象中。你可以自己创建自定义类,但大多数人使用ByteBuffer,因为它已经有了良好的操作API,并且可以与Java NIO子系统一起使用。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接