2014-11-14 1 views
1

Я ищу способ вернуть ответ, который я получаю в loopJ AsyncHttpClient onFinish или onSuccess или onFailure. В настоящее время у меня есть этот кусок кода:Android - loopJ AsyncHttpClient return response 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 («Исключение», «JSONException» + e.toString()); регистрируется, а затем Log.d («onSuccess:», jsonString); регистрирует значение, поскольку оно находится в состоянии синхронизации.

Во втором вызове: jObj = новый JSONObject (jsonString); успешно выполняется, и я получаю желаемое возвращаемое значение для метода, потому что к этому времени метод onSuccess уже присвоил значение переменной jsonString.

Теперь то, что я точно ищу, является способом предотвратить преждевременно возврат jObj из метода.

Есть ли способ сделать getJSONObj, дождаться завершения задачи AsyncHttpClient, назначить переменную в jsonString, создать JSONObject и вернуть его?

Заранее благодарен! Приветствия!

+0

использование retrofit ... – mapodev

+0

@ mapo87 спасибо за ранний ответ. У меня вопрос о дооснащении, поддерживает ли он https-пост и постоянный Cookie Store? – Ganesh

+0

https: yes, cookies: вам нужно установить это, но да – mapodev

ответ

6

Используйте интерфейс. Таким образом, вы можете создать свой собственный callback, методы которого можно вызывать из 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. Могу ли я ссылаться на такой пример? Cheers :) – Ganesh

+0

@justine powell Я следил за вашим кодом, и у меня есть исключение. Не могли бы вы подумать об исключении? http://pastebin.com/gHwzdhxa ps: Я указал переменную сверху: ** OnJSONResponseCallback callback **; Строка 'callback.onJSONResponse (false, jObj);' является причиной этого исключения. есть идеи? :) – Ganesh

+1

Это означает, что ваш обратный вызов здесь null. Вы не должны определять обратный вызов здесь, вы должны определить его там, где вы называете getJSONObj (как я показал в качестве примера в своем ответе). –

1

Использование retrofit. Он очень хорошо управляет HTTP-запросом и автоматически преобразует json-объекты в ваши объекты Java. Существует также отказ и успех Callback. Вы также можете решить, является ли запрос асинхронным или синхронизирующим.