我需要在线程之间传递大量数据(原始字节) - 侦听器线程和处理数据操作的另一个线程。什么是最好和最快的方式呢?
答案 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子系统一起使用。