创建在Android中每小时运行的线程的最佳实践?

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

因此,我试图创建后台任务,该任务需要在Android应用中每小时运行一次。这是一项相当繁重的任务,大约需要5到10分钟才能完成,现在它在UI线程上运行,这当然不好,因为它会挂起整个应用程序。我在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();

我以上有两个问题

  • 第一次运行良好,并且任务在后台正常执行而无需挂起UI线程。但是,在第一次和下次运行之后,UI线程在运行时再次挂起。我想念什么?
  • [注意,在调用HeavyTask()方法之前,我尝试将TextViews文本设置为“ Perform cleanup ..”。我如何确保该消息也出现在前面?
android multithreading ui-thread
1个回答
0
投票

我最终从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();

当然不是最好的方法,但是它可以工作并且现在就可以使用。我认为应该将其移至服务。

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