Есть ли лучший способ периодически обновлять интерфейс - PullRequest
0 голосов
/ 12 апреля 2019

На экране у меня отображается индикатор состояния или принтер для отображения подключен или нет. И мне интересно узнать, как лучше всего реализовать это с наилучшей производительностью.

Я пытался создать Handler объект и вызвать postDelayed(Runnable r, long delayMillis), и он работает как положено:

Инициация 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 будет выполнен в основном потоке пользовательского интерфейса.

Есть ли лучший способ сделать это, или я уже использую лучший способ сделать это? Не выполнять весь код в основном потоке пользовательского интерфейса, а только, например, someView.setImageResource(someID)

1 Ответ

0 голосов
/ 12 апреля 2019

Вы можете запустить свой код в фоновом потоке, используя по крайней мере 3 из следующих опций:

  1. Использование RxJava ;
  2. Использование пользовательского класса, такого как this ;
  3. Если вы используете Kotlin, то сопрограммы;

Есть и другие способы сделать это.RxJava обладает большим потенциалом в долгосрочной перспективе, если вы намерены значительно расширить свой проект.Кроме того, у него гораздо более крутая кривая обучения.

Второе решение отлично подходит для небольших и средних проектов и является самым простым наряду с сопрограммами.

После добавления класса AppExecutors (2-е решение) выбудет использовать это так:

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

Дайте мне знать, если я могу помочь!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...