(Android|Java)AndroidAsyncHttp(Loopj)在继续线程之前完成web请求



我目前正在通过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方法中,让它发挥作用。

相关内容

  • 没有找到相关文章

最新更新