【问题标题】:Android updating ui thread elements - best practice?Android 更新 ui 线程元素 - 最佳实践?
【发布时间】:2014-02-07 18:23:29
【问题描述】:

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

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

所以首先我尝试了“runOnUIThread”,但这不是我想要的,因为它有很多值,在 UI 线程中不会发生任何其他事情,而且它不在 MVC 模式的理念中。

然后我想到了处理程序,但我遇到了我无法从另一个线程“找到”处理程序的问题,所以我必须将它传递给我,这是我必须做的很多标题更改。

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

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

【问题讨论】:

    标签: android ui-thread handlers


    【解决方案1】:

    你试过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);
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2010-10-14
      • 1970-01-01
      • 1970-01-01
      • 2011-03-16
      • 2012-02-24
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多