标签: android-workmanager

从androidx.work.Worker将数据保存到Room失败

我曾尝试将数据从Worker数据库保存到Room数据库.

版本:

  • 工作运行时Ktx - android.arch.work:work-runtime-ktx:1.0.0-alpha02
  • 房间 - android.arch.persistence.room:runtime:1.1.0和android.arch.persistence.room:compiler:1.1.0

MainActivity.kt

private fun runDataDownloadWork() {
        WorkManager.getInstance()
                .beginWith(dwElementTypesWork)
                .then(dwElementsWork)
                .enqueue()
        WorkManager.getInstance().getStatusById(dwElementsWork!!.id)
                .observe(this, Observer { workStatus ->
                    if (workStatus != null && workStatus.state.isFinished) {
                        Log.d("WorkManager", "dwElementsWork finished")
                    }
                })
    }

    private fun createWorkRequests() {
        dwElementsWork = OneTimeWorkRequestBuilder<DWElementsWork>()
                .addTag(DWElementsWork.TAG)
                .setConstraints(wifiConstraints)
                .build()
        dwElementTypesWork = OneTimeWorkRequestBuilder<DWElementTypesWork>()
                .addTag(DWElementTypesWork.TAG)
                .setConstraints(wifiConstraints)
                .build()
    }
Run Code Online (Sandbox Code Playgroud)

DWElementsWork.kt

class DWElementsWork : Worker() {

    companion object {
        const val TAG = "dw_elements_work"
    }

