与 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()
方法里面。
我正在制作一个 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()
方法里面。