Android 工作管理器一次性请求从工作人员返回空白结果

标签 android android-workmanager

我正在使用 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/

相关文章:

android - 本地 Android 库模块和 com.android.tools.build :gradle:3. 0.0

android - 解析推送通知仅适用于模拟器

android - periodicworkrequest仅在android中调用一次

Android WorkManager 10 分钟线程超时来自某处

android - 定期工作请求是否应该立即执行?

android - 如何使用 Android Worker 观察最后发出的 WorkManager getWorkInfoByIdLiveData

android - 如何在 notify() 之前获取在 Service 中触发通知的时间

android - HTML 5 视频标签,使用 Ionic 3 在 Android 上 2-4 秒后开始播放视频

android - 如何在 Android 中的 RadioButton 上设置 OnClickListener?

java - 如何在 Dagger 2.16 中为 worker 类实现 Dagger? ('android.arch.work:work-runtime')