首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >创建一个在Android中每小时运行一次的线程的最佳实践?

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

Stack Overflow用户
提问于 2020-05-30 11:30:13
回答 1查看 167关注 0票数 0

因此,我试图创建一个后台任务,需要在Android应用程序中每小时运行一次。这是一个相当繁重的任务,大约需要5-10分钟才能完成,现在它运行在UI线程上,这当然不是很好,因为它挂起了整个应用程序。我在我的MainActivity onCreate中尝试了以下几点:

代码语言:javascript
复制
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线程在运行时再次挂起。在调用missing?
  • Notice ()方法之前,我尝试将一个TextViews文本设置为“执行清理.”。这从来没有显示出来,只有“完成..”它发生在完成HeavyTask()方法之后。如何确保消息在前面也会出现?
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-06-03 08:45:43

最后,我在不挂起应用程序的MainActivity中执行了以下操作

代码语言:javascript
复制
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();

当然不是最好的办法,但它的工作,并将采取目前。我想应该搬到服务处去。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/62101782

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档