Android更新ui线程元素 - 最佳实践?

时间:2014-02-07 18:23:30

标签: android ui-thread handlers

我有一个应用程序,显示一些测量值,如温度,速度等。

我想或多或少地坚持MVC模式,所以我得到的东西在它们出现时(从蓝牙组件)接收值并将它们分类到特殊值处理程序。那些应该计算东西等等(来自地理坐标的速度等)并将值传递给View组件,它扩展了活动并且应该打印值。一些值处理程序将在它们自己的线程中,或者整个值处理程序事物将是一个单独的线程。

所以首先我尝试了“runOnUIThread”,但这并不像我想要的那样导致很多值在UI线程中没有其他任何事情发生,而且它不是MVC模式的想法。

然后我考虑了处理程序,但是我遇到了一个问题,我无法从其他线程“找到”处理程序,因此我必须将其传递掉,这是我需要做的很多标题更改。

然后我想到了一个静态方法的私有类,可以从任何地方访问,但如果这很聪明,那就不知道了。

你有什么建议,可以给我一些例子吗?

1 个答案:

答案 0 :(得分: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);
}

然后你应该在接收值bluetooth并在那里实现回调接口的类中创建一个AsyncTask实例。

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

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