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



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

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

因此,首先我尝试了"runOnUIThread",但这并不是我想要的,因为有了很多值,UI线程中就不会发生其他事情,也不在MVC模式的理念中。

然后我考虑了处理程序,但我遇到了一个问题,我无法从另一个线程"找到"处理程序,所以我必须将其传递出去,这是我必须做的大量头更改。

然后我想到了一个带有静态方法的私有类,它可以从任何地方访问,但不知道这是否明智。

你有什么建议?你能给我举个例子吗?

您尝试过AsyncTask吗?您可以创建一个扩展AsyncTask并包含一个简单回调接口的类,类似于:

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

现在,从AsyncTask重写doInBackground()方法,并将计算的程序逻辑放入其中。

@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);

最新更新