workstatus 观察者始终处于排队状态
workstatus observer always in enqueued state
我正在尝试观察我的 workers
,但它们总是处于 queued
状态,或者有时处于 RUNNING
但从来没有 SUCCEED
或 FAILED
。
是 workStatus.state
来自 doWork()
中的 return 还是不同?
这是我的工作脚本:
package com.mockie.daikokuten.sync.workers
import androidx.work.Worker
class TestWorker:Worker()
{
override fun doWork():Worker.Result
{
return Worker.Result.SUCCESS
}
}
这是观察工人的脚本:
val test = PeriodicWorkRequest.Builder(
TestWorker::class.java,
PeriodicWorkRequest.MIN_PERIODIC_INTERVAL_MILLIS,
TimeUnit.MILLISECONDS)
.addTag("test_worker")
.build()
WorkManager.getInstance()?.enqueueUniquePeriodicWork("test_worker", ExistingPeriodicWorkPolicy.KEEP, test)
WorkManager.getInstance()!!.getStatusesByTag("test_worker")
.observe(this, Observer { workStatus ->
if (workStatus != null)
{
for(ws in workStatus)
{
Log.d(":dump2 id ", ws.id.toString())
Log.d(":dump2 tag", ws.tags.toString())
Log.d(":dump2 state", ws.state.toString())
}
}
})
这是 Logcat 中的结果:
07-23 17:12:30.901 29740-29740/com.mockie.daikokuten D/:dump2 id: 5c6297f7-11d8-4f2f-a327-773672a7435c
07-23 17:12:30.901 29740-29740/com.mockie.daikokuten D/:dump2 tag: [test_worker, com.mockie.daikokuten.sync.workers.TestWorker]
07-23 17:12:30.901 29740-29740/com.mockie.daikokuten D/:dump2 state: ENQUEUED
对于您的定期工作请求,您应该看到
ENQUEUED - RUNNING - ENQUEUED
其中后面的ENQUEUED是下一个工作请求的状态。
您可能会在 运行 和 ENQUEUED 之间非常短暂地获得 SUCCEEDED,但我从未见过。
对于您看到的一次性工作请求
ENQUEUED - RUNNING - SUCCEEDED
或者你在 doWork() 中 return 的任何东西。
(Android 8.1 API 27, 1.0.0-alpha04)
以上回答正确。对于 PeriodicWork,您应该看到:
ENQUEUED -> RUNNING -> ENQUEUED
但是,alpha04
中存在一个错误,导致 PeriodicWork
在 API >= 23 上不 运行。这将在 [=13= 中修复].有关详细信息,请查看 https://issuetracker.google.com/issues/111195153.
重要提示:截至几天前:alpha05
已发货。此错误已修复。
这适用于无法从定期工作中获取输出数据的任何人。
它更像是一个黑客。
在您的 Worker 中,只需定义一个静态可变的实时数据。
在你观察工作状态的地方,当你的状态变成"RUNNING".
时观察这个实时数据
这是一个模板:
- 实际工人:
public class SomeWorker extends Worker{
//This live data can be of any type. I'm setting Boolean
Public static MutableLiveData<Boolean> outputObservable = new MutableLiveData();
private boolean output_boolean;
try{
//Do you work here post your result to the live data
output_boolean = SomeTaskThatReturnsABoolean();
outputObservable.postValue(output_boolean);
return Result.Success();
}catch(Exception e){
e.printStackTrace();
outputObservable.postValue(!output_boolean);
return Result.Failure();
}
}
- 你的activity观察这个工人的信息:
//In YourActivity class inside OnCreate
mWorkManager.getWorkInfoForUniqueWorkLiveData(YOUR_TAG).observe (this,
new Observer<List<WorkInfo>>(){
@Override
public void onChanged(@Nullable List<WorkInfo> workInfos) {
if(workInfos!=null && (!(workInfos.isEmpty()))) {
WorkInfo info = workInfos.get(0);
switch(info.getState()){
case ENQUEUED:
break;
case RUNNING:
SomeWorker.outputObservable.observe(YourActivity.this,
new Observer<Boolean>(){
@Override
public void onChanged(@Nullable Boolean aBoolean) {
//EDIT: Remove the observer of the worker otherwise
//before execution of your below code, the observation might switch
mWorkManager.getWorkInfoForUniqueWorkLiveData(YOUR_TAG).removeObservers(YourActivity.this);
if(aBoolean)
//Do whatever you have to if it's true
else
//Do whatever you have to if it's false
}
}
);
}
}
}
}
);
通过这种方式,您可以在工作状态低于 运行 时观察结果,然后再切换回入队状态。
我正在尝试观察我的 workers
,但它们总是处于 queued
状态,或者有时处于 RUNNING
但从来没有 SUCCEED
或 FAILED
。
是 workStatus.state
来自 doWork()
中的 return 还是不同?
这是我的工作脚本:
package com.mockie.daikokuten.sync.workers
import androidx.work.Worker
class TestWorker:Worker()
{
override fun doWork():Worker.Result
{
return Worker.Result.SUCCESS
}
}
这是观察工人的脚本:
val test = PeriodicWorkRequest.Builder(
TestWorker::class.java,
PeriodicWorkRequest.MIN_PERIODIC_INTERVAL_MILLIS,
TimeUnit.MILLISECONDS)
.addTag("test_worker")
.build()
WorkManager.getInstance()?.enqueueUniquePeriodicWork("test_worker", ExistingPeriodicWorkPolicy.KEEP, test)
WorkManager.getInstance()!!.getStatusesByTag("test_worker")
.observe(this, Observer { workStatus ->
if (workStatus != null)
{
for(ws in workStatus)
{
Log.d(":dump2 id ", ws.id.toString())
Log.d(":dump2 tag", ws.tags.toString())
Log.d(":dump2 state", ws.state.toString())
}
}
})
这是 Logcat 中的结果:
07-23 17:12:30.901 29740-29740/com.mockie.daikokuten D/:dump2 id: 5c6297f7-11d8-4f2f-a327-773672a7435c
07-23 17:12:30.901 29740-29740/com.mockie.daikokuten D/:dump2 tag: [test_worker, com.mockie.daikokuten.sync.workers.TestWorker]
07-23 17:12:30.901 29740-29740/com.mockie.daikokuten D/:dump2 state: ENQUEUED
对于您的定期工作请求,您应该看到
ENQUEUED - RUNNING - ENQUEUED
其中后面的ENQUEUED是下一个工作请求的状态。
您可能会在 运行 和 ENQUEUED 之间非常短暂地获得 SUCCEEDED,但我从未见过。
对于您看到的一次性工作请求
ENQUEUED - RUNNING - SUCCEEDED
或者你在 doWork() 中 return 的任何东西。
(Android 8.1 API 27, 1.0.0-alpha04)
以上回答正确。对于 PeriodicWork,您应该看到:
ENQUEUED -> RUNNING -> ENQUEUED
但是,alpha04
中存在一个错误,导致 PeriodicWork
在 API >= 23 上不 运行。这将在 [=13= 中修复].有关详细信息,请查看 https://issuetracker.google.com/issues/111195153.
重要提示:截至几天前:alpha05
已发货。此错误已修复。
这适用于无法从定期工作中获取输出数据的任何人。 它更像是一个黑客。 在您的 Worker 中,只需定义一个静态可变的实时数据。 在你观察工作状态的地方,当你的状态变成"RUNNING".
时观察这个实时数据这是一个模板:
- 实际工人:
public class SomeWorker extends Worker{
//This live data can be of any type. I'm setting Boolean
Public static MutableLiveData<Boolean> outputObservable = new MutableLiveData();
private boolean output_boolean;
try{
//Do you work here post your result to the live data
output_boolean = SomeTaskThatReturnsABoolean();
outputObservable.postValue(output_boolean);
return Result.Success();
}catch(Exception e){
e.printStackTrace();
outputObservable.postValue(!output_boolean);
return Result.Failure();
}
}
- 你的activity观察这个工人的信息:
//In YourActivity class inside OnCreate
mWorkManager.getWorkInfoForUniqueWorkLiveData(YOUR_TAG).observe (this,
new Observer<List<WorkInfo>>(){
@Override
public void onChanged(@Nullable List<WorkInfo> workInfos) {
if(workInfos!=null && (!(workInfos.isEmpty()))) {
WorkInfo info = workInfos.get(0);
switch(info.getState()){
case ENQUEUED:
break;
case RUNNING:
SomeWorker.outputObservable.observe(YourActivity.this,
new Observer<Boolean>(){
@Override
public void onChanged(@Nullable Boolean aBoolean) {
//EDIT: Remove the observer of the worker otherwise
//before execution of your below code, the observation might switch
mWorkManager.getWorkInfoForUniqueWorkLiveData(YOUR_TAG).removeObservers(YourActivity.this);
if(aBoolean)
//Do whatever you have to if it's true
else
//Do whatever you have to if it's false
}
}
);
}
}
}
}
);
通过这种方式,您可以在工作状态低于 运行 时观察结果,然后再切换回入队状态。