在屏幕上,我显示状态指示器或要显示的打印机是否已连接。而且我很想知道用最佳性能实现它的最佳方法是什么。
我试图创建Handler
对象并调用postDelayed(Runnable r, long delayMillis)
,它按预期工作:
Init Handler
和Runnable
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)
您可以使用以下至少3个选项在后台线程中运行代码:
还有其他方法可以做到这一点。如果您打算大量增加项目,RxJava的长期潜力更大。此外,这有一个非常陡峭的学习曲线。
第二种解决方案非常适合中小型项目,而最简单的项目与Coroutines一起使用。
添加AppExecutors类(第二个解决方案)后,您将使用它:
new AppExecutor().diskIO().execute(new Runnable() {
@Override
public void run() {
// Do your stuff
}
});
如果我能帮忙,请告诉我!