标签: android-workmanager

WorkManager如何安排对REST API的GET请求?

我已经看过WorkManager的codelab以及这里的一些例子,但是我看到的代码中的所有内容都与在设备上本地工作或上传到服务器有关,而不是下载数据和响应收到的数据.在开发人员指南中,它甚至说,"例如,一个应用程序可能需要不时地从网络上下载新资源",所以我认为这对于这项任务来说是完美的.我的问题是,如果WorkManager可以处理以下场景,如果没有,那么处理它的正确工具是什么:

  1. 安排一天在后台运行一次的工作
  2. 工作是从REST API进行数据提取(如果可能,将其发布到LiveData对象).
  3. 数据返回时,检查它是否比本地数据更新.
  4. 通知用户新数据可用.

我的worker类看起来像这样:

public class MyWorker extends Worker {

@NonNull
@Override
public WorkerResult doWork() {
    lookForNewData();
    return WorkerResult.SUCCESS;
}

public void lookForNewData() {
    MutableLiveData<MyObject> liveData = new MutableLiveData<>();

    liveData.observe(lifeCycleOwner, results -> {
        notifyOnNewData(results);
    })

    APILayer.getInstance().fetchData(searchParams, liveData)
}
Run Code Online (Sandbox Code Playgroud)

我的问题当然是LiveData对象无法观察,因为没有活动或片段可以作为其LifecycleOwner.但即使我使用来自API的回调来响应到达的数据,我的工作人员已经发布它是成功的,它可能不会继续回调,对吧?所以我知道这种方法是完全错误的,但是我看不到任何使用WorkManager获取数据的代码

请帮助一个正确的解决方案和一些示例代码或一些链接,如果它可以处理这种工作或其他更合适的话,可以使用WorkManager.

android android-workmanager

15
推荐指数
1
解决办法
3216
查看次数

foregroundServiceType 0x00000001 不是清单文件的服务元素中 foregroundServiceType 属性 0x00000000 的子集

我已经使用 WorkManager 实现了 Foreground Service,它在 API 级别 33 之前都可以正常工作。由于在 API 级别 34 中必须指定 foregroundServiceType,因此我在 Worker 和 Manifest 中指定了它,但收到此错误。

AndroidManifest.xml

所需权限:

<uses-permission android:name="android.permission.FOREGROUND_SERVICE"/>
<uses-permission android:name="android.permission.FOREGROUND_SERVICE_DATA_SYNC"/>
<uses-permission android:name="android.permission.POST_NOTIFICATIONS"/>

<service
        android:name=".services.DownloadService"
        android:exported="false"
        android:enabled="true"
        tools:node="merge"
        android:foregroundServiceType="dataSync"/>
Run Code Online (Sandbox Code Playgroud)

内部工人:

 setForegroundAsync(
       ForegroundInfo(
            NOTIFICATION_ID,
            getNotification(),
            ServiceInfo.FOREGROUND_SERVICE_TYPE_DATA_SYNC
       )
  )
Run Code Online (Sandbox Code Playgroud)

出现此错误


java.lang.IllegalArgumentException: foregroundServiceType 0x00000001 不是android.os.Parcel.createException(Parcel.java:处 android.os.Parcel.createExceptionOrNull(Parcel.java:3015) 处清单文件的服务元素中 foregroundServiceType 属性 0x00000000 的子集2995)
在 android.os.Parcel.readException(Parcel.java:2978)
在 android.os.Parcel.readException(Parcel.java:2920)
在 android.app.IActivityManager$Stub$Proxy.setServiceForeground(IActivityManager.java:6079) )在 android.app.Service.startForeground(Service.java:797) ...

我尝试到处做一些改变,但没有任何效果。

foreground-service android-workmanager android-14

15
推荐指数
3
解决办法
3393
查看次数

如何在WorkManager for Android中创建具有参数的Worker?

Android架构有一个新的组件WorkManager.

例子中,

