2016-12-10 3 views
0

Ich bekomme Plätze mit Google Maps und nachrüsten und füge sie in eine Liste. Ich möchte alle Orte in einer Liste sammeln, ich habe es wie folgt gemacht, aber allItem Listengröße gibt immer 0 zurück, ich kann nicht herausfinden, warum, fehlt mir etwas ?. Kann mir jemand helfen?Android - ArrayList Größe immer zurück 0

Mein Globals

ArrayList<MapData.ResultsBean> myList; 
ArrayList<MapData.ResultsBean> allItems; 

Button-Klick-Funktion

menuOption1.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View v) { 

       myList = new ArrayList<MapData.ResultsBean>(); 
       allItems = new ArrayList<MapData.ResultsBean>(); 

       allItems.addAll(selectAllFrom("restaurant", myList)); 
       allItems.addAll(selectAllFrom("cafe", myList)); 
       allItems.addAll(selectAllFrom("bar", myList)); 

       Log.v("Size", "Places List size : " + allItems.size() + ""); 
      } 
     }); 

SelectAllFrom Funktion

private ArrayList<MapData.ResultsBean> selectAllFrom(final String type, final ArrayList<MapData.ResultsBean> list) { 

     // Creating an object of our api interface 
     ApiService myApi = RetroClient.getApiService(); 

     // Calling JSON 
     Call<MapData> call = myApi.getNearbyPlaces(type, mLastLocation.getLatitude() + "," + mLastLocation.getLongitude(), PROXIMITY_RADIUS); 

     call.enqueue(new Callback<MapData>() { 
      @Override 
      public void onResponse(Call<MapData> call, Response<MapData> response) { 

       Log.v("Response Code", "Response Code is : " + response.code()); 

       if (response.isSuccessful()){ 

        try { 
         // This loop will go through all the results 
         for (int i = 0; i < response.body().getResults().size(); i++) { 
          addToList(list, response.body().getResults().get(i)); 
         } 

         Log.v(type, "List Size : " + list.size() + ""); 

        } catch (Exception e) { 
         Log.d("onResponse", "There is an error"); 
         e.printStackTrace(); 
        } 

       } else { 
        Toast.makeText(getApplicationContext(), "Something work wrong", Toast.LENGTH_LONG).show(); 
       } 

      } 

      @Override 
      public void onFailure(Call<MapData> call, Throwable t) { 

       Toast.makeText(getApplicationContext(), "On Failure", Toast.LENGTH_LONG).show(); 
      } 
     }); 


     return list; 

    } 

und letzte, hier ist meine addToList Funktion

void addToList(ArrayList<MapData.ResultsBean> myList, MapData.ResultsBean item){ 
    if(!myList.contains(item)) 
     myList.add(item); 
} 

Das ist mein logcat ist, kehrt allItem Größe immer 0

V/Size: Places List size : 0 
V/restaurant: List Size : 20 
V/bar: List Size : 21 
V/cafe: List Size : 41 
+0

Sie erstellen zwei neue leere Listen unter 'menuOption1.setOnClickListener', wenn Sie new verwenden, und dann drucken Sie die Größe der Orte. – TDG

Antwort

0

Der Rückruf in call.enqueue(...) asynchron ausgeführt werden. Dies bedeutet, dass es zu einem beliebigen Zeitpunkt in der Zukunft aufgerufen werden kann.

Das bedeutet, was Ihr Code tut, ist:

  • Anruf selectAllFrom
  • Anruf call.enqueue(...)
  • Return list, die
  • an dieser Stelle noch leer zu allItems
  • Fügen Sie die leere Liste
  • [Zu einem späteren Zeitpunkt] Anrufe addToList im Rückruf

Dies ist einfach ein Fall von versuchen, eine asynchrone Ressource synchron zu verwenden. Es ist tatsächlich eine Race-Bedingung, da der asynchrone Callback aufgerufen werden kann, wenn selectAllFrom für einen anderen Wert aufgerufen wird, da es eine gemeinsame myList verwendet, was zu einer falschen Antwort führt.

Wenn Sie asynchrone Ressourcen (wie Retrofits Aufrufe) verwenden, müssen Sie entweder auf einen Wert warten (call.execute()) und sich damit abfinden, dass es die Benutzeroberfläche einfriert oder vollständig asynchrone Methoden ausführt.

EDIT: Beachten Sie auch, dass Android strenge Anforderungen an Threads und die Benutzeroberfläche hat. Toast.makeText() im Callback wird wahrscheinlich Ausnahmen verursachen, da der Callback nicht auf dem UI-Thread ausgeführt wird.

+0

Ich sehe, also muss ich warten, bis Nachrüstantwort fertig ist, dann Anrufliste, habe ich recht? – ysfcyln

+0

Bis zur Nachrüstung wird die Liste leer sein. Wie Sie mit dem asynchronen Verhalten umgehen, ist Ihre Entscheidung als Entwickler – Kiskae

Verwandte Themen