为了测试重复性工作,我需要等待整整15分钟(参考)来测试重复性,这确实效率不高。有没有更好更快的方法让开发人员更快地进行测试?
我有一个工人要做定期任务。并且在创建活动中调用此工作者。每次活动打开时都会创建一个新实例,并在同一时间多次执行相同的任务。我这样称呼任务
task = new PeriodicWorkRequest.Builder(BackgroundTask.class, 1000000, TimeUnit.MILLISECONDS).build();
WorkManager.getInstance().enqueue(task);
Run Code Online (Sandbox Code Playgroud)
如何避免创建多个实例?如果没有工作人员在运行,我需要在创建活动时调用实例。
android android-service android-studio-3.0 android-workmanager
我需要在 WorkManager (android.arch.work:work-runtime-ktx:1.0.0-alpha11) 完成工作时进行回调。然而,我正在添加的侦听器在安排工作后立即被调用。
这是我所做的:
val work = OneTimeWorkRequestBuilder<UploadWorker>()
.setConstraints(constraints)
.setBackoffCriteria(BackoffPolicy.EXPONENTIAL, 1, TimeUnit.MINUTES)
.setInputData(inputData)
.build()
workManager.beginUniqueWork(INSURANCE_UPLOAD_WORKER, ExistingWorkPolicy.REPLACE, work)
.enqueue().result.toWorkResult()
Run Code Online (Sandbox Code Playgroud)
UploadWorker 类只有在完成整个上传序列后才返回 Success。
这是扩展功能代码:
private val executor = Executor { command -> command?.run() }
class WorkResult(private val future: ListenableFuture<*>) {
fun addListener(listener: () -> Unit) {
future.addListener(Runnable {
debugLog("work result listener runnable called")
listener()
}, executor)
}
}
internal fun ListenableFuture<*>.toWorkResult(): WorkResult {
return WorkResult(this)
}
Run Code Online (Sandbox Code Playgroud)
当我将侦听器添加到 WorkResult 时,它们都会立即被调用,而无需等待实际工作完成。对此有什么想法吗?
我正在尝试使用PeriodicWorkRequestin定期从远程 url 获取数据WorkManager。我已经实现了逻辑,这里的问题是我没有从Worker.
然而它似乎doWork()在第一次启动时调用,但它没有从网络调用中获取数据。我很惊讶,当我使用时,OneTimeWorkRequest我得到了成功的结果doWork()和来自服务器的数据。
我可能做错了什么?
代码如下:
工人阶级
public class WorkerClass extends Worker {
private Context context;
public static final String EXTRA_WORKER_CLASS = "extra_tag";
public SpecialOffer(@NonNull Context context, @NonNull WorkerParameters workerParams) {
super(context, workerParams);
this.context = context;
}
@NonNull
@Override
public Result doWork() {
Log.d("WORKER_PERIOD", "started");
String url = "https://sampleurl/get.php";
//Volley synchronous call
RequestFuture<String> future = RequestFuture.newFuture();
StringRequest request = new StringRequest(url, future, future);
MySingleton.getInstance(context).addToRequestQueue(request);
try {
String response …Run Code Online (Sandbox Code Playgroud) android android-architecture-components android-jetpack android-workmanager
我正在尝试WorkManager在 Android 中使用,因为到目前为止我已经使用AsyncTask. 我正在尝试更新Room database. 我创建了一个类Repository来在后台执行该过程,但我不知道这是否是正确的编码方式。我也有点困惑如何在 userViewModel 中调用该方法。
这是我的代码:
在存储库中:
inner class Test(ctx: Context, params: WorkerParameters) : Worker(ctx, params) {
override fun doWork(): Result {
fun updateUser(userId : Int , userName :String , userLastname: String){
userDao.updateUser(userId, userName, userLastname)
}
return Result.success()
}
}
Run Code Online (Sandbox Code Playgroud)
在视图模型中:
private val workManager: WorkManager = WorkManager.getInstance()
fun updateUser(userID: Int, userName: String, userLastname: String) {
workManager.enqueue(OneTimeWorkRequest.from(Repository.Test::class.java))
}
Run Code Online (Sandbox Code Playgroud)
也许这不是使用 WorkManager 的正确方法,所以如果有人能帮助我,我将不胜感激。
android kotlin android-room android-jetpack android-workmanager
我使用了 WorkManager 版本android.arch.work:work-runtime:1.0.0-beta03。我使用这个 workmanager 使用 OneTimeWorker 以动态间隔时间将文件上传到服务器。
这就是我所做的。希望你能检查一下并告诉我我错在哪里以及解决它的替代方法。
首先,我提出工作要求
OneTimeWorkRequest workRequest = new OneTimeWorkRequest.Builder(MyWorkRequest.class)
.setInitialDelay(0), TimeUnit.SECONDS)
.addTag("UploadData")
.build();
WorkManager
.getInstance()
.getWorkInfoByIdLiveData(workRequest.getId())
.observeForever(workInfoObserverBackground);
WorkManager
.getInstance()
.enqueueUniqueWork("UploadData", ExistingWorkPolicy.REPLACE, workRequest);
Run Code Online (Sandbox Code Playgroud)
然后,定义观察者以听取其结果。我也从这里开始下一次运行。
workInfoObserverBackground = workInfo -> {
if (workInfo != null){
switch (workInfo.getState()) {
case SUCCEEDED:
case FAILURE:
WorkManager.getInstance().getWorkInfoByIdLiveData(workRequest.getId()).removeObserver(workInfoObserverBackground);
WorkManager.getInstance().cancelUniqueWork("UploadData");
WorkManager.getInstance().cancelAllWorkByTag("UploadData");
workRequest = new OneTimeWorkRequest.Builder(MyWorkRequest.class)
.setInitialDelay(next_interval_time_received_from_api), TimeUnit.SECONDS)
.addTag("UploadData")
.build();
WorkManager
.getInstance()
.getWorkInfoByIdLiveData(workRequest.getId())
.observeForever(workInfoObserverBackground);
WorkManager
.getInstance()
.enqueueUniqueWork("UploadData", ExistingWorkPolicy.REPLACE, workRequest);
break;
}
}
};
Run Code Online (Sandbox Code Playgroud)
几分钟后(我无法记录它,因为它是随机发生的)它崩溃了,这是从 logcat 收集的堆栈跟踪。
1-15 21:46:14.806 25964-26054/com.example.app E/AndroidRuntime: FATAL EXCEPTION: pool-8-thread-1 …Run Code Online (Sandbox Code Playgroud) 有没有办法从 WorkManager Google API测试PERIODIC工作人员,而无需为每次执行至少等待 15 分钟?
我的意思是,它是一个调试应用程序,我正在通过 Android Studio 运行它,我不想等待这么长时间来测试我的功能。
RECEIVE_BOOT_COMPLETED重新启动后,WorkManager是否需要重新安排工作人员的权限?如果不是 WorkManager 如何处理这个?
我试图通过创建一个每 5 天重复一次的定期 Worker 来使用 WorkManger。
我在华为 Android 7 设备 (API 24) 上使用 1.0.0 版 workmanagers
android.arch.work:work-runtime:1.0.0
Run Code Online (Sandbox Code Playgroud)
这是代码:
fun schedule() {
val constraints: Constraints = Constraints.Builder().apply {
setRequiredNetworkType(NetworkType.CONNECTED)
}.build()
val request = PeriodicWorkRequest
.Builder(MyWorker::class.java, 5, TimeUnit.DAYS)
.setConstraints(constraints)
.build()
WorkManager.getInstance()
.enqueueUniquePeriodicWork(MyWorker.TAG, ExistingPeriodicWorkPolicy.KEEP, request)
}
Run Code Online (Sandbox Code Playgroud)
我的工人:
class MyWorker(appContext: Context, workerParams: WorkerParameters)
: Worker(appContext, workerParams) {
override fun doWork(): Result {
return try {
Thread.sleep(5000)
Timber.i("success")
Result.success()
} catch (e: Exception) {
Timber.e(e, "error")
Result.failure()
}
}
Run Code Online (Sandbox Code Playgroud)
该方法在 MainActivity 中schedule()调用onCreate() …
我需要将复杂对象传递给 WorkManager。或者我需要序列化包含 Livedata 和 Date 的对象。
它抛出 java.lang.IllegalArgumentException: KeycabinId2 has invalid type class com.example.sonyadmin.data.Task
val data = workDataOf("cabinId2" to task)
val uploadWorkRequest = OneTimeWorkRequestBuilder<WManager>()
.setInputData(data)
.build()
Run Code Online (Sandbox Code Playgroud)