【问题标题】:WorkManager onStopped() method called twiceWorkManager onStopped() 方法被调用两次
【发布时间】:2018-11-06 17:19:55
【问题描述】:

我在我的项目中实现了WorkManager。在doWork() 完成我的任务后,我调用了stop(true); 并且我向onStopped() 中的另一个活动发送了一个广播。一切正常,但问题是 onStopped() 被调用 两次(我已经通过应用断点进行了测试)。因此,BroadcastReceiver 也被调用了两次。

我知道 WorkManager 处于 alpha 阶段。但我实际上不确定这是一个错误还是我做错了什么。请帮忙。代码如下:

public Result doWork() {

    startGettingData();

    stop(true);

    return Result.SUCCESS;
}

@Override
public void onStopped(boolean cancelled) {
    super.onStopped(cancelled);

    Intent intent=new Intent(SERVER_SYNC_BROADCAST);
    intent.putExtra(SYNC_RESULT_MESSAGE,responseCodes);
    LocalBroadcastManager.getInstance(MyApplication.getContext()
            .getApplicationContext())
            .sendBroadcast(intent);

}

从活动的onCreate() 调用一次:

WorkUtil.startSyncing(SyncWorker.class);

WorkUtil.java

public class WorkUtil {

private static WorkManager mWorkManager;

public static WorkUtil workUtil;

private WorkUtil() {

     mWorkManager = WorkManager.getInstance();

}

public static WorkUtil getInstance() {

    if(workUtil == null) {
        workUtil = new WorkUtil();
    }

    return workUtil;

}

public static void startSyncing(Class workerClass) {

    Constraints constraints = new Constraints.Builder().build();

    OneTimeWorkRequest someWork = new OneTimeWorkRequest.Builder(workerClass)
            .setConstraints(constraints)
            .build();
    OneTimeWorkRequest oneTimeWorkRequest = someWork;
    mWorkManager.enqueue(oneTimeWorkRequest);

}

public static void cancelAllWork() {
    mWorkManager.cancelAllWork();
}


}

【问题讨论】:

  • 您是否有机会安排两次工作?
  • 实际上不是。我正在使用OneTimeWorkRequest。更多代码已更新。请检查。
  • 我觉得不用打stop(true);return Result.SUCCESS;就够了。
  • 我也是这么想的。但是如果我删除stop(true),则永远不会调用onStopped()。 :(
  • startGettingData(); 是否使用新线程来获取数据?另外,为什么需要调用onStopped?它应该在工作未完成时调用......

标签: android android-workmanager


【解决方案1】:

如果我理解正确的话,你想在你的工作完成后发送一个广播。

您不应该在 onStopped 内执行此操作,请将其移至 doWork,如下所示:

public Result doWork() {

  startGettingData(); // this method should be synchronous

  Intent intent=new Intent(SERVER_SYNC_BROADCAST);
  intent.putExtra(SYNC_RESULT_MESSAGE,responseCodes);
  LocalBroadcastManager.getInstance(MyApplication.getContext()
        .getApplicationContext())
        .sendBroadcast(intent);

  return Result.SUCCESS;
}

onStopped 方法不是在工作完成时调用,而是在工作停止或取消时调用。

Source

【讨论】:

  • 感谢您的回答。但我的问题是:WorkerstopSelf()Service 的替代品是什么?
  • 您不需要替代品。如果您的目的是通过自己停止工人来节省电力 - 不要担心:)。 WorkManager 可以为您保存这样的样板代码。
  • 谢谢,按照您的解决方案BroadcastReceiver 只需调用一次(如预期的那样)。如果有人感兴趣:奇怪的是,我在onStopped() 中设置了e Log print,它之前没有打印任何东西(当sendBroadcast()onStopped() 中时)。但是移动后sendBroadcast()日志打印开始打印!觉得有点奇怪。
猜你喜欢
  • 2021-11-04
  • 1970-01-01
  • 2013-12-31
  • 1970-01-01
  • 1970-01-01
  • 2020-07-16
  • 2014-09-02
  • 2014-05-22
  • 2017-02-15
相关资源
最近更新 更多