2011-12-23 16 views
7

Udało mi się dodać szpilki do mapy do nakładki mapy, ale ładuje się powoli i poruszanie się po mapie jest powolne. Myślę, że to jest, gdy pobiera piny map z serwera. Kołki mają tylko około 20-30 kb, ale czasami mogą być 25 szpilek do dodania. Próbowałem już dodać szpilki w tle, ale spowoduje to przerwę w aplikacji. Co mogę zrobić, aby dodać kołki w tle bez wpływu na wydajność?Używanie zadania ASYNC do ładowania pinów mapy

Otrzymuję lokalizację z mapy, gdy użytkownik dotknie mapy i wykona to zadanie ASYNC.

private class mapStations extends AsyncTask<Void, Void, JSONObject> { 

    @Override 
    protected JSONObject doInBackground(Void... arg0) { 

     JSONObject obj = null; 
     try { 
      obj = new JSONObject(API.nearByStations(pxLat, pxLng, 0)); 

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

     return obj; 
    } 

    @Override 
    protected void onPostExecute(JSONObject details) { 
     String tag = "mapStations"; 
     JSONArray stations; 
     Drawable d = null; 
     try { 
      mapOverlays = mapView.getOverlays(); 
      mapOverlays.clear(); 
      stations = details.getJSONArray("stations"); 

      for (int j = 0; j < stations.length(); j++) { 
       JSONObject jsonObject = stations.getJSONObject(j); 
       Log.i(tag, "url: " + jsonObject.getString("logo")); 
       try { 

        Bitmap staticImage = BitmapFactory 
          .decodeStream((InputStream) new URL(jsonObject.getString("logo")) 
            .getContent()); 
        d = new BitmapDrawable(staticImage); 

       } catch (MalformedURLException e) { 
        Log.e(tag, e.toString()); 
        e.printStackTrace(); 
       } catch (IOException e) { 
        Log.e(tag, e.toString()); 
        e.printStackTrace(); 
       } 
       add(jsonObject.getDouble("lat"), 
         jsonObject.getDouble("lng"), d); 
      } 

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

    } 
} 

public void add(double lat, double lng, Drawable d) { 

    mapOverlays = mapView.getOverlays(); 
    if(d.equals(null)){ 
     Log.i(tag, "d was null"); 
     d = this.getResources().getDrawable(R.drawable.androidmarker); 
    } 

    itemizedOverlay = new MapsOverlay(d); 

    GeoPoint point = new GeoPoint((int) (lat * 1e6), (int) (lng * 1e6)); 
    OverlayItem overlayitem = new OverlayItem(point, "", ""); 

    itemizedOverlay.addOverlay(overlayitem); 
    mapOverlays.add(itemizedOverlay); 
} 

To jest logcat z dodawania punktów na doinbackground. Nie zdarza się to za każdym razem, ale się zdarza. Nie mogę się też rozmnażać, kiedy to się dzieje. Czasami zdarza się, gdy pomniejszam, czasem zdarza się, gdy poruszam się po mapie. Miałem podobne pytanie o to tutaj Android MapView JSON Array Adding Array of points, ale skończyło się przeniesienie go do wykonania postu. Tak jak wspomniałem wcześniej, ładowanie pinów zajmuje trochę czasu. Piszę teraz trochę na straty. Pracowałem nad tym cały dzień.

[12-23 13:46:27.246: E/AndroidRuntime(1359): Uncaught handler: thread main exiting due to uncaught exception 
12-23 13:46:27.286: E/AndroidRuntime(1359): java.util.ConcurrentModificationException 
12-23 13:46:27.286: E/AndroidRuntime(1359):  at java.util.AbstractList$SimpleListIterator.next(AbstractList.java:64) 
12-23 13:46:27.286: E/AndroidRuntime(1359):  at com.google.android.maps.OverlayBundle.draw(OverlayBundle.java:41) 
12-23 13:46:27.286: E/AndroidRuntime(1359):  at com.google.android.maps.MapView.onDraw(MapView.java:476) 
12-23 13:46:27.286: E/AndroidRuntime(1359):  at android.view.View.draw(View.java:6535) 
12-23 13:46:27.286: E/AndroidRuntime(1359):  at android.view.ViewGroup.drawChild(ViewGroup.java:1531) 
12-23 13:46:27.286: E/AndroidRuntime(1359):  at android.view.ViewGroup.dispatchDraw(ViewGroup.java:1258) 
12-23 13:46:27.286: E/AndroidRuntime(1359):  at android.view.ViewGroup.drawChild(ViewGroup.java:1529) 
12-23 13:46:27.286: E/AndroidRuntime(1359):  at android.view.ViewGroup.dispatchDraw(ViewGroup.java:1258) 
12-23 13:46:27.286: E/AndroidRuntime(1359):  at android.view.View.draw(View.java:6538) 
12-23 13:46:27.286: E/AndroidRuntime(1359):  at android.widget.FrameLayout.draw(FrameLayout.java:352) 
12-23 13:46:27.286: E/AndroidRuntime(1359):  at android.view.ViewGroup.drawChild(ViewGroup.java:1531) 
12-23 13:46:27.286: E/AndroidRuntime(1359):  at android.view.ViewGroup.dispatchDraw(ViewGroup.java:1258) 
12-23 13:46:27.286: E/AndroidRuntime(1359):  at android.view.ViewGroup.drawChild(ViewGroup.java:1529) 
12-23 13:46:27.286: E/AndroidRuntime(1359):  at android.view.ViewGroup.dispatchDraw(ViewGroup.java:1258) 
12-23 13:46:27.286: E/AndroidRuntime(1359):  at android.view.ViewGroup.drawChild(ViewGroup.java:1529) 
12-23 13:46:27.286: E/AndroidRuntime(1359):  at android.view.ViewGroup.dispatchDraw(ViewGroup.java:1258) 
12-23 13:46:27.286: E/AndroidRuntime(1359):  at android.view.ViewGroup.drawChild(ViewGroup.java:1529) 
12-23 13:46:27.286: E/AndroidRuntime(1359):  at android.view.ViewGroup.dispatchDraw(ViewGroup.java:1258) 
12-23 13:46:27.286: E/AndroidRuntime(1359):  at android.view.ViewGroup.drawChild(ViewGroup.java:1529) 
12-23 13:46:27.286: E/AndroidRuntime(1359):  at android.view.ViewGroup.dispatchDraw(ViewGroup.java:1258) 
12-23 13:46:27.286: E/AndroidRuntime(1359):  at android.view.View.draw(View.java:6538) 
12-23 13:46:27.286: E/AndroidRuntime(1359):  at android.widget.FrameLayout.draw(FrameLayout.java:352)][1] 
12-23 13:46:27.286: E/AndroidRuntime(1359):  at android.view.ViewGroup.drawChild(ViewGroup.java:1531) 
12-23 13:46:27.286: E/AndroidRuntime(1359):  at android.view.ViewGroup.dispatchDraw(ViewGroup.java:1258) 
12-23 13:46:27.286: E/AndroidRuntime(1359):  at android.view.ViewGroup.drawChild(ViewGroup.java:1529) 
12-23 13:46:27.286: E/AndroidRuntime(1359):  at android.view.ViewGroup.dispatchDraw(ViewGroup.java:1258) 
12-23 13:46:27.286: E/AndroidRuntime(1359):  at android.view.View.draw(View.java:6538) 
12-23 13:46:27.286: E/AndroidRuntime(1359):  at android.widget.FrameLayout.draw(FrameLayout.java:352) 
12-23 13:46:27.286: E/AndroidRuntime(1359):  at com.android.internal.policy.impl.PhoneWindow$DecorView.draw(PhoneWindow.java:1830) 
12-23 13:46:27.286: E/AndroidRuntime(1359):  at android.view.ViewRoot.draw(ViewRoot.java:1349) 
12-23 13:46:27.286: E/AndroidRuntime(1359):  at android.view.ViewRoot.performTraversals(ViewRoot.java:1114) 
12-23 13:46:27.286: E/AndroidRuntime(1359):  at android.view.ViewRoot.handleMessage(ViewRoot.java:1633) 
12-23 13:46:27.286: E/AndroidRuntime(1359):  at android.os.Handler.dispatchMessage(Handler.java:99) 
12-23 13:46:27.286: E/AndroidRuntime(1359):  at android.os.Looper.loop(Looper.java:123) 
12-23 13:46:27.286: E/AndroidRuntime(1359):  at android.app.ActivityThread.main(ActivityThread.java:4363) 
12-23 13:46:27.286: E/AndroidRuntime(1359):  at java.lang.reflect.Method.invokeNative(Native Method) 
12-23 13:46:27.286: E/AndroidRuntime(1359):  at java.lang.reflect.Method.invoke(Method.java:521) 
12-23 13:46:27.286: E/AndroidRuntime(1359):  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:860) 
12-23 13:46:27.286: E/AndroidRuntime(1359):  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:618) 
12-23 13:46:27.286: E/AndroidRuntime(1359):  at dalvik.system.NativeStart.main(Native Method) 
+0

