Android - 在线程之间传递数据

时间:2015-02-15 14:16:46

标签: android multithreading pipeline

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

3 个答案:

答案 0 :(得分:2)

正如其他人所指出的,这实际上取决于你的任务。我建议使用Message。例如,如果你的一个线程是所述byte []数据的生产者而另一个是消费者,那么你可能会有类似的东西:

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();
      }

请记住,这可能不是最好使用的模式,因为SO的其他许多人都指出扩展Thread并不是最好的想法,但它通常取决于用例。

答案 1 :(得分:0)

让我们说两个线程是T1和T2。我们假设我们使用单独的AsyncTasks A1和A2来实现它们。现在从A1的onPostExecuteMethod执行A2,将必要的参数传递给execute方法。这工作正常,因为onPostExecute方法在前台运行并且相对于ui线程运行,因此A2仅在A时执行!已完成执行。

答案 2 :(得分:0)

因为你在谈论大量数据。最好的方法是将byte []包装在Object中。您可以自己创建自定义类,但大多数人使用ByteBuffer,因为它已经有一个很好的操作API,可以与Java NIO子系统一起使用。

相关问题