2014-02-07 2 views
2

У меня есть приложение, которое показывает некоторые значения измерения, такие как температура, скорость и т. Д.Обновление Android ui элементов нити - лучшая практика?

Я хочу придерживаться более или менее шаблона MVC, чтобы получить что-то, получающее значения, когда они появляются (от компонента bluetooth), и сортирует их по специальным обработчикам значений. они должны вычислять материал и т. д. (скорость от геокоординат и т. д.) и передавать значения в компонент «Вид», который расширяет активность и должен печатать значения. Некоторые из обработчиков значений будут в их собственном потоке, или, может быть, весь объект обработчика значений будет одним единственным потоком.

Итак, сначала я попробовал «runOnUIThread», но это не так, как я хочу, потому что это связано со многими значениями, ничего не произойдет в потоке пользовательского интерфейса, и это не идея шаблона MVC.

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

Тогда я подумал о частном классе со статическими методами, которые могут быть доступны везде, но не знаю, если это умно.

Что вы предлагаете и можете ли вы привести примеры?

ответ

1

Вы пытались AsyncTask? Вы можете создать класс, который расширяет AsyncTask и содержит простой интерфейс обратного вызова, что-то вроде:

class CalculationTask extends AsyncTask<Integer, Integer> { 
... 
    public interface Callback{ 
     void onCalculationComplete(Integer result); 
    } 
... 
} 

Теперь переопределить doInBackground() метод из AsyncTask и поставить логику программы для расчета в нем.

@Override 
protected int doInBackground(Integer... params){ 
    makeNeededCalculation(); 
    ... 
} 

После завершения расчета, то AsyncTask будет вызывать его метод onPostExecute(). В этом методе вы можете обратиться к вашему интерфейсу обратного вызова.

@Override 
protected void onPostExecute(Integer result){ 
    mCallback.onCalculationComplete(result); 
} 

Затем вы должны создать экземпляр вашего AsyncTask в классе, который принимает значения Bluetooth и реализовать интерфейс обратного вызова там.

new CalculationTask(this, new CalculationTask.Callback(){ 

    @Override 
    public void onCalculationComplete(Integer result){ 
     mView.setText("The new value is "+result); 
    } 
}).execute(valueFromBluetooth); 
Смежные вопросы