我目前正在通过AsyncHttpClient(loopj)Web请求请求JsonObject,但请求速度很慢,我需要继续使用Object。目前程序崩溃,因为保存的对象为空,并且在Web请求完成之前调用了save函数。
以下是我正在尝试做的代码片段:
btnCreate.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
AsyncHttpClient client = new AsyncHttpClient();
String apiAddress = MYAPIADDRESS;
client.get(apiAddress,
new JsonHttpResponseHandler() {
//@Override
public void onSuccess(int statusCode, Header[] headers, JSONObject response) {
try {
JSONObject tempTransition = response.getJSONArray("items").getJSONObject(0).getJSONObject("snippet");
Toast.makeText(getApplicationContext(), tempTransition.get("description").toString(), Toast.LENGTH_SHORT).show();
if(!dirDirectoryJson.contains(tempTransition)){
dirDirectoryJson.add(tempTransition);
}
} catch (JSONException e) {
e.printStackTrace();
}
}
@Override
public void onSuccess(int statusCode, Header[] headers, JSONArray timeline) {
}
@Override
public void onFinish() {
// Completed the request (either success or failure)
}
});
//*** Crashes here ****
//dirDirectoryJson returning null object from above due to call before complete web request and crashes the program
try {
getDescription = dirDirectoryJson.get(0).getString("description").toString().trim();
setDescription( getDescription );
} catch (JSONException e) {
e.printStackTrace();
}
}
我已经尝试过SyncHttpClient,进行线程睡眠等以及查看/尝试这些(以及更多其他)链接,
How to wait for async http to end before continuing?
https://forum.qt.io/topic/5389/how-to-ensure-fully-asynchronous-web-requests
How to wait for all requests to finish
How to make the Main thread wait, when i dont know when will Async task finish the job.?
我还试图在注释掉代码的存储部分时干杯收到的对象。 (上面评论)代码没有崩溃,但吐司只在Web请求完成后出现一段时间。
如何解决此问题? (即成功存储对象,而不会在Web请求完成后崩溃应用程序 )。我在网上搜索的时间非常长,但未能得到一个可行的方法,我在Android中有点新手。
请提供帮助,如果需要更多详细信息,请告知我们。提前谢谢!
答案 0 :(得分:0)
由于异步调用在后台运行,因此在实际保存数据之前执行剩余的代码。
getDescription=dirDirectoryJson.get(0).getString("description").toString().trim();
setDescription( getDescription );
将这些行写入onSuccess方法以使其正常工作。
答案 1 :(得分:0)
由于您正在执行的请求是异步的,因此您应该在其完成处理程序中执行使用请求响应的逻辑。
将您的代码更改为
public void onSuccess(int statusCode, Header[] headers, JSONObject response) {
try {
JSONObject tempTransition = response.getJSONArray("items").getJSONObject(0).getJSONObject("snippet");
Toast.makeText(getApplicationContext(), tempTransition.get("description").toString(), Toast.LENGTH_SHORT).show();
if(!dirDirectoryJson.contains(tempTransition)){
dirDirectoryJson.add(tempTransition);
}
getDescription = dirDirectoryJson.get(0).getString("description").toString().trim();
setDescription( getDescription );
} catch (JSONException e) {
e.printStackTrace();
}
}
还将变量设为实例var(即声明它们为 class scope)如果显示不能访问非最终变量 处理