Zdefiniuj "Przerwij aplikację". Ponadto Logcat. – MrZander

+0

Zniknie, dokonałem edycji dla logcat i dodałem dodatkowe komentarze. –

Odpowiedz

2

Aby uniemożliwić użytkownikowi nieumyślne edytowanie listy podczas jej edycji. Zdecydowałem się umieścić okno dialogowe w onPreExecute() podczas ładowania pinów. Zapobiegło to dotknięciu mapy przez użytkownika podczas dodawania nowych szpilek. Dopóki nie znajdę czasu na wymyślenie lepszego sposobu, aby temu zapobiec, będzie to musiało być zrobione.

Usuwam nakładki z mapy, zanim zacznę dodawać nowe piny, jest to zakończone podczas onPreExecute(). Na onPostExecute() odrzucam okno dialogowe i wyświetlam mapę. Spowoduje to narysowanie nowych szpilek mapy na mapie po dodaniu ich do listy.

@Override 
    protected void onPreExecute() { 
     Log.i(tag, "AsyncTask Started"); 
     dialog.show(); 
     mapOverlays = mapView.getOverlays(); 
     mapOverlays.clear(); 
    } 

@Override 
    protected void onPostExecute(Void args) { 
     mapView.invalidate(); 
     dialog.dismiss(); 
     Log.i(tag, "AsyncTask Post"); 
    } 
