是否有更好的方法定期更新UI

问题描述 投票:0回答:1

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

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

Init 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()mPrinterUpdaterRunnable方法中的所有代码都将在主UI线程中执行。

有没有更好的方法来做到这一点,或者我已经使用最好的方法来做到这一点?不在主UI线程中执行所有代码,仅用于someView.setImageResource(someID)

java android multithreading performance android-handler
1个回答
0
投票

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

  1. 使用RxJava;
  2. 使用像this这样的自定义类;
  3. 如果使用Kotlin,那么Coroutines;

还有其他方法可以做到这一点。如果您打算大量增加项目,RxJava的长期潜力更大。此外,这有一个非常陡峭的学习曲线。

第二种解决方案非常适合中小型项目,而最简单的项目与Coroutines一起使用。

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

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

如果我能帮忙,请告诉我!

© www.soinside.com 2019 - 2024. All rights reserved.