web-dev-qa-db-ja.com

Volleyの関数onResponseから値を返すにはどうすればよいですか?

public class getString  {
String tag_string_req = "string_raq";
String url = "http://10.0.2.2/eat/locations/index.json";
String result="";

public String get_String() {
    StringRequest strReq = new StringRequest(Request.Method.GET, url, new Response.Listener<String>() {
        @Override
        public void onResponse(String response) {
            result=response;
            System.out.println(response);
            ;

        }
    }, new Response.ErrorListener() {
        @Override
        public void onErrorResponse(VolleyError volleyError) {
            System.out.println(volleyError.getMessage());
        }
    });
    AppController.getInstance().addToRequestQueue(strReq, tag_string_req);
    return result;
}}

GetStringのオブジェクトを作成し、他のフィールドでget_Stringを呼び出します。しかし、onResponseから結果を取得するのは難しいようです。この現在の方法では機能しません。誰でもこの問題を解決するのを手伝ってもらえますか?

45
Wubin Ouyang

次のようなコールバックインターフェイスを使用します。

_public void getString(final VolleyCallback callback) {
    StringRequest strReq = new StringRequest(Request.Method.GET, url, new     Response.Listener<String>() {
        @Override
        public void onResponse(String response) {
            ...  // (optionally) some manipulation of the response 
            callback.onSuccess(response);
        }
    }...
}}
_

コールバックは次のように定義されます

_public interface VolleyCallback{
    void onSuccess(String result);
}
_

アクティビティ内のコード例:

_public void onResume(){
    super.onResume();

    getString(new VolleyCallback(){
         @Override
         public void onSuccess(String result){
             ... //do stuff here
         }
    });
}
_

VolleyCallbackをより堅牢にすることもできます。処理を行う場合はジェネリック型を使用するか、start()failed(Exception e)complete()などを追加します。もう少しきめ細かい状態チェックを行うメソッド。

これは非同期呼び出しであるため、結果を取得するとき(success()内)にビューなどを更新する必要があります。

123
wblaschko