class CompressWorker(context : Context, params : WorkerParameters)
    : Worker(context, params) {

    override fun doWork(): Result {

        // Do the work here--in this case, compress the stored images.
        // In this example no parameters are passed; the task is
        // assumed to be "compress the whole library."
        myCompress()

        // Indicate success or failure with your return value:
        return Result.SUCCESS

        // (Returning RETRY tells WorkManager to try this task again
        // later; FAILURE says not to …
Run Code Online (Sandbox Code Playgroud)

android kotlin android-architecture-components android-workmanager

14
推荐指数
2
解决办法
6019
查看次数

设备上的文件系统处于错误状态。WorkManager 无法访问应用程序的内部数据存储

当我将工作管理器库添加到 android studio 并运行该应用程序时,它崩溃并出现以下错误:

E/SQLiteLog: (14) cannot open file at line 37816 of [c255889bd9]
    (14) os_unix.c:37816: (13) lstat(/data/user/0/com.example/no_backup/androidx.work.workdb) - 
    (1) Process m.example : Pid (13632) Uid (11395) Euid (11395) Gid (11395) Egid (11395)
    (1) osStat failed "/data/user/0/com.example/no_backup/androidx.work.workdb" due to error (13)
    (1) osStat failed "/data/user/0/com.first.academy/no_backup" due to error (13)
    (1) Stat of /data/user/0/com.example : st_mode(40700) st_uid(11385) st_gid(11385) st_ino(164253)
    (1) Stat of /data/user/0 : st_mode(40771) st_uid(1000) st_gid(1000) st_ino(131074)
    (1) Stat of /data/user : st_mode(40711) st_uid(1000) st_gid(1000) st_ino(655366)
    (1) Stat of /data …
Run Code Online (Sandbox Code Playgroud)

android android-workmanager

14
推荐指数
1
解决办法
8823
查看次数

用于在后台运行日常任务的Android WorkManager api

即使应用已关闭,我也需要在后台每天调用一个API.我见过有关WorkManager API的信息.对于我的场景,我尝试了PeriodicWorkRequest,但遗憾的是,它不能达到我预期的结果.我做的是我在Application类中使用了这段代码

 PeriodicWorkRequest.Builder myWorkBuilder =
                new PeriodicWorkRequest.Builder(MyWorker.class, 24,
                        TimeUnit.HOURS);

        PeriodicWorkRequest myWork = myWorkBuilder.build();
        WorkManager.getInstance().enqueue(myWork);
Run Code Online (Sandbox Code Playgroud)

但是,当应用程序第一次打开时,它会重复运行11次,而且在24小时后它没有运行.请任何人帮助我解决.

android android-jobscheduler android-jetpack android-workmanager

13
推荐指数
2
解决办法
9911
查看次数

WorkManager的OneTimeWorkRequest的重试策略/机制是什么

我有以下一次性工作人员.

// Create a Constraints that defines when the task should run
Constraints constraints = new Constraints.Builder()
        .setRequiredNetworkType(NetworkType.UNMETERED)
        .setRequiresBatteryNotLow(true)
        // Many other constraints are available, see the
        // Constraints.Builder reference
        .build();

OneTimeWorkRequest oneTimeWorkRequest =
        new OneTimeWorkRequest.Builder(SyncWorker.class)
                .setConstraints(constraints)
                .addTag(SyncWorker.TAG)
                .build();
Run Code Online (Sandbox Code Playgroud)

根据https://developer.android.com/topic/libraries/architecture/workmanager

// (Returning RETRY tells WorkManager to try this task again
// later; FAILURE says not to try again.)
Run Code Online (Sandbox Code Playgroud)

我想知道,如果SyncWorker继续回来RETRY,重试策略是WorkManager什么?例如,最大重试次数是WorkManager多少?文档不清楚.

android android-architecture-components android-workmanager

13
推荐指数
2
解决办法
5803
查看次数

如何在Android的工作管理器中传递POJO类?

如何通过工作管理器的setData方法在工作管理器中传递Serializable对象?有什么方法可以通过传递对象来与工作管理器进行处理?

WorkManager是一个用于使工作入队的库,该库在满足其约束条件后可以执行。WorkManager允许观察工作状态以及创建复杂工作链的能力。

 Map<String, Object> map = new HashMap<>();
 AddressBookData addressBookData = new AddressBookData();
 addressBookData.setThreadId(001);

 map.put("AddressBookData", addressBookData);


 Data data = new Data.Builder()
                    .putAll(map)
                    .build();

 OneTimeWorkRequest compressionWork =
                new OneTimeWorkRequest.Builder(DataSyncWorker.class)
                        .setInputData(data)
                        .build();
Run Code Online (Sandbox Code Playgroud)

它使应用程序崩溃并显示诸如AddressBookData之类的错误不是有效的类。

注意:我想在工作管理器中传递POJO类,并在doWork方法中从工作管理器获取InputData。

android android-jetpack android-workmanager

12
推荐指数
2
解决办法
3379
查看次数

使用Work Manager API每秒执行一次任务

工作管理器是一个新的API,我尝试每秒执行一次任务,但它不起作用.

这是我的工人班

class TestingWorker : Worker(){
    override fun doWork(): Result {
        Log.i("CheckWorker","Result here")
        return Result.SUCCESS
    }
}
Run Code Online (Sandbox Code Playgroud)

这就是我所说的.

 val recurringWork: PeriodicWorkRequest = PeriodicWorkRequest.Builder(TestingWorker::class.java, 1, TimeUnit.SECONDS).build()
 WorkManager.getInstance()?.enqueue(recurringWork)
Run Code Online (Sandbox Code Playgroud)

android background-process background-service kotlin android-workmanager

12
推荐指数
4
解决办法
5131
查看次数

当应用程序被用户杀死时,工作管理器不工作。为什么?

我想执行一项任务,即使在使用工作管理器终止应用程序之后也是如此。但是,在应用程序被杀死后不会执行任务。

    workManager = WorkManager.getInstance();
    Constraints constraints = new Constraints.Builder().setRequiredNetworkType(NetworkType.CONNECTED).build();
    OneTimeWorkRequest saveData = new OneTimeWorkRequest.Builder(SaveDataWorker.class).setConstraints(constraints).setInitialDelay(10,TimeUnit.SECONDS).build();
    workManager.enqueue(saveData);
Run Code Online (Sandbox Code Playgroud)

android android-workmanager

12
推荐指数
1
解决办法
9246
查看次数

如何让 Flutter Workmanager 插件和 Location 插件一起工作

一、问题描述

我的目标是构建一个 Flutter 应用程序,该应用程序使用此工作管理器插件并使用此位置插件获取定期位置更新。但是当我的 Workmanager 回调触发时,我无法正确加载位置插件。我收到此错误:

MissingPluginException(No implementation found for method getLocation on channel lyokone/location)
Run Code Online (Sandbox Code Playgroud)

所以基本上,问题在于当 Workmanager 插件尝试运行 dart 代码时,它不会加载 Location 插件。

2.我研究过的其他资源

我发现其他人也面临同样的问题,这里这里这里

据我了解,为这些问题提供的解决方案归结为:创建一个名为CustomApplication.java的文件,它扩展FlutterApplication并注册您的插件。然后在 AndoidManifest.xml 文件中注册 CustomApplication.java 文件。

3. 到目前为止我的代码

我试图制作一个实现我需要的功能的最低限度的应用程序:

  1. 我实现了 Workmanager 插件(工作正常)
  2. 我实现了位置插件(工作正常)
  3. 我试图结合这些功能(不起作用)

要准确了解我在每个步骤中所做的工作,请查看此处:https : //gitlab.com/tomoerlemans/workmanager_with_location/-/commits/master。(此存储库还可用于快速复制问题)。

相关代码文件如下:

main.dart

import 'package:flutter/material.dart';
import 'package:workmanager/workmanager.dart';
import 'package:location/location.dart';

void main() {
  WidgetsFlutterBinding.ensureInitialized();
  Workmanager.initialize(callbackDispatcher, isInDebugMode: true);
  runApp(MyApp());
}

class MyApp extends StatelessWidget {
  @override
  Widget …
Run Code Online (Sandbox Code Playgroud)

android dart flutter flutter-dependencies android-workmanager

12
推荐指数
2
解决办法
8154
查看次数