【问题标题】:Android - Looping worker for 1 minuteAndroid - 循环工作 1 分钟
【发布时间】:2021-08-20 02:29:50
【问题描述】:

我一直在搜索很多关于如何在特定时间(例如 5 分钟)内运行特定函数和方法的文章,但我至少找不到与我类似的案例。现在,在我的用例中,我想在 1 分钟内一遍又一遍地运行一个工人。我计划用这个用例来处理网络连接,所以应用程序会在那 1 分钟内尝试连接到服务器,如果连接失败,那么用户可以按下重试按钮。我应该怎么做才能实现我想要的?

这是我的工作:

@NonNull
    @Override
    public Result doWork() {
        Log.e("MyWork", "Starting Worker");
        for (long stop = System.nanoTime()+ TimeUnit.SECONDS.toNanos(1); stop>System.nanoTime();) {
            Log.e("MyWork", "Running Worker in 1 Minute");
        }
//        Been using below's code but still didn't work
//        long startTime = System.nanoTime();
//        while ((System.nanoTime()-startTime)< 5*60){
//            Log.e("MyWork", "Running Worker in 1 Minute");
//        }
        Log.e("MyWork", "Done Running Worker in 1 Minute");
        return Result.retry();
    }

我想要实现的是:

  1. 我想在 1 分钟内重复执行 doWork() 函数

  2. 如果在 1 分钟内仍未达到连接,则用户无法重试

  3. 如果应用程序在 1 分钟内仍无法连接,则用户可以按下重试按钮

  4. 这是我希望实现的输出:

    E/MyWork:启动工人

    E/MyWork:在 1 分钟内运行 Worker - 1

    E/MyWork:在 1 分钟内运行 Worker - 2

    E/MyWork:在 1 分钟内运行 Worker - 3

    E/MyWork:在 1 分钟内运行 Worker - 4

    E/MyWork:在 1 分钟内运行 Worker - ...

    E/MyWork:在 1 分钟内运行 Worker - 60

    E/MyWork:在 1 分钟内完成运行 Worker

【问题讨论】:

    标签: java android loops android-jetpack android-workmanager


    【解决方案1】:

    尝试像这里一样使用 CountDownTimer:

           new CountDownTimer(60000, 1000) {
    
            @Override
            public void onTick(long millisUntilFinished) {
                doWork()
            }
    
            @Override
            public void onFinish() {
                Log.d("MyWork", "Done running worker in 1 minute");
    
            }
        }.start();
    

    【讨论】:

    • 我们不能以这种方式调用 doWork(),它是来自 Worker 库的覆盖。而且,我想在 Worker 类的 doWork() 中创建循环。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-03-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-09-26
    相关资源
    最近更新 更多