Мне нужно передать огромное количество данных (сырых байтов) между потоками - потоком прослушивателя и другим потоком, который обрабатывает данные. Какой лучший и быстрый способ сделать это?Android - передача данных между потоками
ответ
Скажем, эти два потока являются T1 и T2. Скажем, мы реализуем их, используя отдельные AsyncTasks A1 и A2. Теперь выполните A2 из метода onPostExecuteM1, передающего необходимые параметры методу execute. Это отлично работает, потому что метод onPostExecute работает на переднем плане и по отношению к нити ui, так что A2 выполняется только тогда, когда A! завершил выполнение.
Поскольку вы говорите о большом количестве данных. Лучший способ - обернуть ваш байт [] в Object. Вы можете сделать свой собственный пользовательский класс, но большинство людей используют ByteBuffer, потому что он уже имеет хороший API манипуляции и может использоваться с подсистемой Java NIO.
Как уже указывалось, это действительно зависит от вашей задачи. Я бы предложил использовать Message. Например, если один из ваших потоков является производителем указанных байт [] данных, а другой потребитель может иметь что-то из рода:
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();
}
Keep в виду, однако, что это не может быть лучшим образцом для использования, так как многие в другом месте на SO указывают, что это не лучшая идея продлить Thread, но обычно это зависит от варианта использования.
- 1. Передача данных между потоками
- 2. C++ - Передача данных между потоками
- 3. Передача данных между потоками ThreadPool
- 4. Передача изменяемых данных между потоками
- 5. Передача данных между потоками eventfd
- 6. Передача данных асинхронно между потоками в Java
- 7. Передача NSManagedObjectContext между потоками
- 8. передача данных между потоками в java
- 9. Передача данных между потоками в Java?
- 10. Grand Central Dispatch - Передача данных между потоками
- 11. Передача данных между потоками в C#
- 12. C# Передача данных между потоками, легко
- 13. Передача значений между двумя потоками
- 14. Передача набора объектов между потоками
- 15. Передача рабочего элемента между потоками (Java)
- 16. QT 4.3 Передача указателя класса между потоками
- 17. Передача данных между действиями Android
- 18. Android: Передача данных между действиями
- 19. Передача данных между устройствами Android
- 20. Передача данных между BroadcastReceivers Android?
- 21. Android: передача данных между видами
- 22. Проблема с несколькими потоками - Передача объектов между потоками
- 23. Точки факела - Передача данных между основными и потоками один раз
- 24. Передача сообщения между потоками в C
- 25. Передача сообщений между потоками и управлением памятью
- 26. Передача очереди между потоками в C++
- 27. Передача переменных между потоками в Java
- 28. Синхронизация/отправка данных между потоками
- 29. Синхронизация данных между многими потоками
- 30. Android: Передача данных между сервисом и активностью
Ваш вопрос слишком расплывчатый, чтобы дать конкретный ответ. Поскольку вы, похоже, хотите какой-то трубопровод, посмотрите [PipedInputStream] (http://docs.oracle.com/javase/7/docs/api/java/io/PipedInputStream.html). Это так же специфично, как и получается. –