有没有更好的方法来定期更新UI

时间:2019-04-12 15:18:52

标签: java android multithreading performance android-handler

在屏幕上,我显示状态指示器或要显示的打印机已连接。而且我想知道以最佳性能实现它的最佳方法。

我尝试创建Handler对象并调用postDelayed(Runnable r, long delayMillis),它可以按预期工作:

初始化HandlerRunnable


private static final int SOME_INTERVAL = 10000;
private Handler mHandler = new Handler();

private Runnable mPrinterUpdaterRunnable = new Runnable() {
        @Override
        public void run() {
            updatePrinterIndicator(); \\ do some stuff
            mHandler.postDelayed(this, SOME_INTERVAL);
        }
    };

private void updatePrinterIndicator() {
        // check printer status and update some view for instance ImageView
    }

在那之后,我需要在活动启动时启动Handler,并在用户离开活动时删除所有回调,所以我写:

@Override
public void onResume() {
    super.onResume();
    mHandler.postDelayed(mPrinterUpdaterRunnable , 0);
}

@Override
public void onPause() {
    mHandler.removeCallbacksAndMessages(null);
    super.onPause();
}

因此,如果我正确理解run()的{​​{1}}方法中的所有代码,则会在主UI线程中执行。

是否有更好的方法来执行此操作,或者我已经使用最佳方法来执行此操作?不只在实例mPrinterUpdaterRunnable

中执行主UI线程中的所有代码

1 个答案:

答案 0 :(得分:0)

您可以至少使用以下三个选项在后台线程中运行代码:

  1. 使用RxJava;
  2. 使用自定义类,例如this;
  3. 如果使用Kotlin,则使用协程;

还有其他方法可以做到这一点。如果您打算大量扩展项目,那么从长远来看,RxJava具有更大的潜力。而且,它的学习曲线要​​陡得多。

第二种解决方案非常适合中小型项目,最容易与协程一起使用。

添加AppExecutors类(第二种解决方案)后,您将像这样使用它:

new AppExecutor().diskIO().execute(new Runnable() {
        @Override
        public void run() {
            // Do your stuff
        }
    });

让我知道我是否可以帮忙!