有没有简单的方法可以更改重复间隔PeriodicWorkRequest?
让我们Worker每 6 小时触发一次并且已经排队,但我需要将其更改为 3 小时。
如果解决方案是取消请求并创建新请求,那么不重复请求的干净方法是什么?
问题是我不能用 java 将带有 dagger2 的类注入到工人(WorkManager)中。
我试图在这里理解它的解释:https : //proandroiddev.com/dagger-2-setup-with-workmanager-a-complete-step-by-step-guild-bb9f474bde37 而且我不知道为什么- 但就我而言,这是行不通的。
public class SimpleWorker extends androidx.work.Worker {
private String TAG = "SimpleWorker";
SomeModel someModel; // this is injected model
public SimpleWorker(@NonNull Context context, @NonNull WorkerParameters
workerParams) {
super(context, workerParams);
}
@NonNull
@Override
public Result doWork() {
Log.d(TAG, someModel.toString()); // but here always null
return Result.success(); }
}
Run Code Online (Sandbox Code Playgroud)
我希望它运行良好!
是的 - 这是我的问题WorkManager Java Android Dagger2的重复, 但它被版主关闭,我没有时间回答它。我真的想为其他人节省一些时间。附:请 - 不要删除它。
我遇到了我无法理解的WorkManager(version ) 行为。2.0.1不幸的是,这种行为会导致我的应用程序出现问题。为了说明我的问题,我将使用一个更简单的例子。
让我们假设有三个Worker实现 - UniqueWorker1、UniqueWorker2和FinishingWorker。
class UniqueWorker1(context: Context, workerParams: WorkerParameters) :
Worker(context, workerParams) {
override fun doWork(): Result {
if (runAttemptCount == 0) {
Log.d("UniqueWorker1", "First try.")
return Result.retry()
}
Log.d("UniqueWorker1", "Second try")
return Result.success()
}
}
class UniqueWorker2(context: Context, workerParams: WorkerParameters) :
Worker(context, workerParams) {
override fun doWork(): Result {
Log.d("UniqueWorker2", "doWork")
return Result.success()
}
}
class FinishingWorker(context: Context, workerParams: WorkerParameters) :
Worker(context, workerParams) {
override fun …Run Code Online (Sandbox Code Playgroud) 我正在编写一个使用 WorkManager 的 Android 库。在代码中的某个地方我称之为这样的:
val uploadTripRequest = OneTimeWorkRequest.Builder(UploadTripWorker::class.java)
.setConstraints(someConstraints)
.setBackoffCriteria(BackoffPolicy.EXPONENTIAL, OneTimeWorkRequest.MIN_BACKOFF_MILLIS, TimeUnit.MILLISECONDS)
.build()
WorkManager.getInstance(context)
.enqueueUniqueWork(WORKER_NAME, ExistingWorkPolicy.REPLACE, uploadTripRequest)
Run Code Online (Sandbox Code Playgroud)
在我的 build.gradle 中我有:implementation 'androidx.work:work-runtime:2.2.0'
通常情况下,一切都很完美。当客户端应用程序调用https://developer.android.com/reference/kotlin/androidx/work/WorkManager.html#initialize时就会出现问题,例如:
WorkManager.initialize(context, Configuration.Builder().setWorkerFactory(myWorkerFactory).build())
Run Code Online (Sandbox Code Playgroud)
当调用此方法时,我的库中的 WorkManager 未按预期工作。doWork方法不在 my 上调用UploadTripWorker,但在 client 提供的工作线程上执行myWorkerFactory。
从我的角度来看,它WorkManager在库中不可用,因为它是单例,有人可以通过initialize方法更改其行为。但我希望我错了。
我有什么办法可以解决这个问题吗?当然,我不能告诉我所有的客户不要使用WorkManager.initialize()方法。
我正在根据使用 BroadcastReceiver 启动的Worker的条件向用户发送每日通知。从Worker我只需要context发送通知。
NotificationCompat.Builder(context, CHANNEL_ID).apply {
setContentTitle(...)
setContentText(...)
setContentIntent(pendingIntent(context))
}.build()
Run Code Online (Sandbox Code Playgroud)
如何PendingIntent使用导航组件创建启动特定片段?
我试过这个:
fun pendingIntent(context: Context): PendingIntent {
val navController = NavController(context.applicationContext)
navController.setGraph(R.navigation.your_navigation)
return navController.createDeepLink()
.setDestination(R.id.yourFragment)
.createPendingIntent()
}
Run Code Online (Sandbox Code Playgroud)
但我得到以下例外:
Caused by: java.lang.RuntimeException: Exception inflating package.name:navigation/your_navigation line 7
at androidx.navigation.NavInflater.inflate(NavInflater.java:90)
at androidx.navigation.NavController.setGraph(NavController.java:425)
at androidx.navigation.NavController.setGraph(NavController.java:407)
at
......
at package.name.Worker.doWork(Worker.kt:15)
at androidx.work.Worker$1.run(Worker.java:85)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1133)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:607)
at java.lang.Thread.run(Thread.java:761)
Caused by: java.lang.IllegalStateException: Could not find Navigator with name "fragment". You must call NavController.addNavigator() for each navigation type. …Run Code Online (Sandbox Code Playgroud) java android kotlin android-architecture-components android-workmanager
在我的ListenableWorker课堂上有一段时间我使用了以下内容:
public ListenableFuture<Result> startWork() {
ResolvableFuture<Result> resolvableFuture = ResolvableFuture.create();
startSomeAsyncStuff(resolvableFuture);
return resolvableFuture;
}
Run Code Online (Sandbox Code Playgroud)
基本上,我开始一些异步工作,传入resolvableFuture该函数。异步工作完成后,我对该resolvableFuture对象调用以下内容ListenableWorker:
resolvableFuture.set(Result.success());
Run Code Online (Sandbox Code Playgroud)
这运行良好,并且似乎仍然有效,但我现在看到以下 lint 错误消息ResolvableFuture.create():
ResolvableFuture 只能从同一个库组前缀中调用
它仍然可以编译,但是这个警告让我很困扰。现在这样做的正确方法是什么?
我想用 Dagger2 注入一个 WorkManager 实例,以便在我的 ViewModel 中使用它,如下所示
class MyViewModel @Inject constructor(workManager: WorkManager) : ViewModel()
Run Code Online (Sandbox Code Playgroud)
当我尝试为 WorkManager 创建一个模块来提供它的实例时,我收到一条错误消息,指出我无法从抽象类提供。如何在我的 ViewModel 构造函数中注入 WorkManager 实例?
如果应用程序不符合要求,我们将无法根据新的限制从工作管理器启动活动。我想要的只是从工作管理器启动活动,即使应用程序被终止或在某个特定时间后不再可见。我不想在前台运行该应用程序。无论如何,我可以实现这个目标吗?
任何帮助,将不胜感激。
例外:面向 S+(版本 31 及更高版本)要求在创建 PendingIntent 时指定 FLAG_IMMUTABLE 或 FLAG_MUTABLE 之一
导致异常的代码:WorkManager.getInstance(context).createCancelPendingIntent(id)
build.gradle 选项:
编译SdkVersion 31
buildToolsVersion“30.0.3”(版本 31.0.0 出现错误:安装的构建工具修订版 31.0.0 已损坏。使用 SDK 管理器删除并重新安装)。
模拟器:API 31(使用 API S 一切正常)
依赖项:
// 工作管理器
实现“androidx.work:work-runtime-ktx:2.7.0-alpha05”
实施 'com.google.guava:listenablefuture:9999.0-empty-to-avoid-conflict-with-guava'
我认为问题可能出在BuildCompat.java的这个方法中:
/**
* Checks if the device is running on a pre-release version of Android S or a release version of
* Android S or newer.
* <p>
* <strong>Note:</strong> When Android S is finalized for release, this method will …Run Code Online (Sandbox Code Playgroud) 我正在创建一个Android应用程序以在后台运行我的代码。我很清楚Android Oreo为后台服务引入的限制,这就是为什么我使用WorkManager API安排执行任务的原因。我正在使用Android API 24(Nougat)在Mi Max设备上测试我的代码,并且还手动启用了自动启动,以便MIUI允许该应用程序在后台运行,但是问题是,WorkManager会在应用程序首次启动时触发,在那之后,它不起作用。以下是我用于定期工作请求和工作本身的代码。
PeriodicWorkRequest调用:
PeriodicWorkRequest work = new PeriodicWorkRequest.Builder(ClassExtendingWorker.class, 15, TimeUnit.MINUTES)
.setConstraints(Constraints.NONE)
.build();
WorkManager.getInstance().enqueue(work);
Run Code Online (Sandbox Code Playgroud)
ClassExtendingWorker:
public Result doWork() {
/*--- SHOWING NOTIFICATION AS AN EXAMPLE TASK TO BE EXECUTED ---*/
NotificationCompat.Builder mBuilder = new NotificationCompat.Builder(getApplicationContext(), "")
.setSmallIcon(R.drawable.common_google_signin_btn_icon_light)
.setContentTitle("TestApp")
.setContentText("Code executed")
.setPriority(NotificationCompat.PRIORITY_DEFAULT);
NotificationManagerCompat notificationManager = NotificationManagerCompat.from(getApplicationContext());
notificationManager.notify(1234, mBuilder.build());
return Result.SUCCESS;
}
Run Code Online (Sandbox Code Playgroud)