【问题标题】:How to fix [Found: 'android.content.Context', required: 'androidx.lifecycle.LifecycleOwner' ] in BroadcastReceiver?如何在 BroadcastReceiver 中修复 [Found: 'android.content.Context', required: 'androidx.lifecycle.LifecycleOwner' ]?
【发布时间】:2019-11-07 10:52:24
【问题描述】:

这不是重复的,因为我的问题是Wrong 1st argument type. Found: 'android.content.Context', required: 'androidx.lifecycle.LifecycleOwner',我没有得到任何答案来解决这个问题。我正在尝试在后台服务中实现工作管理器。

我尝试将其转换为 AppCompatActivity、LifeCycleOwner ......上下文它自己也不起作用......

代码如下:

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

final Data data = new Data.Builder()
        .putDouble(USER_LAT, maps.get(i).getUser_lat())
        .putDouble(USER_LNG, maps.get(i).getUser_lng())
        .putLong(MAP_ID, id)
        .putString(METHOD, maps.get(i).getMethod())
        .putString(STATUS, maps.get(i).getStatus())
        .putString(RECIEVED_DATA, maps.get(i).getCreate_time())
        .build();

final OneTimeWorkRequest oneTimeWorkRequest = new OneTimeWorkRequest.Builder(DatabaseToApiWorker.class)
        .setInputData(data)
        .setConstraints(constraints)
        .setInitialDelay(delay, TimeUnit.SECONDS)
        .build();

WorkManager.getInstance().enqueue(oneTimeWorkRequest);
WorkManager.getInstance().getWorkInfoByIdLiveData(oneTimeWorkRequest.getId())
        .observe((LifecycleOwner) context, new Observer<WorkInfo>() {
            @Override
            public void onChanged(WorkInfo workInfo) {
                if (workInfo != null)
                    Log.e("ServiceWorker",workInfo.getState().name());
                if (workInfo.getState().isFinished())
                {
                    if (workInfo.getState() == WorkInfo.State.SUCCEEDED){

                        Data data1 = workInfo.getOutputData();
                        Long id = data1.getLong(DatabaseToApiWorker.MAP_ID_WORKER,0);
                        appDatabase.getMapDAO().deleteIt(id);
                        Log.e("ServiceWorker", String.valueOf(id));
                    } else if (workInfo.getState() == WorkInfo.State.FAILED) {

                        Log.e("ServiceWorker", String.valueOf(id)+" Sending Failed");
                    }

                } else {

                    Log.e("WORKER", String.valueOf(id)+" Failed");
                }
            }
        });

【问题讨论】:

  • 您使用的是哪个版本的库?您有重现该问题的示例项目吗?
  • @pfmaggi 你好。我正在使用 2.2.0 版本的 WorkManager。你说的简单项目是什么意思?上面的代码适用于我的 Activity,但不适用于 Receiver。如果你的意思是关于共享工作管理器代码,我刚刚添加了。没有别的了。
  • @pfmaggi 还添加了完整错误。如果你还需要什么,请告诉我。我正在使用这个接收器进行我的位置回调,它工作正常。
  • @pfmaggi nvm,我找到了解决方案。

标签: java android broadcastreceiver android-workmanager


【解决方案1】:

所以我发现我的问题的解决方案是实现自定义生命周期所有者,这里是 link

代码如下: 添加实现:

public class MyLocationService extends BroadcastReceiver implements LifecycleOwner {
private LifecycleRegistry lifecycleRegistry;

在 OnReceive 中添加:

    lifecycleRegistry = new LifecycleRegistry(this);
    lifecycleRegistry.markState(Lifecycle.State.CREATED);

将此添加到您的班级:

@NonNull
@Override
public Lifecycle getLifecycle() {
    return lifecycleRegistry;
}

然后将上下文更改为this::getLifecycle

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-09-21
    • 2012-04-30
    • 1970-01-01
    • 2015-11-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-10-13
    相关资源
    最近更新 更多