1

Zazwyczaj ConcurrentModificationException próbuje się zmodyfikować listę podczas jej iterowania. Aby pokonać wyjątek, możesz użyć specjalnej listy o nazwie CopyOnWriteArrayList. Pozwala bezpiecznie dodawać i usuwać elementy z listy podczas iteracji. Mam nadzieję że to pomoże.

+0

Przykro mi, ale wciąż nie mogę sobie pozwolić. Nadal nie rozumiem, jak mogę załadować te piny w tle. To jest tak przypadkowe, kiedy FC na mnie. Otrzymuję ten sam błąd w LogCat. Zawęziłem go do funkcji dodawania, która spowodowała problem. Skomentowałem polecenie dodania do funkcji i błąd został zatrzymany. Więc coś w tej funkcji powoduje mi ten problem. –

+0

@BrandonWilson, Znaczy, wywołujesz funkcję add() wewnątrz pętli iterującej nad listą, co powoduje błąd. Nie możesz modyfikować listy podczas jej iterowania, spróbuj znaleźć inne rozwiązanie swojego problemu. – Egor

+0

cóż, utknąłem w tym, co próbuję. Więc zasadniczo próbuję modyfikować coś, co już modyfikuję? Sądziłem, że tylko jeden AsyncTask może być jednorazowy. Czy mogę tu pomóc? Rozumiem, że dałeś mi wskazówkę, ale to nie pomogło, przepraszam. –

1

Twoja aplikacja porusza się powoli, ponieważ funkcja onPostExecute jest wykonywana w wątku interfejsu użytkownika. Dekodowanie bitmapowe, które tu robisz, powoduje spowolnienie interfejsu użytkownika, ponieważ jest on intensywny w sieci i robisz to w wątku interfejsu użytkownika. Sugerowałbym pobranie wszystkich bitmap na wątku doInBackground, a następnie dodanie ich do mapy w metodzie onPostExecute. Jedyne co powinieneś zrobić w wątku UI to metoda dodawania.

+0

Innym problemem jest uzyskanie 'ConcurrentModificationException', gdy użytkownik dotknie mapy podczas aktualizacji listy. Jedynym sposobem obejścia tego problemu było użycie okna dialogowego, aby uniemożliwić użytkownikowi dotknięcie ekranu. –

Powiązane problemy