2015-02-15 3 views
3

Мне нужно передать огромное количество данных (сырых байтов) между потоками - потоком прослушивателя и другим потоком, который обрабатывает данные. Какой лучший и быстрый способ сделать это?Android - передача данных между потоками

+0

Ваш вопрос слишком расплывчатый, чтобы дать конкретный ответ. Поскольку вы, похоже, хотите какой-то трубопровод, посмотрите [PipedInputStream] (http://docs.oracle.com/javase/7/docs/api/java/io/PipedInputStream.html). Это так же специфично, как и получается. –

ответ

0

Скажем, эти два потока являются T1 и T2. Скажем, мы реализуем их, используя отдельные AsyncTasks A1 и A2. Теперь выполните A2 из метода onPostExecuteM1, передающего необходимые параметры методу execute. Это отлично работает, потому что метод onPostExecute работает на переднем плане и по отношению к нити ui, так что A2 выполняется только тогда, когда A! завершил выполнение.

0

Поскольку вы говорите о большом количестве данных. Лучший способ - обернуть ваш байт [] в Object. Вы можете сделать свой собственный пользовательский класс, но большинство людей используют ByteBuffer, потому что он уже имеет хороший API манипуляции и может использоваться с подсистемой Java NIO.

2

Как уже указывалось, это действительно зависит от вашей задачи. Я бы предложил использовать 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, но обычно это зависит от варианта использования.

Смежные вопросы