当前位置: 首页 > 面试题库 >

Android / Java:如何延迟返回方法

施彬彬
2023-03-14
问题内容

我想构建一个Utils类,以使Volley调用更简单,如下所示:

Utils.java:

public class Utils {
static JsonObjectRequest mJsonObjectRequest;    
protected static boolean busy = true;

public static JSONObject makeJsonObjectRequest(Context context, int method, String url){
    final JSONObject[] jsonObject = new JSONObject[1];
    mJsonObjectRequest = new JsonObjectRequest
            (method, url, null, new Response.Listener<JSONObject>() {

                @Override
                public void onResponse(JSONObject response) {
                    jsonObject[0] = response;
                    busy = false;
                }
            }, new Response.ErrorListener() {

                @Override
                public void onErrorResponse(VolleyError error) {
                    // TODO Auto-generated method stub
                    try {
                        jsonObject[0] = new JSONObject(error.toString());
                    } catch (JSONException e) {
                        e.printStackTrace();
                    }
                    busy = false;
                }
            });

    // Access the RequestQueue through your singleton class.
    VolleySingleton.getInstance(context).addToRequestQueue(mJsonObjectRequest);

    while (true) {
         if (!busy) break;
    }
    return jsonObject[0];
}
}

MainActivity.java:

JSONObject jsonObject = Utils.makeJsonObjectRequest(this, Request.Method.GET, url);
mTxtDisplay.setText("Response: " + jsonObject.toString());

当应用运行时,jsonObject始终为null。我想问一下是否可以延迟在makeJsonObjectRequest中返回jsonObject
[0]直到调用onResponse。我可以这样做吗?。


问题答案:

我创建了此文件,并按照以下方式进行管理,请看一下,希望对您有用

public class APIManager {



    public static void createRequest(Context c, String requestTag,
            String endPoint, List<NameValuePair> params,
            final OnRequestCompletedListener listener,
            TransParentProgressDialog pd) {
        ServerDetails serverDetails = new ServerDetails(c, endPoint, params);
        JsonObjectRequest request = new JsonObjectRequest(Method.GET,
                serverDetails.getQueryUrl(), null,
                new Response.Listener<JSONObject>() {

                    @Override
                    public void onResponse(JSONObject response) {
                        listener.onRequestCompleted(response);
                    }
                }, getErrorListener(c, pd)) {

        };
        AppController.getInstance().addToRequestQueue(request, requestTag);
    }

public static ErrorListener getErrorListener(final Context c,
            final TransParentProgressDialog pd, final TextView tvEmpty,
            final String errorText) {

        Response.ErrorListener listener = new Response.ErrorListener() {

            @Override
            public void onErrorResponse(VolleyError error) {
                if (pd != null && pd.isShowing()) {
                    pd.dismiss();
                }
                if (tvEmpty != null) {
                    tvEmpty.setText(errorText);
                }
                MyDialog dialog;
                Log.d("volley-error", error.toString());

                if (error instanceof TimeoutError) {
                    dialog = new MyDialog(c, "Server Timeout");
                    dialog.show();
                    return;
                } else if (error instanceof NoConnectionError) {
                    dialog = new MyDialog(c, "No Connection or Invalid Url");
                    dialog.show();
                    return;

                } else if (error instanceof ServerError) {
                    NetworkResponse response = error.networkResponse;
                    if (response != null) {
                        // int statusCode = response.statusCode;
                        byte[] data = response.data;
                        if (data != null) {
                            String str = new String(data);
                            try {
                                JSONObject object = new JSONObject(str);
                                Log.d("error response", object.toString());
                                if (object.has("errors")) {
                                    JSONArray errors = object
                                            .getJSONArray("errors");
                                    JSONObject errorObject = errors
                                            .getJSONObject(0);
                                    dialog = new MyDialog(c, "Error!",
                                            errorObject.getString("message"));
                                    dialog.show();
                                } else {
                                    dialog = new MyDialog(c, "Error!",
                                            object.toString());
                                    dialog.show();
                                }
                            } catch (JSONException e) {
                                e.printStackTrace();
                                dialog = new MyDialog(c, "Error!", "Error");
                                dialog.show();
                            }
                        } else {
                            dialog = new MyDialog(c, "Server Error");
                            dialog.show();
                        }
                    } else {
                        dialog = new MyDialog(c, "Server Error");
                        dialog.show();
                    }

                } else if (error instanceof NetworkError) {
                    NetworkResponse response = error.networkResponse;
                    if (response != null) {
                        // int statusCode = response.statusCode;
                        byte[] data = response.data;
                        if (data != null) {
                            String str = new String(data);
                            try {
                                JSONObject object = new JSONObject(str);
                                Log.d("error response", object.toString());
                                if (object.has("errors")) {
                                    JSONArray errors = object
                                            .getJSONArray("errors");
                                    JSONObject errorObject = errors
                                            .getJSONObject(0);
                                    dialog = new MyDialog(c, "Error!",
                                            errorObject.getString("message"));
                                    dialog.show();
                                } else {
                                    dialog = new MyDialog(c, "Error!",
                                            object.toString());
                                    dialog.show();
                                }
                            } catch (JSONException e) {
                                e.printStackTrace();
                                dialog = new MyDialog(c, "Error!", "Error");
                                dialog.show();
                            }
                        } else {
                            dialog = new MyDialog(c, "Network Error");
                            dialog.show();
                        }
                    } else {
                        dialog = new MyDialog(c, "Network Error");
                        dialog.show();
                    }
                } else if (error instanceof ParseError) {
                    dialog = new MyDialog(c, "Parse Error");
                    dialog.show();
                } else if (error instanceof AuthFailureError) {
                    NetworkResponse response = error.networkResponse;
                    if (response != null) {
                        // int statusCode = response.statusCode;
                        byte[] data = response.data;
                        if (data != null) {
                            String str = new String(data);
                            try {
                                JSONObject object = new JSONObject(str);
                                Log.d("error response", object.toString());
                                if (object.has("errors")) {
                                    JSONArray errors = object
                                            .getJSONArray("errors");
                                    JSONObject errorObject = errors
                                            .getJSONObject(0);
                                    dialog = new MyDialog(c, "Error!",
                                            errorObject.getString("message"));
                                    dialog.show();
                                } else {
                                    dialog = new MyDialog(c, "Error!",
                                            object.toString());
                                    dialog.show();
                                }
                            } catch (JSONException e) {
                                e.printStackTrace();
                                dialog = new MyDialog(c, "Error!", "Error");
                                dialog.show();
                            }
                        } else {
                            dialog = new MyDialog(c, "Error!", "Error");
                            dialog.show();
                        }
                    } else {
                        dialog = new MyDialog(c, "Error connecting server");
                        dialog.show();
                    }
                }
            }
        };
        return listener;
    }
}

