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

时间:2016-05-14 05:35:55

标签: java android android-async-http loopj

我目前正在通过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中有点新手。

请提供帮助,如果需要更多详细信息,请告知我们。提前谢谢!

2 个答案:

答案 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)如果显示不能访问非最终变量   处理