1

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 投稿を終了する前に、 JSONExceptionを取得します。

最初の呼び出しで、次のことに気付きました: Log.e("Exception", "JSONException " + e.toString()); ログに記録されてから Log.d("onSuccess: ", jsonString); 同期状態にあるため、値をログに記録します。

2 回目の呼び出し: jObj = new JSONObject(jsonString); 正常に実行され、メソッドの目的の戻り値が得られます。これは、その時点までに onSuccess メソッドが既に値を変数 jsonString に割り当てているためです。

今私がまさに探しているのは、メソッドからの jObj の早期復帰を防ぐ方法です。

メソッドgetJSONObjを作成し、AsyncHttpClientタスクの完了を待ち、変数をjsonStringに割り当て、JSONObjectを作成して返す方法はありますか?

前もって感謝します!乾杯!

4

2 に答える 2

7

インターフェイスを使用します。このようにして、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
    }
});
于 2014-11-14T20:37:05.873 に答える