2014-11-14 5 views
1

loopJ AsyncHttpClient onFinish 또는 onSuccess 또는 onFailure에서받는 응답을 반환 할 방법을 찾고 있습니다. 내가 코드를 호출 할 때Android - loopJ AsyncHttpClient return 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(); 

을 내가는 onSuccess 전에 JSONException을 얻거나 onFailure 방법은 HTTP 게시를 완료 지금부터 나는이 코드 조각이있다.

나는 첫 번째 호출에서이를 알았다 : Log.e ("Exception", "JSONException"+ e.toString()); 로그되고 Log.d ("onSuccess :", jsonString); 동기화 상태에있는 값을 기록합니다.

두 번째 호출시 : jObj = new JSONObject (jsonString); 성공적으로 실행되면 그 메서드에 대해 원하는 반환 값을 얻습니다. 그 시점에 onSuccess 메서드는 이미 변수 jsonString에 값을 할당했기 때문입니다.

내가 정확히 찾고있는 것은 예방하는 방법입니다. 조숙 한 메소드에서 jObj를 반환합니다.

어쨌든 메소드 getJSONObj를 작성하고 AsyncHttpClient 태스크 완료를 기다리고 변수를 jsonString에 할당하고 JSONObject를 작성하여 리턴하십시오.

미리 감사드립니다. 건배!

+0

개조 사용 ... – mapodev

+0

@ mapo87 초기 답장을 보내 주셔서 감사합니다. 내가 개장에 관한 질문이 있는데 https 게시물과 영구 쿠키 저장소를 지원합니까? – Ganesh

+0

https : 예, 쿠키 : 설정해야합니다. 예 : – mapodev

답변

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

감사합니다! 나는 안드로이드와 자바 개발에 정말로 안성맞춤이다. 그러한 예에 대한 참조 URL을 가질 수 있습니까? 건배 :) – Ganesh

+0

@justine powell 나는 당신의 코드를 따랐고 예외가있었습니다. 예외 상황을 겪으시겠습니까? http://pastebin.com/gHwzdhxa ps : 위에 변수를 선언했습니다 : ** OnJSONResponseCallback 콜백 **; 'callback.onJSONResponse (false, jObj);'행은이 예외의 배경입니다. 어떤 아이디어? :) – Ganesh

+1

콜백이 여기에 null임을 의미합니다. 여기서 콜백을 정의해서는 안되며, getJSONObj를 호출 할 때마다 정의해야한다. –

1

사용 retrofit. http 요청을 매우 잘 관리하고 json 객체를 자동으로 Java 객체로 변환합니다. 실패 및 성공 콜백도 있습니다. 또한 요청이 비동기인지 또는 동기화인지를 결정할 수 있습니다.