2014-11-14 43 views
1

我正在尋找一種方式來返回我在loopJ AsyncHttpClient onFinish或onSuccess或onFailure中得到的響應。截至目前,我有這樣的一段代碼:Android - loopJ AsyncHttpClient返回響應onFinish或onSuccess

**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(); 

我得到JSONException的onSuccess之前或onFailure處方法完成的HTTP POST。我注意到,在第一次調用時: Log.e(「Exception」,「JSONException」+ e.toString()); Log.d(「onSuccess:」,jsonString);記錄它們處於同步狀態的值。

關於第二次調用: jObj = new JSONObject(jsonString);得到成功執行,我得到期望的方法返回值,因爲那時onSuccess方法已經將該值分配給變量jsonString。

現在我正在尋找的方法是防止提前從方法返回jObj。

有沒有辦法使getJSONObj方法,等待AsyncHttpClient任務的完成,將該變量分配給jsonString,創建JSONObject並返回它?

在此先感謝! 乾杯!

+0

使用改造... – mapodev 2014-11-14 20:27:03

+0

@ mapo87感謝您的早期答覆。我有一個關於改造的問題,它是否支持https post和持久性Cookie存儲? – Ganesh 2014-11-14 20:30:13

+0

https:是,cookies:你需要設置它,但是是 – mapodev 2014-11-14 20:35:51

回答

6

使用接口。這樣您就可以創建自己的回調,其方法可以從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 
    } 
}); 
+0

謝謝!我真的是Android和Java開發的新手。我可以有這樣一個例子的參考網址嗎?乾杯:) – Ganesh 2014-11-14 20:38:45

+0

@justine powell 我跟着你的代碼,我得到一個異常。請介意處理例外情況嗎? http://pastebin.com/gHwzdhxa ps:我已經聲明變量在頂部: ** OnJSONResponseCallback回調**; 'callback.onJSONResponse(false,jObj);'是這個異常背後的原因。有任何想法嗎? :) – Ganesh 2014-11-14 21:20:04

+1

這意味着你的回調在這裏是空的。你不應該在這裏定義回調,你應該從你調用getJSONObj的任何地方定義它(正如我在我的回答中作爲示例所示)。 – 2014-11-14 21:32:09

1

使用retrofit。它很好地管理了http請求,並將json對象自動轉換爲Java對象。還有一個失敗和成功回調。您也可以決定請求是異步還是同步。

相關問題