2014-02-07 38 views
2

我有一個應用程序,顯示一些測量值,如溫度,速度等。Android更新UI線程元素 - 最佳實踐?

我想或多或少堅持MVC模式,所以我得到的東西時,他們出現(從藍牙組件)接收值,並將其排序爲特殊值的處理程序。那些應該計算的東西等(來自地理座標等的速度)並將值傳遞給View組件,該組件擴展了活動並且應該打印這些值。一些值處理程序將在他們自己的線程中,或者整個值處理程序的東西將是一個線程。

所以首先我嘗試了「runOnUIThread」,但這不是我想要的,因爲它有很多值,在UI線程中沒有其他事情會發生,它不在MVC模式的想法中。

然後我想到了處理程序,但是我遇到了問題,我無法從其他線程「找到」處理程序,所以我必須將其傳遞,這是我必須做的很多標頭更改。

於是我想到了用靜態方法私有類,它可以到達其他地方,但不知道如果這是聰明的。

你有什麼建議,你可以給我的例子嗎?

回答

1

你試過AsyncTask?您可以創建擴展的AsyncTask,幷包含一個簡單的回調接口,像一類:

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

現在,覆蓋從AsyncTaskdoInBackground()方法,並把該程序邏輯在它的計算。

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

一旦計算完成,AsyncTask將調用它的onPostExecute()方法。在這個方法中你可以引用你的回調接口。

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

那麼你應該建立在接收值藍牙類您的AsyncTask的實例,並實現回調接口那裏。

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

    @Override 
    public void onCalculationComplete(Integer result){ 
     mView.setText("The new value is "+result); 
    } 
}).execute(valueFromBluetooth);