【问题标题】:Android - loopJ AsyncHttpClient return response onFinish or onSuccessAndroid - loopJ AsyncHttpClient 返回响应 onFinish 或 onSuccess
【发布时间】:2014-11-14 20:22:14
【问题描述】:

我正在寻找一种方法来返回我在 loopJ AsyncHttpClient onFinish 或 onSuccess 或 onFailure 中得到的响应。截至目前,我有这段代码:

**jsonParse.java file**
public class jsonParse {
    static JSONObject jObj = null;
    static String jsonString = "";
    AsyncHttpClient client;

      public JSONObject getJSONObj() {
            RequestParams params;
            params = new RequestParams();
            params.add("username", "user");
            params.add("password", "password");
            client = new AsyncHttpClient();
            client.post("http://example.com", params, new TextHttpResponseHandler() {

                @Override
                public void onSuccess(int i, Header[] headers, String response) {
                    jsonString = response;
                    Log.d("onSuccess: ", jsonString);
                }

                @Override
                public void onFailure(int statusCode, Header[] headers, String response, Throwable e) {
                    if (statusCode == 401) {
                        jsonString = response;
                        Log.d("onFailure: ", jsonString);
                    }
                }

            });
            try {
                jObj = new JSONObject(jsonString);
            } catch (JSONException e) {
                Log.e("Exception", "JSONException " + e.toString());
            }
            return jObj;
        }
}

当我调用代码时:

JSONParser jsonParser = new JSONParser();
jsonParser.getJSONFromUrl(); 

我在 onSuccess 或 onFailure 方法完成 http post 之前得到 JSONException

我注意到,在第一次调用时: Log.e("异常", "JSONException" + e.toString());正在记录,然后 Log.d("onSuccess: ", jsonString);记录处于同步状态的值。

在第二次调用时: jObj = new JSONObject(jsonString);成功执行,我得到了该方法所需的返回值,因为到那时 onSuccess 方法已经将值分配给变量 jsonString。

现在我正在寻找的是一种防止 过早 从方法中返回 jObj 的方法。

有没有办法制作getJSONObj方法,等待AsyncHttpClient任务完成,将变量赋值给jsonString,创建JSONObject并返回?

提前致谢! 干杯!

【问题讨论】:

  • @mapo87 感谢您的早日回复。我有一个关于改造的问题,它是否支持 https post 和持久性 Cookie 存储?
  • https:是的,cookies:你需要设置,但是是的
  • @mapo87 感谢您的回复。我会注意的:)

标签: java android android-asynctask loopj asynchttpclient


【解决方案1】:

使用接口。这样您就可以创建自己的回调,其方法可以从 onSuccess 或 onFailure 调用。

public interface OnJSONResponseCallback {
    public void onJSONResponse(boolean success, JSONObject response);
}

public JSONObject getJSONObj(OnJSONResponseCallback callback) {
    ...
   @Override
   public void onSuccess(int i, Header[] headers, String response) {
       try {
           jObj = new JSONObject(response);
           callback.onJSONResponse(true, jObj);
       } catch (JSONException e) {
           Log.e("Exception", "JSONException " + e.toString());
       }
   }

   @Override
   public void onFailure(int statusCode, Header[] headers, String response, Throwable e) {
       try {
           jObj = new JSONObject(response);
           callback.onJSONResponse(false, jObj);
       } catch (JSONException e) {
           Log.e("Exception", "JSONException " + e.toString());
       }
   }
}

并称它为:

jsonParse.getJSONObj(new OnJSONResponseCallback(){
    @Override
    public void onJSONResponse(boolean success, JSONObject response){
       //do something with the JSON
    }
});

【讨论】:

  • 谢谢!我真的是 android 和 java 开发的新手。我可以有这样一个例子的参考网址吗?干杯:)
  • @justine powell 我遵循了您的代码,但遇到了异常。你介意经历一下例外吗? pastebin.com/gHwzdhxa ps:我在上面声明了变量:OnJSONResponseCallback callback; callback.onJSONResponse(false, jObj); 行是此异常背后的原因。有任何想法吗? :)
  • 这里表示你的回调为空。您不应该在这里定义回调,您应该从调用 getJSONObj 的任何位置定义它(正如我在回答中作为示例所示)。
  • 男人!你太棒了!正是我想要的! :) 好吧,我今天学到了一两件事!美好的一天,先生!
  • 完美,很高兴为您提供帮助!
【解决方案2】:

使用retrofit。它很好地管理了 http 请求并将 json 对象自动转换为您的 Java 对象。还有一个失败和成功回调。您还可以决定请求是异步的还是同步的。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-05-12
    • 1970-01-01
    • 2019-03-23
    • 2016-08-24
    相关资源
    最近更新 更多