0

私は ASyncHttpClient を使用して単純な「get」を実行しており、その動作と onSuccess() 関数で正しい json 応答を提供していますが、文字列応答を変数に保存してその変数を関数に返そうとすると、常に空の文字列を返します。

コード:

public class HttpRequests 
{   
    public String jsonString = "";

    public String add_guest(String name, String id, String hardware_id) 
    { 
        AsyncHttpClient client = new AsyncHttpClient();
        String url = "http://www.mysite.com/api.php?name="+name+"&id="+id+"&hardware_id="+hardware_id;

        client.get(url, new JsonHttpResponseHandler() 
        {
            @Override
            public void onSuccess(JSONObject response)
            {
                jsonString = response.toString();
            //this successfully ouputs the json response in LogCat
                Log.d("response:",jsonString);
            }

            @Override
            public void onFailure(Throwable e) 
            {
                Log.d("http error:",e.toString());
            }
        });
        //this returns ""
        return jsonString;
    }
}

onSuccess 内の jsonString が、返される jsonString と同じスコープにないかのようです。この背後にある理由は、多くの API 呼び出しがあり、それらをすべて同じクラスに保持し、必要なときに他のさまざまなクラスから呼び出して、そこから json を解析したいからです。文字列の代わりにjsonオブジェクトも返そうとしましたが、これと同じ取引です..他のクラスからは空白になります。(onSuccessで適切に設定していません)

何か案は..?

編集:

申し訳ありませんが、明確にする必要がありました。他のクラスから add_guest を呼び出しています。これは私の他のクラスからのものです:

String response = "";
HttpRequests myRequest = new HttpRequests();
response = myRequest.add_guest("bob","1","123");

add_guest を呼び出すことで、JsonHttpResponseHandler を呼び出す必要があります。これは、jsonString を応答に設定して返す必要があります..何か不足していない限り..

4

1 に答える 1

3

コードを詳しく見てみましょう。

public class HttpRequests 
{   
    public String jsonString = "";

これにより、という名前のメンバー変数が宣言jsonStringされ、空の文字列に初期化されます。

    public String add_guest(String name, String id, String hardware_id) 
    { 
        AsyncHttpClient client = new AsyncHttpClient();
        String url = "http://www.mysite.com/api.php?name="+name+"&id="+id+"&hardware_id="+hardware_id;

        client.get(url, new JsonHttpResponseHandler() 

これによりJsonHttpResponseHandler、応答が利用可能になったときに呼び出されるオブジェクトが作成されます。このハンドラーのコードはまだ実行されていないことに注意してください。オブジェクトは作成されるだけです。

        {
            @Override
            public void onSuccess(JSONObject response)
            {
                jsonString = response.toString();
            //this successfully ouputs the json response in LogCat
                Log.d("response:",jsonString);
            }

            @Override
            public void onFailure(Throwable e) 
            {
                Log.d("http error:",e.toString());
            }
        });
        //this returns ""
        return jsonString;

""コメントにあるように、ハンドラーコードが実行されていないため、これが返されます。ハンドラーが終了した後、呼び出し元に文字列を与える方法を見つける必要があります。

    }
}

さらなる提案:

を呼び出すコードを見た後、add_guest()頭に浮かぶ1つの可能な解決策は、add_guest()returnに変更し、呼び出されたvoidに別のメソッドを追加することです。このメソッドは、応答を待ってからを返すことができます。これを行うには、ローカルではなく、メンバー変数として宣言する必要があります。私はこのクラスに慣れていませんが、応答が発生するまでブロックするメソッドがあるのではないかと思います。HttpRequestsgetResponse()jsonStringAsyncHttpClient clientadd_guest()AsyncHttpClient

別の可能な解決策は、コンストラクターを追加するHttpRequests(JsonHttpResponseHandler)ことです。次に、呼び出すクラスをadd_guest()実装JsonHttpResponseHandlerして(抽象クラ​​スではなくインターフェイスであると想定して)、応答を直接取得できます。

于 2013-01-25T02:27:26.370 に答える