与 JSONObjectRequest 同步 (Android)

Synchronization with JSONObjectRequest (Android)

我正在制作一个 Android 应用程序,我需要制作一个 JSONObjectRequest 以从 [=36] 中的 package.json 获取参数 (logo) =] 存储库。

这是我发出 JSON 请求的方法

public void askLogoPath(String url) {

    JsonObjectRequest req = new JsonObjectRequest(url,
            new Response.Listener<JSONObject>() {
                @Override
                public void onResponse(JSONObject response) {
                    try {
                        if (response.has("logo"))
                           Global.getInstance().setLogo(response.getString("logo"));
                    } catch (JSONException e) {
                        e.printStackTrace();
                    }

                }
            }, new Response.ErrorListener() {
        @Override
        public void onErrorResponse(VolleyError error) {
            error.printStackTrace();
        }
    });

    // Adding request to request queue
    QueueController.getInstance().addToRequestQueue(req);

}

我在 Global class 中定义了一个遵循单例模式的变量 (logo),因此我可以在我的程序中的任何地方访问它。发出此请求后,我想设置一个值为 logo 的变量。

这是我调用上一个函数的代码。

if (full_name != null) {
        String url = "https://raw.githubusercontent.com/" + full_name + "/master/";
        this.askLogoPath(url + "package.json");
        this.setLogoPath(Global.getInstance().getLogo());
}

我注意到onResponse部分是最后一个被执行的,所以当我这样做的时候setLogoPath(Global.getInstance.getLogo())标志仍然是空的,所以我不能在logoPath中设置上一行。我想等到它被执行,所以它不会为空。

有什么方法可以让它同步吗?

非常感谢

既然你想同步完成,你可以使用一个线程来锁定进程直到它完成

new Thread(new Runnable() {
        @Override
        public void run() {
            //set your logo
        }
    }).start();

如果您不介意异步执行此操作,请使用 AsyncTask。网上有很多例子

你可以调用这行代码:

this.setLogoPath(Global.getInstance().getLogo());

根据您的 AsyncTask 的响应。因此,您可以执行 AsyncTask.

onComplete() 函数

通过添加 回调 解决了这个问题。当JSON请求收到响应后,它会调用回调函数的onSuccess()方法,而在main函数中剩下的代码都在这个onSuccess()方法里面。