2017-05-30 4 views
-2

私のサーバからvolleyを使用して緯度と経度のリストを取得しています。ここに関数があります。LatLng ArraylistがonReponse()で復帰しないVolley

private List<LatLng> getLocations() { 
    final List<LatLng> pos = new ArrayList<>(); 
    StringRequest rqst = new StringRequest(Request.Method.POST, "http://www.findandgo.in/server/getAllUsersLocation.php", 
      new Response.Listener<String>() { 
     @Override 
     public void onResponse(String response) { 
      try { 
       JSONArray array = new JSONArray(response); 
       for (int i=0; i<array.length(); i++) { 
        JSONObject object = array.getJSONObject(i); 
        Double lat = Double.parseDouble(object.getString("user_latitude")); 
        Double longi = Double.parseDouble(object.getString("user_longitude")); 
        LatLng latLng = new LatLng(lat,longi); 
        pos.add(latLng); 
//here the list is returning size 
        } 
       } catch (JSONException e) { 
        e.printStackTrace(); 
       } 
      } 
     }, new Response.ErrorListener() { 
      @Override 
      public void onErrorResponse(VolleyError error) { 
       error.printStackTrace(); 
       Toast.makeText(HomeActivity.this,error.toString(),Toast.LENGTH_SHORT).show(); 
      } 
     }); 
     RequestQueue rq = Volley.newRequestQueue(getApplicationContext()); 
     rq.add(rqst); 
     //here the list is showing size 0 
     return pos; 
    } 

上記の関数は空リストを返しているが、私は値が存在するかどうかを確認するためにonResponseにログ値を使用する場合、それが表示されます。

答えて

0

Volleyは本質的に非同期なので、ここでは順次フローが予想されます。ドキュメントが言うことを参照してください - 正しく データを使用してUIを移入することが容易になります

強い順序は、ネットワークから非同期をフェッチ。

onResponse()メソッドは、正常なPOSTの後にクライアントがサーバー応答を受け取ったときに呼び出されます。

リスト "pos"(メソッド本体の最後)を返すとき、その時点でサーバがlat-long値のリストをまだ受け取っていないので、そのリストは空です。

したがって、サーバーの応答を受け取ったときに、作成されたリストが呼び出し元関数に返されるように、onResponse()でリストを返す必要があります。

try { 
       JSONArray array = new JSONArray(response); 
       for (int i=0; i<array.length(); i++) { 
        JSONObject object = array.getJSONObject(i); 
        Double lat = Double.parseDouble(object.getString("user_latitude")); 
        Double longi = Double.parseDouble(object.getString("user_longitude")); 
        LatLng latLng = new LatLng(lat,longi); 
        pos.add(latLng); 
//here the list is returning size 
        } 
return pos; //return list here (since list is populated now) 

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

これは、サーバーが応答を送信するまでに時間がかかる可能性があるため、これは必ずしも最良の方法ではありません。したがって、UIがこの遅延を適切に処理することを確認してください(その間にProgressDialogを表示してください)。

EDIT - あなたはonResponseからリスト<>を返すことはできませんので、hereを示すように、あなたはコールバックインターフェースを使用することができます。コールバックインタフェースを使用して

サンプルコードは -

@Override 
public void onResponse(String response) { 
    coordinates = parseLocation(response); 
    if((coordinates == null && coordinates.isEmpty())||coordinates.equals("NOT_VALID_ADDRESS")) { 
     showAlert("Please Enter A Valid Zip Code"); 
    } else { 
     useCoordinates(coordinates); 
    } 
} 
Then implement the method that uses the coordinates: 

public void useCoordinates(Location coordinates) { 
    // Use the value 
} 
+0

しかし、それは見てください がvoid結果型 –

+0

とメソッドから値を返すことができません示してい私の編集。ありがとう。 –

+0

ありがとう、兄。あなたは私の一日を救った。 –

1

理由がボレークラス外で使用すると、結果を得ることはありませんということです。非同期であるためです。私はonResponse()から復帰しようとした場合に取得するための関数をコールバック使うことになるか、そのボレー方法でコードを使用

private void getLocations() { 
    final List<LatLng> pos = new ArrayList<>(); 
    StringRequest rqst = new StringRequest(Request.Method.POST, "http://www.findandgo.in/server/getAllUsersLocation.php", 
      new Response.Listener<String>() { 
     @Override 
     public void onResponse(String response) { 
      try { 
       JSONArray array = new JSONArray(response); 
       for (int i=0; i<array.length(); i++) { 
        JSONObject object = array.getJSONObject(i); 
        Double lat = Double.parseDouble(object.getString("user_latitude")); 
        Double longi = Double.parseDouble(object.getString("user_longitude")); 
        LatLng latLng = new LatLng(lat,longi); 
        pos.add(latLng); 


        } 
        //do your code here 
        SomthingFunction(pos); call a function 

       } catch (JSONException e) { 
        e.printStackTrace(); 
       } 
      } 
     }, new Response.ErrorListener() { 
      @Override 
      public void onErrorResponse(VolleyError error) { 
       error.printStackTrace(); 
       Toast.makeText(HomeActivity.this,error.toString(),Toast.LENGTH_SHORT).show(); 
      } 
     }); 
     RequestQueue rq = Volley.newRequestQueue(getApplicationContext()); 
     rq.add(rqst); 

    } 
関連する問題