我正在使用 Work Manger 进行网络调用并获取一些数据,为此我使用了 OneTimeRequest。调用在工作类中完美响应,但在监视工作的生命周期所有者中返回空白结果。
workManager= WorkManager.getInstance();
OneTimeWorkRequest.Builder encryptionWork =new OneTimeWorkRequest.Builder(NetworkWorker.class);
getUsersWorkReq=encryptionWork.setInputData(getWorkerInput(EXPERT_LIST_REQUEST))
.addTag(Constant.WORK_GETUSER)
.build();
workManager.enqueue(getUsersWorkReq);
用于观察 worker 类(Class)的 react
workManager.getStatusById(getUsersWorkReq.getId()).observe(this, workStatus -> {
if (workStatus != null && workStatus.getState().isFinished()) {
String status=workStatus.getOutputData().getString(Constant.WORK_RESULT);
String response=workStatus.getOutputData().getString(Constant.WORK_RESPONSE);
if(status!=null && !status.equalsIgnoreCase("")){
}
}
});
但问题是,响应字符串总是空白!!即使工作经理已完成任务并且工作人员中存在网络响应,但当我使用 setOutputData 时它会提供空白数据。
outPut = new Data.Builder()
.putString(Constant.WORK_RESULT,Constant.WORK_SUCCESS)
.putString(Constant.WORK_RESPONSE, String.valueOf(response.body()))
.build();
Log.e("WORKER", "onResponse: "+ response.body().getMsg() );
setOutputData(outPut);
worker 类(Class)
public class NetworkWorker extends Worker {
Data outPut;
@NonNull
@Override
public Result doWork() {
ApiService service = RetrofitInstance.getRetrofitInstance().create(ApiService.class);
Call<ExpertListResponse> call = service.get_recommended_users();
Log.wtf("URL Called", call.request().url() + "");
call.enqueue(new Callback<ExpertListResponse>() {
@Override
public void onResponse(Call<ExpertListResponse> call, Response<ExpertListResponse> response) {
//onFinishedListener.onFinished(requestTag, response.body() != null ? response.body().getExpertInfo() : null);
Data outPut = new Data.Builder()
.putString(Constant.WORK_RESULT,Constant.WORK_SUCCESS)
.putString(Constant.WORK_RESPONSE, String.valueOf(response.code()))
.build();
Log.e("WORKER", "onResponse: "+ response.body().getMsg() );
setOutputData(outPut);
}
@Override
public void onFailure(Call<ExpertListResponse> call, Throwable t) {
//onFinishedListener.onFailure(requestTag,t);
Data outPut = new Data.Builder()
.putString(Constant.WORK_RESULT,Constant.WORK_FAILURE)
.putString(Constant.WORK_RESPONSE, String.valueOf(t))
.build();
setOutputData(outPut);
}
});
return Result.SUCCESS;
}
最佳答案
问题是您在触发 onResponse
之前返回 Result.Success
,因为您正在执行异步改造请求,因此没有数据被设置为 worker 状态。
许多解决方法之一是您在您的 worker 中发送同步改造请求,因此您的 doWork()
方法将被阻止,直到您获得网络响应。您必须将异步改造请求更改为同步请求,类似于以下代码 fragment :
public Result doWork() {
try {
ApiService service = RetrofitInstance.getRetrofitInstance()
.create(ApiService.class);
Call<ExpertListResponse> call = service.get_recommended_users();
ExpertListResponse response = call.execute().body();
Data outPut = new Data.Builder()
.putString(Constant.WORK_RESULT,Constant.WORK_SUCCESS)
.putString(Constant.WORK_RESPONSE, String.valueOf(response.code()))
.build();
setOutputData(outPut);
return Result.SUCCESS;
} catch(Exception ex){
Data outPut = new Data.Builder()
.putString(Constant.WORK_RESULT,Constant.WORK_FAILURE)
.putString(Constant.WORK_RESPONSE, String.valueOf(t))
.build();
setOutputData(outPut);
return Result.Failure;
}
}
关于Android 工作管理器一次性请求从工作人员返回空白结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51999075/