java - 工作经理 : How to return result only when network request is done

标签 java android android-volley android-workmanager

这是我的 worker 类(Class),我已经尝试过,但似乎没有按照我想要的方式工作。我只想仅在 PUT 请求完成时返回 doWork() 的结果。任何帮助将不胜感激,谢谢。

public class MyWorker extends Worker {
private Context context;

public MyWorker(
        @NonNull Context context,
        @NonNull WorkerParameters params) {
    super(context, params);
    this.context = context;
}

@NonNull
@Override
public Result doWork() {
    return putData();
}

private Result putData() {
    final Result[] result = new Result[1];
    String url = "https://www.myurl.com";
    JsonObjectRequest jsonObjectRequest = new JsonObjectRequest
            (Request.Method.PUT, url, null, new Response.Listener<JSONObject>() {

                @Override
                public void onResponse(JSONObject response) {
                    if(response == null)
                        result[0] = Result.retry();
                    else
                        result[0] = Result.success();
                }
            }, new Response.ErrorListener() {

                @Override
                public void onErrorResponse(VolleyError error) {
                    // TODO: Handle error
                    if (error instanceof TimeoutError || error instanceof NoConnectionError) {
                        result[0] = Result.retry();
                    } else if (error instanceof AuthFailureError) {
                        //TODO
                    } else if (error instanceof ServerError) {
                        //TODO
                        result[0] = Result.retry();
                    } else if (error instanceof NetworkError) {
                        //TODO
                        result[0] = Result.retry();
                    } else if (error instanceof ParseError) {
                        //TODO
                    }
                    Toast.makeText(getApplicationContext(), error.getMessage(), Toast.LENGTH_LONG).show();
                }
            }) {
        @Override
        public Map<String, String> getHeaders() throws AuthFailureError {
            return params;
        }

        @Override
        protected Map<String, String> getParams() throws AuthFailureError {
            return super.getParams();
        }
    };

    VolleyHelper.getInstance(context).addToRequestQueue(jsonObjectRequest);
    return result[0];
}

}

最佳答案

感谢@pfmaggi,我能够做到这一点

interface MyCallback{
    void onSuccess();
    void onError();
}

public class MyWorker extends ListenableWorker {
    private Context context;

    public MyWorker(
            @NonNull Context context,
            @NonNull WorkerParameters params) {
        super(context, params);
        this.context = context;
    }

     @NonNull
@Override
public ListenableFuture<Result> startWork() {
    return CallbackToFutureAdapter.getFuture(completer -> {
        MyCallback callback = new MyCallback() {
            @Override
            public void onSuccess() {
                completer.set(Result.success());
            }

            @Override
            public void onError() {
                completer.set(Result.retry());
            }
        };
        putData(callback);
        return callback;
    });

}

    private void putData(MyCallback callback) {
        String url = "https://www.myurl.com";
        JsonObjectRequest jsonObjectRequest = new JsonObjectRequest
                (Request.Method.PUT, url, null, new Response.Listener<JSONObject>() {

                    @Override
                    public void onResponse(JSONObject response) {
                        if(response == null)
                            callback.onError();
                        else
                            callback.onSuccess();
                    }
                }, new Response.ErrorListener() {

                    @Override
                    public void onErrorResponse(VolleyError error) {
                        // TODO: Handle error
                        if (error instanceof TimeoutError || error instanceof NoConnectionError) {
                            callback.onError();
                        } else if (error instanceof AuthFailureError) {
                            //TODO
                        } else if (error instanceof ServerError) {
                            //TODO
                            callback.onError();
                        } else if (error instanceof NetworkError) {
                            //TODO
                            callback.onError();
                        } else if (error instanceof ParseError) {
                            //TODO
                        }
                    }
                }) {
            @Override
            public Map<String, String> getHeaders() throws AuthFailureError {
                return params;
            }

            @Override
            protected Map<String, String> getParams() throws AuthFailureError {
                return super.getParams();
            }
        };

        VolleyHelper.getInstance(context).addToRequestQueue(jsonObjectRequest);
    }
}

关于java - 工作经理 : How to return result only when network request is done,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59408932/

相关文章:

Java白盒测试

android - ActionBar 菜单项无法使用支持库

android - 应用程序在启动时意外停止

java - 如何正确使用mediaPlayer?

java - Spring MVC : don't redirect after login - need two models?

java - Android Eclipse NoClassDefFoundError 外部 .jar android 文件

java - 用于防止滥用的 Servlet 过滤器? (DoS、垃圾邮件等)

android - 我想在我的应用程序图标上显示未读通知计数,例如 whatsapp

java - Android volley singleton getInstance(this) 在执行http请求时失败

java - 我的应用程序在尝试使用 Volley 时崩溃