我目前正在通过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、使线程睡眠等,也看到/尝试过这些(以及更多其他)链接,
如何等待异步http结束后再继续?
https://forum.qt.io/topic/5389/how-to-ensure-fully-asynchronous-web-requests
如何等待所有请求完成
如何让主线程等待,当我不知道异步任务何时完成作业时。?
我还试图在注释掉代码的存储部分时,对接收到的对象进行吐司。(上面评论)代码没有崩溃,但吐司只在web请求完成后出现。
我该如何解决这个问题?(即,在web请求完成后,成功存储对象而不使应用程序崩溃仅)。我在网上搜索了很长时间,但没有找到一个可行的方法,我在安卓系统中还是个新手。
请帮忙,如果需要更多的细节,请告诉我。提前感谢!
由于您正在执行的请求是异步的,因此您应该在其完成处理程序中使用请求的响应。
将代码更改为类似的代码
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(即在类作用域),如果显示无法访问处理机
由于异步调用在后台运行,因此在实际保存数据之前执行剩余的代码。
getDescription=dirDirectoryJson.get(0).getString("description").toString().trim();
setDescription( getDescription );
把这些行写进你的onSuccess方法中,让它发挥作用。