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;
}
ファクトリメソッド設計パターンソリューション:
他のメソッドから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);
}
メソッドでリンクを返さないでください。
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がフリーズする可能性があることに注意してください。
お役に立てば幸いです。
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/ で詳細情報を確認することもできます。
これは将来のコンセプトを使用して行うことができます
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);