并按要求完成回叫的界面是

public interface OnRequestCompletedListener {

        public void onRequestCompleted(JSONObject response);
    }


 类似资料:
  • 问题内容: 我正在尝试用Java做某事,而我需要一些东西在while循环中等待/延迟几秒钟。 我想构建一个步进音序器,并且对Java还是陌生的。有什么建议么? 问题答案: If you want to pause then use java.util.concurrent.TimeUnit: TimeUnit.SECONDS.sleep(1); TimeUnit.MINUTES.sleep(1);

  • 我刚开始学习Go,我对Go博客中使用defer更改命名返回值的一个示例感到困惑--defer、Panic和recover。 我在下面的代码中进行了测试,在函数中,它返回1,因为它不是上面提到的“没有参数的返回语句”。 我的问题是,在第一个示例中,周围的函数c有一个命名的返回值i,但是函数使用,在第二个示例中,我们可以看到,无论是什么值,它都应该返回1。但是为什么在更改延迟函数后,函数返回的值,而不

  • 问题内容: 我希望能够在指定的延迟后调用以下方法。在目标c中,有类似以下内容: android和java中的此方法是否等效?例如,我需要能够在5秒钟后调用一个方法。 问题答案: Kotlin Java

  • 我有下面的科特林协程代码。< code>doWorkAsync是正常(非挂起)函数,它返回< code>Deferred 我不知道如何在< code>doWorkAsync函数中使用< code>delay。 我正在使用kotlin协程版本。

  • 问题内容: 因此,在这段代码中: 似乎在FileConverter方法尚未完成调用之前,消息对话框窗口弹出窗口的速度就太快了。我想知道JOptionPane的放置是否正确,或者是否可以将消息延迟到该方法完成处理之前? 问题答案: 您可以使用SwingWorker。 在这里看看Java教程。

  • 问题内容: 我有一个简短的问题,希望有人能帮助我。 请查看以下代码片段: 有人可以帮我解决这个问题吗?我想实现一种类似“工具提示”的行为:您用鼠标输入一个区域。如果鼠标停留在该位置,请执行某些操作。 问题答案: 在您的方法中延迟2秒启动计时器,该计时器将调用您想要执行的任何操作。 设置一个新的处理程序(),如果该计时器尚未关闭,则将其停止。 基本上,您知道如果尚未调用鼠标,鼠标仍会在那里。计时器将