2011-12-23 4 views
7

Мне удавалось добавлять карты на мой накладной карты, но она медленно и медленно перемещается по карте, вялая. Я думаю, что это когда он загружает карты с сервера. Штыри имеют размер около 20-30 кб, но иногда могут быть добавлены 25 штырей. Я уже пытался добавить булавки в фоновом режиме, но это сломает приложение. Что я могу сделать, чтобы добавить контакты в фоновом режиме, не влияя на производительность?Использование ASYNC Задача для загрузки карт-контактов

Я получаю местоположение от карты, когда пользователь касается карты и выполняет эту задачу 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); 
} 

Это ловушка от добавления точек в doinbackground. Это происходит не каждый раз, но это происходит. Кажется, я не могу воспроизвести, когда это произойдет. Иногда это происходит, когда я уменьшаю масштаб, иногда это происходит, когда я перемещаюсь по карте. У меня был аналогичный вопрос об этом здесь Android MapView JSON Array Adding Array of points, но я в конечном итоге переместил его на пост выполнить. Как я уже упоминал ранее, потребуется некоторое время, чтобы загрузить контакты. Я вроде как не могу писать. Я работаю над этим весь день.

[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

Определите «сломать приложение». Кроме того, Logcat. – MrZander

+0

Он будет принудительным, я внес изменения для logcat и сделал дополнительные комментарии. –

ответ

2

Во избежание непреднамеренного редактирования списка, когда он уже редактируется. Я решил поместить диалог в onPreExecute(), пока булавки загружаются. Это не позволяет пользователю касаться карты при добавлении новых контактов. Пока я не найду время, чтобы придумать лучшую идею о том, как предотвратить это, это должно будет сделать.

Сбрасываю оверлеи с карты, прежде чем начинать добавлять новые контакты, это завершается во время onPreExecute(). На onPostExecute() я отклоняю диалог и invalidate() карту. Это добавит новые карты на карту после добавления их в список.

@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

The ConcurrentModificationException обычно происходит, когда вы пытаетесь изменить список в то время как итерация его. Чтобы преодолеть это исключение, вы можете использовать специальный тип списка с именем CopyOnWriteArrayList. Он безопасно позволяет добавлять и удалять элементы из списка во время итерации. Надеюсь это поможет.

+0

Простите, но я все еще здесь не понимаю. Я все еще не понимаю, как я могу выполнить загрузку этих контактов в фоновом режиме. Это так случайно, когда он FC на меня. Я получаю ту же ошибку в LogCat. Я сузил его до функции add, вызывающей проблему. Я прокомментировал добавочный вызов функции, и ошибка была остановлена. Поэтому в этой функции есть что-то, что вызывает у меня эту проблему. –

+0

@BrandonWilson, я имею в виду, вы вызываете функцию add() внутри цикла, итерации по списку, и это приводит к ошибке. Вы не можете изменить список во время его итерации, попробуйте найти другое решение своей проблемы. – Egor

+0

хорошо, я как бы застрял в том, что я пытаюсь. Так что в основном я пытаюсь изменить то, что я уже изменяю? Я думал, что только один AsyncTask может быть исключен за один раз. Можно ли мне помочь здесь. Я понимаю, что вы дали мне ключ, но это не помогло, извините. –

1

Ваше приложение медленно перемещается, потому что функция onPostExecute выполняется в потоке пользовательского интерфейса. Растровое декодирование, которое вы здесь делаете, приводит к тому, что пользовательский интерфейс работает медленно, потому что это интенсивно работает в сети, и вы делаете это в потоке пользовательского интерфейса. Я бы предложил получить все растровые изображения в потоке doInBackground, а затем фактически добавить их на карту по методу onPostExecute. Единственное, что вы должны сделать в потоке пользовательского интерфейса, это метод добавления.

+0

Другая проблема заключается в том, что я получаю «ConcurrentModificationException», когда пользователь касается карты при ее обновлении. Единственный способ обойти это - использовать диалог, чтобы пользователь не касался экрана. –

Смежные вопросы