web-dev-qa-db-ja.com

Android-ボレー応答が返ってくるのを待つ

Volleyリクエストを実行し、レスポンスが解析されて返されるのを待つ必要がありますが、これを実現する方法がわかりません。誰か助けてもらえますか?

私が今持っているのはこれです:

public String getLink() {
    JsonObjectRequest jsObjRequest = new JsonObjectRequest(Request.Method.GET, url, null, new Response.Listener<JSONObject>() {

            @Override
            public void onResponse(JSONObject response) {
                shortenURL = response.getString("url");
            }
        }, new Response.ErrorListener() {

            @Override
            public void onErrorResponse(VolleyError error) {
                // TODO Auto-generated method stub

           }
    });

    queue.add(jsObjRequest);

    return shortenURL;
}
20
JorgeR

ファクトリメソッド設計パターンソリューション:

他のメソッドからVolleyの応答を取得または取得するには、Callback機能を記述する必要があります。

このシンプルなソリューションは、Android完全な使いやすさおよび関心の分離コンセプトで開発されたアプリ用のAndroidのMVCアーキテクチャから取ったものです。

JSONObjectがサーバーからの応答であると仮定します

ステップ1)

InterfaceServerCallbackを作成します

package xx.xx.xx.utils;

    import org.json.JSONObject;

    public interface ServerCallback{
        void onSuccess(JSONObject result);
    }

ステップ2)あなたのものを想定Volley server request method is in Controller class your this in any any Activity

Controller controller = new Controller();
controller.youFunctionForVolleyRequest(email, password, this, loginUrl, new ServerCallback() {
                    @Override
                    public void onSuccess(JSONObject response) {
                       // do stuff here 
                    }
                  }
               );

3)コントローラクラスで、ServerCallback function in inResponse()を呼び出します。これにより、サーバーミッションからの応答でのみActivityのコードが実行されます。

 public void youFunctionForVolleyRequest(final String email , final String password ,final Context context , final String URL, final ServerCallback callback)
    {
        HashMap<String, String> params = new HashMap<String, String>();
        params.put("email", email);
        params.put("password", password);

        Log.e("sending json",params.toString());
        JsonObjectRequest jsonObjReq = new JsonObjectRequest(Request.Method.POST,
                URL, new JSONObject(params), new Response.Listener<JSONObject>()
        {

            @Override
            public void onResponse(JSONObject response) {
               callback.onSuccess(response); // call call back function here

            }
        }, new Response.ErrorListener() {

            @Override
            public void onErrorResponse(VolleyError error) {
                //VolleyLog.d("Volley error json object ", "Error: " + error.getMessage());

            }
        }){
            @Override
            public String getBodyContentType()
            {
                return "application/json";
            }
        };

        // Adding request to request queue
        AppController.getInstance().addToRequestQueue(jsonObjReq);

    }
25
Divyanshu Jimmy

メソッドでリンクを返さないでください。

Volleyはasynchronousタスクを行っています。つまり、答えがWebサービスからいつ到着するかを知ることができないことを意味します。10秒または10分です。

関数に文字列が必要な場合は、おそらくメソッドを作成し、結果が得られたら呼び出してください。

以下に例を示します。

これはあなたが持っているものだと思う

_public void getTheLinkAndCallDoSomething(){
    String link = getLink();
    doSomethingWithTheLink(link);
}
_

getLink()が同期的に応答する場合、これは機能します。ボレーはこの場合ではありません。

そして、これがVolleyでできることです。

_public void getTheLinkAndCallDoSomething(){
     JsonObjectRequest jsObjRequest = new JsonObjectRequest(Request.Method.GET, 
                               url, null, new Response.Listener<JSONObject>() {

                    @Override
                    public void onResponse(JSONObject response) {
                        shortenURL = response.getString("url");
                        doSomethingWithTheLink(shortenURL);
                    }
                }, new Response.ErrorListener() {

                    @Override
                    public void onErrorResponse(VolleyError error) {
                        // TODO Auto-generated method stub

                    }
                });

    queue.add(jsObjRequest);
}
_

この場合、WSを呼び出してURLを取得します。そして、結果がわかるとすぐに、doSomethingWithTheLink()を呼び出します

いずれにせよ、本当にsynchronousにしたい場合は、この投稿を見ることができます: Async Volleyリクエストの結果を待って返してください

また、答えを待っているとアプリのUIがフリーズする可能性があることに注意してください

お役に立てば幸いです。

13
Quentin Klein

getLink()メソッドでデータを返すことはできません。コードを次のように使用します

String shortenURL  = ""; // activity global variable



public void getLink() {
        JsonObjectRequest jsObjRequest = new JsonObjectRequest(Request.Method.GET, url, null, new Response.Listener<JSONObject>() {

                    @Override
                    public void onResponse(JSONObject response) {
                        shortenURL = response.getString("url");
                    }
                }, new Response.ErrorListener() {

                    @Override
                    public void onErrorResponse(VolleyError error) {
                        // TODO Auto-generated method stub

                    }
                });

                queue.add(jsObjRequest);

}

http://arnab.ch/blog/2013/08/asynchronous-http-requests-in-Android-using-volley/ で詳細情報を確認することもできます。

1
Giru Bhai

これは将来のコンセプトを使用して行うことができます

 RequestFuture<JSONObject> jsonObjectRequestFuture = RequestFuture.newFuture();
    JsonObjectRequest request = new JsonObjectRequest(ServiceUrl.BFF_BASE_URL + path, (JSONObject) postBody, jsonObjectRequestFuture, jsonObjectRequestFuture);
requestQueue.add(request);
JSONObject jsonObject = jsonObjectRequestFuture.get(30, TimeUnit.SECONDS);
0