    override fun doWork(): WorkerResult {

        val apiService: APIService = ServiceGenerator
            .createService(applicationContext, MyAPIService::class.java) …
Run Code Online (Sandbox Code Playgroud)

android kotlin android-room android-workmanager

8
推荐指数
0
解决办法
1347
查看次数

具有定期请求的工作管理器多次调用

我正在使用工作经理进行定期任务.我要执行单个工作实例

我的代码如下

  val workManager = WorkManager.getInstance()
  val callDataRequest = PeriodicWorkRequest.Builder(MyLoggerWork::class.java,
                15, TimeUnit.MINUTES)
                .addTag(worker)
                .build()
   workManager.enqueueUniquePeriodicWork(worker, ExistingPeriodicWorkPolicy.KEEP, callDataRequest)
Run Code Online (Sandbox Code Playgroud)

我的工作人员记录如下

18/09/2018 03:18:19
18/09/2018 03:18:19
18/09/2018 03:18:19
18/09/2018 03:18:19

18/09/2018 03:37:18
18/09/2018 03:37:18
18/09/2018 03:37:18
18/09/2018 03:37:18
Run Code Online (Sandbox Code Playgroud)

这是我的MyLoggerWork类

public class MyLoggerWork: Worker(){


override fun doWork(): Result {
    addlog()
    return Worker.Result.SUCCESS
}

private fun addlog() {

    try {

        val directory = File(Environment.getExternalStorageDirectory().path + "/", "Jobs")
        if (!directory.exists()) {
            directory.mkdir()
        }
        val file = File(directory.path, "jobs_.txt")
        if (!file.exists() && directory.exists()) {
            file.createNewFile()
        }
        try { …
Run Code Online (Sandbox Code Playgroud)

android kotlin android-workmanager

8
推荐指数
1
解决办法
1184
查看次数

如何解决已存在的程序类型:com.google.common.util.concurrent.ListenableFuture?

由于以下错误,我现在的Android项目现在无法构建

AGPBI: {"kind":"error","text":"Program type already present: com.google.common.util.concurrent.ListenableFuture","sources":[{}],"tool":"D8"}
java.lang.RuntimeException: java.lang.RuntimeException: com.android.builder.dexing.DexArchiveMergerException: Error while merging dex archives: /Users/....
Program type already present: com.google.common.util.concurrent.ListenableFuture
Run Code Online (Sandbox Code Playgroud)

我正在使用Android工作室版本

Android Studio 3.2
Build #AI-181.5540.7.32.5014246, built on September 17, 2018
JRE: 1.8.0_152-release-1136-b06 x86_64
JVM: OpenJDK 64-Bit Server VM by JetBrains s.r.o
Mac OS X 10.11.6
Run Code Online (Sandbox Code Playgroud)

以下链接不太有帮助

Learn how to resolve the issue at https://developer.android.com/studio/build/dependencies#duplicate_classes.
Run Code Online (Sandbox Code Playgroud)

我为触发此错误所做的更改如下: -

将我的tarke sdk version et.c从27增加到28

   compileSdkVersion = 28
   targetSdkVersion = 28
   minSdkVersion = 21
   buildToolsVersion = "28.0.2"
   supportLibVersion = "28.0.0"
Run Code Online (Sandbox Code Playgroud)

将我的kotlin版本增加到 ext.kotlin_version = …

android android-gradle-plugin android-guava android-workmanager

8
推荐指数
0
解决办法
3965
查看次数

java.lang.IllegalStateException:无法在后台线程上调用observeForever

有人可以帮我找到我在哪里错了.我需要不断观察网络数据,并在工作人员发生数据更改时更新UI.请注意,这在升级到androidx之前有效.

这是一个工人类.

class TestWorker(val context: Context, val params: WorkerParameters): Worker(context, params){

    override fun doWork(): Result {
        Log.d(TAG, "doWork called")
        val networkDataSource = Injector.provideNetworkDataSource(context)
        networkDataSource.fetchData(false)

        return Worker.Result.SUCCESS
    }

    companion object {
        private const val TAG = "MY_WORKER"
    }

}
Run Code Online (Sandbox Code Playgroud)

其名称如下:

fun scheduleRecurringFetchDataSync() {
    Log.d("FETCH_SCHEDULER", "Scheduling started")

    val fetchWork = PeriodicWorkRequest.Builder(TestWorker::class.java, 1, TimeUnit.MINUTES)
            .setConstraints(constraints())
            .build()
    WorkManager.getInstance().enqueue(fetchWork)
}

private fun constraints(): Constraints{
    return Constraints.Builder()
            .setRequiredNetworkType(NetworkType.CONNECTED)
            .setRequiresBatteryNotLow(true)
            .build()
}
Run Code Online (Sandbox Code Playgroud)

我还有一个UserDao和UserRepository来获取和存储数据.我正在观察UserRepository中的网络数据,如下所示:

class UserRepository (
    private val userDao: UserDao,
    private val networkDataSource: NetworkDataSource,
    private val appExecutors: …
Run Code Online (Sandbox Code Playgroud)

android kotlin android-livedata android-architecture-components android-workmanager

8
推荐指数
2
解决办法
3508
查看次数

如何减少WorkManager中PeriodicWorkManager的时间

PeriodicTimeRequest最小周期时间为15分。我想将它从 15 分钟减少到不到 15 分钟。我该怎么做?

android android-jetpack android-workmanager

8
推荐指数
3
解决办法
4274
查看次数

Flutter workmanager 插件在运行任务时无法与任何其他插件一起使用

在初始化工作管理器并创建任一任务后,如果我们在任务执行中使用任何插件,则无法识别并抛出错误,如下所示 MissingPluginException(在通道 lyokone/location 上找不到方法 getLocation 的实现)

实际代码:

Workmanager.executeTask((task, inputData) async {
  Location locationObject = Location(); 
  locationObject.getLocation(); 
  print(locationObject); 
  return Future.value(true); 
}
Run Code Online (Sandbox Code Playgroud)

基本上,工作管理器任务中使用的任何其他插件似乎都无法识别。

我错过了什么,我需要重新注册我的所有插件吗?

I/flutter (16120): Location permission has error

I/flutter (16120): MissingPluginException(No implementation found for method serviceEnabled on channel lyokone/location)

plugins flutter flutter-dependencies android-workmanager

8
推荐指数
1
解决办法
1957
查看次数

androidx.work.impl.WorkManagerInitializer:java.lang.ClassNotFoundException:路径上的“androidx.work.impl.WorkManagerInitializer”:/data/app/app-2.apk

我最近将旧应用程序的后台服务迁移到WorkManager。在最近的设备上(包括 sdk 22),它看起来不错,运行重复的工作单元并按预期在设备重新启动时安排它们。

问题是当我针对旧版本(旧在这里非常相关)进行测试时,Android sdk 14 是我的minSdkVersion. 顺便说一句,也WorkManager应该有相同的:根据doc向后兼容 API 14。如标题所述,我得到的错误是

 java.lang.RuntimeException: Unable to get provider androidx.work.impl.WorkManagerInitializer: java.lang.ClassNotFoundException: Didn't find class "androidx.work.impl.WorkManagerInitializer" on path: /data/app/com.example.myapp.apk
    at android.app.ActivityThread.installProvider(ActivityThread.java:4822)
Run Code Online (Sandbox Code Playgroud)

我没有任何自定义 WorkManager 配置/初始化,我只是添加了

     implementation 'androidx.work:work-runtime:2.2.0'
Run Code Online (Sandbox Code Playgroud)

到我的模块的 gradle 并非常典型地使用它来安排后台操作。

android-workmanager androidx

8
推荐指数
2
解决办法
2207
查看次数

Android 的 WorkerManager 何时停止 Worker?

我们有一个 Android 应用程序,使用 WorkManager 来处理后台同步工作。我们的同步工作者是这样的:

public class SyncWorker extends Worker {

    [...]

    @NonNull
    @Override
    public Result doWork() {

        if (canNotRetry(getRunAttemptCount())) {
            // This could seem unreachable, consider removing... or not... because if stopped by the
            // system, the work might be retried by design
            CBlogger.INSTANCE.log([...]);
            return Result.success();
        }

        boolean syncOk = false;

        //Sync
        try (Realm realm = Realm.getDefaultInstance()) {

            // Doing sync related ops & network calls
            // checking this.isStopped() between operations to quit
            // sync activity when worker has …
Run Code Online (Sandbox Code Playgroud)

android android-workmanager

8
推荐指数
1
解决办法
2303
查看次数

ListenableWorker 不会删除通知图标

我正在使用 ListenableWorker 来执行后台任务。我也希望操作系统意识到我的服务重要性,所以我打电话

 setForegroundAsync(new ForegroundInfo(WorkerConstants.NOTIFICATION_FOREGROUND_ID,
 builder.build()));
Run Code Online (Sandbox Code Playgroud)

正如谷歌文档中所建议的那样。

但是当我的服务停止或取消时,我仍然可以看到前台服务通知并且我无法删除它。

此外,我在此通知中添加了取消按钮,但它什么也没做,我无法关闭它:

PendingIntent intent = WorkManager.getInstance(getApplicationContext())
                            .createCancelPendingIntent(getId());
                    builder.addAction(R.drawable.ic_redesign_exit,"Stop",intent);
Run Code Online (Sandbox Code Playgroud)

有什么建议?

android android-notifications android-workmanager

8
推荐指数
1
解决办法
1256
查看次数

Android Oreo workmanager PeriodicWork 不工作

安卓版本:8.1.0

设备:Infinix X604B

工作管理器:1.0.0-alpha11(最新版本)

安排一个 PeriodicWorkRequest 在每 15 分钟后运行一次。工作请求每 15 分钟运行一次,持续大约一小时。然后 PeriodicWorkRequest 停止工作。在 8 小时内,根本没有安排后台工作。我没有杀死我的应用程序,它在后台。

当我将应用程序带回前台时,PeriodicWorkRequest 再次运行后台任务。在我将我的应用程序置于后台后,没有重复的类似经验。

我为我的应用禁用了电池优化。

这是 My Worker 类示例。

class TestWorker extends Worker {
public TestWorker(
        @NonNull Context context,
        @NonNull WorkerParameters params) {
    super(context, params);
}

@NonNull
@Override
public Result doWork() {
    // Adding timestamp of background execution to firestore.
    Map<String, String> value = new TreeMap<>();
    SimpleDateFormat df = new SimpleDateFormat("hh:mm");
    String dateFormat = df.format(Calendar.getInstance().getTime());
    value.put("time", dateFormat);
    FirebaseFirestore.getInstance()
            .collection("my-collection")
            .add(value);
    return Result.SUCCESS;
}
Run Code Online (Sandbox Code Playgroud)

}

我是这样称呼它的:

PeriodicWorkRequest.Builder testBuilder …
Run Code Online (Sandbox Code Playgroud)

android android-workmanager

7
推荐指数
1
解决办法
3683
查看次数