6

以下は、getSelf() を呼び出してユーザー オブジェクトを取得しようとしているメソッドです。問題は、結果を返す時点で Volley リクエストが終了していないため、結果が常に null になることです。私は非同期プロセスに少し慣れていないので、API 呼び出しの結果が UserBean オブジェクトを返すのをメソッドに待機させる最善の方法がわかりません。誰か助けてくれませんか?

public UserBean getSelf(String url){

    RpcJSONObject jsonRequest = new RpcJSONObject("getSelf", new JSONArray());

    JsonObjectRequest userRequest = new JsonObjectRequest(Request.Method.POST, url, jsonRequest, 
        new Response.Listener<JSONObject>() {
            @Override
            public void onResponse(JSONObject response) {

                String result;
                try {
                    result = response.getString("result");
                    Gson gson = new Gson();
                    java.lang.reflect.Type listType = new TypeToken<UserBean>() {}.getType();

                    //HOW DO I RETURN THIS VALUE VIA THE PARENT METHOD??
                    userBean = (UserBean) gson.fromJson(result, listType);

                } catch (JSONException e) {
                    e.printStackTrace();
                }

            }
        }, new Response.ErrorListener() {
            @Override
            public void onErrorResponse(VolleyError error) {
               Log.e("Error:", error.toString());
               finish();
            }
        }
    );

    this.queue.add(userRequest);


    return userBean;

}   
4

2 に答える 2

15

検索とグーグルからこの質問に来る人のために。

非同期リクエストは設計上非同期であるため、完了するまで待機する必要はありません。Volley を使用して同期動作を実現したい場合は、いわゆるfuturesを使用する必要があります。

String url = "http://www.google.com/humans.txt";

RequestFuture<String> future = RequestFuture.newFuture();
StringRequest request = new StringRequest(Request.Method.GET, url, future, future)
mRequestQueue.add(request);

String result = future.get(); // this line will block

ブロッキング コードを別のスレッドで実行する必要があることに注意してくださいAsyncTask(そうしないと、future.get()永久にブロックされます)。

于 2015-06-26T13:53:55.957 に答える
0

ライブラリ VolleyPlus https://github.com/DWorkS/VolleyPlusを使用してこれを実現できます。

VolleyTickle と RequestTickle と呼ばれるものがあります。リクエストは同じです。これは同期リクエストであり、一度に 1 つのリクエストのみです。

于 2014-03-07T12:05:58.780 に答える