Лучшая практика для создания потока, который запускается каждый час в Android? - PullRequest
0 голосов
/ 30 мая 2020

Итак, я пытаюсь создать фоновую задачу, которую нужно запускать каждый час в приложении Android. Это довольно сложная задача, которая занимает около 5-10 минут, чтобы завершить sh, и прямо сейчас она работает в потоке пользовательского интерфейса, что, конечно, не очень хорошо, потому что вешает все приложение. Я попытался сделать следующее в моем MainActivity onCreate:

new Thread(new Runnable() {

    private Handler HeavyTaskHandler = new Handler(Looper.getMainLooper());

    public void run(){
        final TextView updatedTxt = findViewById(R.id.txt);
        updatedTxt.post(new Runnable() {
            @Override
            public void run() {
                updatedTxt.setText("Performing cleanup..");
            }
        });

        HeavyTask(); // <-- This method runs for 5 - 10 minutes

        updatedTxt.post(new Runnable() {
            @Override
            public void run() {
                updatedTxt.setText("Done..");
            }
        });

        HeavyTaskHandler.postDelayed(this, HeavyTaskCycle);
    }
}).start();

У меня две проблемы с указанным выше

  • Он отлично работает в первый раз, и задача выполняется в фон хорошо, не вешая поток пользовательского интерфейса. Однако после этого первого раза и при следующем запуске поток пользовательского интерфейса снова зависает при запуске. Что мне не хватает?
  • Обратите внимание, что перед вызовом метода HeavyTask () я пытаюсь установить текст TextViews на «Выполнение очистки ..» .. Это никогда не отображается, только «Готово ..», которое происходит после выполнения метода HeavyTask (). Как сделать так, чтобы сообщение появилось и раньше?

1 Ответ

0 голосов
/ 03 июня 2020

Я закончил тем, что сделал следующее из MainActivity, которое не вешает приложение

private void CreateCleanUpThread()
{
    CleanUpThread = new Thread(new Runnable() {

        public void run(){
            try {
                while(true) {
                    performingCleanup = true;
                    final TextView updatedTxt = findViewById(R.id.updated_txt);
                    runOnUiThread(new Runnable() {
                        @Override
                        public void run() {
                            updatedTxt.setText("Performing database history cleanup..");
                        }
                    });

                    HeavyTask(); // <-- This method runs for 5 - 10 minutes

                    runOnUiThread(new Runnable() {
                        @Override
                        public void run() {
                            updatedTxt.setText("Done..");
                        }
                    });
                    performingCleanup = false;
                    Thread.sleep(CleanUpCycle); // 1 hour wait time
                }
            } catch(Exception ex) {
                System.out.println("Error in CreateCleanUpThread : " + ex.getMessage());
            }
        }
    });
}

// onCreate in MainActivity
...
CleanUpThread.start();

Конечно, не лучший способ, но он работает и будет работать на данный момент. Думаю, вместо этого нужно переместить в сервис.

...