2013-09-10 2 views
0

Мне нужна помощь. Я должен постоянно проверять byte[], полученный через bluetooth. Для этого я реализую Runnable, проблема в том, что он не возвращает byte[].Запуск альтернативы для возврата значения

Для этого я попытался реализовать Callable вместо Runnable, потому что это позволяет мне вернуть значение. Но с Callable я не могу проверить каждые 0,5сек переменную.

Итак, какой будет лучший способ обновить переменную и уметь получить ее, когда мне это нужно?

Это Runnable, что я сделал:

private final Handler refresh_handler = new Handler(); 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
super.onCreate(savedInstanceState); 


Runnable refresh_input = new Runnable() { 
    @Override 
    public void run() { 
     bt_read_input = GlobalVar.bt_input; //Save received value in a local variable 
     refresh_handler.postDelayed(refresh_input, 500); 
    } 
}; 


refresh_handler.post(refresh_input); //Call to the function 
+0

Звучит как типичная проблема производителя-потребителя. – rocketboy

+1

Что именно вы хотите сделать? – pskink

+0

Мне нужно сделать функцию, которая постоянно проверяет значение переменной и возвращает мне это значение – masmic

ответ

0

Даже если Debojit Saikia предоставил очень полезное решение, окончательный способ, которым я столкнулся этот вопрос был таким образом:

private final Runnable refresh_input = new Runnable() { 

    @Override 
    public void run() { 
     bt_read_input = GlobalVar.bt_input; 
     } 
     refresh_handler.postDelayed(refresh_input, 250); 
    } 
}; 

И когда я хочу, чтобы получить значение переменной, я просто позвонить глобальная переменная bt_read_input.

1

Вы можете решить это с помощью Blocking queues, которая поддерживает производителя потребительских шаблон проектирования. BlockingQueue будет вашим списком «делать», где Producer поместит данные (byte[]), когда станет доступным, и Consumer извлекает данные (byte[]) из очереди, когда он готов к работе с данными.

Создать Producer, который может проверить непрерывно в течение byte[] получил через Bluetooth:

class Producer implements Runnable { 
    private final BlockingQueue<byte[]> byteArrayQueue; 

    public Producer(BlockingQueue<byte[]> byteArrayQueue) { 
     this.byteArrayQueue = byteArrayQueue; 
    } 

    @Override 
    public void run() { 
      // Place your data into the queue 
     // byteArrayQueue.put(GlobalVar.bt_input);//put received value into the queue 


    } 
} 

И это Consumer что проверяет имеющиеся данные в queue и будет работать на нем:

class Consumer implements Runnable { 
    private final BlockingQueue<byte[]> byteArrayQueue; 

    public Consumer(BlockingQueue<byte[]> byteArrayQueue) { 
     this.byteArrayQueue = byteArrayQueue; 
    } 

    @Override 
    public void run() { 
     try { 
      while (true) { 
       byte[] take = byteArrayQueue.take(); 
          // DO YOUR WORK 
      } 
     } catch (InterruptedException e) { 
      Thread.currentThread().interrupt(); 
     } 

    } 
} 

Теперь запустите свои Producer и Consumer:

BlockingQueue<byte[]> queue = new LinkedBlockingQueue<byte[]>(1); 
new Thread(new Producer(queue)).start(); 
new Thread(new Consumer(queue)).start(); 
+0

Спасибо! Еще одна вещь: методы производителя и потребителя могут быть реализованы в классе потоков пользовательского интерфейса или должны выйти из него в новом классе. – masmic

+0

вы можете определить их как внутренние классы класса потока пользовательского интерфейса, потому что они будут выполняться в двух отдельных потоках. –

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