2011-12-23 14 views
7

Tôi đã thành công trong việc thêm chân bản đồ vào lớp phủ bản đồ của mình nhưng nó tải chậm và di chuyển xung quanh bản đồ là chậm chạp. Tôi nghĩ rằng đó là khi nó được tải về các chân bản đồ từ máy chủ. Các ghim chỉ có kích thước khoảng 20-30 kb, nhưng đôi khi có thể là 25 chân để thêm vào. Tôi đã cố gắng để thêm các chân trong nền nhưng nó sẽ phá vỡ các ứng dụng. Tôi có thể làm gì để thêm các chân trong nền mà không ảnh hưởng đến hiệu suất?Sử dụng ASYNC Nhiệm vụ để tải các chân bản đồ

Tôi nhận được vị trí từ bản đồ khi người dùng chạm vào bản đồ và thực hiện tác vụ ASYNC này.

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); 
} 

Đây là logcat từ việc thêm các điểm vào doinbackground. Nó không xảy ra mỗi lần nhưng nó xảy ra. Tôi không thể tái tạo khi nó xảy ra. Đôi khi điều đó xảy ra khi tôi thu nhỏ, đôi khi điều đó xảy ra khi tôi di chuyển xung quanh bản đồ. Tôi đã có câu hỏi tương tự về điều này ở đây Android MapView JSON Array Adding Array of points nhưng tôi đã kết thúc chuyển nó đến bài thực hiện. Giống như tôi đã đề cập trước đó phải mất một lúc để tải các chân. Bây giờ tôi đang bị mất. Tôi đã làm việc này cả ngày.

[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

Xác định 'ngắt ứng dụng'. Ngoài ra, Logcat. – MrZander

+0

Nó sẽ hủy bỏ, tôi đã thực hiện chỉnh sửa cho logcat và đưa ra nhận xét bổ sung. –

Trả lời

2

Để ngăn người dùng vô tình chỉnh sửa danh sách trong khi nó đang được chỉnh sửa. Tôi quyết định đặt hộp thoại trong số onPreExecute() trong khi các ghim đang được tải. Điều này đã ngăn người dùng chạm vào bản đồ trong khi các chân mới đang được thêm vào. Cho đến khi tôi có thể tìm thấy thời gian để tìm ra một ý tưởng tốt hơn về cách ngăn chặn điều này xảy ra, điều này sẽ phải làm.

Tôi xóa lớp phủ khỏi bản đồ trước khi tôi bắt đầu thêm ghim mới, điều này được hoàn thành trong onPreExecute(). Trên onPostExecute() tôi loại bỏ hộp thoại và invalidate() bản đồ. Thao tác này sẽ vẽ các chân bản đồ mới trên bản đồ sau khi thêm chúng vào danh sách.

@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

ConcurrentModificationException thường xảy ra khi bạn đang cố sửa đổi danh sách trong khi lặp lại danh sách. Để khắc phục ngoại lệ, bạn có thể sử dụng loại danh sách đặc biệt có tên là CopyOnWriteArrayList. Nó an toàn cho phép bạn thêm và xóa các mục khỏi danh sách trong khi lặp lại. Hi vọng điêu nay co ich.

+0

Tôi xin lỗi nhưng tôi vẫn thua lỗ ở đây. Tôi vẫn không hiểu làm thế nào tôi có thể thực hiện tải các chân trong nền. Điều này rất ngẫu nhiên khi nó FC trên tôi. Tôi gặp lỗi tương tự trong LogCat. Tôi đã thu hẹp nó xuống chức năng thêm gây ra vấn đề. Tôi đã nhận xét cuộc gọi thêm vào chức năng và lỗi dừng lại. Vì vậy, có một cái gì đó trong chức năng này gây ra cho tôi vấn đề này. –

+0

@BrandonWilson, ý tôi là, bạn đang gọi hàm add() bên trong một vòng lặp lặp qua danh sách và điều này khiến bạn gặp lỗi. Bạn không thể sửa đổi danh sách trong khi lặp lại nó, cố gắng tìm một giải pháp khác cho vấn đề của bạn. – Egor

+0

Tôi cũng bị mắc kẹt với những gì tôi đang cố gắng. Vì vậy, về cơ bản tôi đang cố gắng sửa đổi một cái gì đó tôi đã sửa đổi? Tôi nghĩ rằng chỉ có một AsyncTask có thể được excuted cùng một lúc. Tôi có thể giúp tôi ở đây không. Tôi hiểu bạn đã cho tôi một đầu mối nhưng điều này đã không giúp đỡ, tôi xin lỗi. –

1

Ứng dụng của bạn đang di chuyển chậm vì chức năng onPostExecute được thực hiện trên chuỗi giao diện người dùng. Việc giải mã bitmap mà bạn đang làm ở đây làm cho giao diện người dùng bị chậm vì đây là mạng chuyên sâu và bạn đang thực hiện nó trên luồng giao diện người dùng. Tôi sẽ đề nghị nhận được tất cả các bitmap trên thread doInBackground và sau đó thực sự thêm chúng vào bản đồ trên phương thức onPostExecute. Điều duy nhất bạn nên thực sự làm trên chuỗi giao diện người dùng là phương thức thêm.

+0

Vấn đề khác là tôi nhận được 'ConcurrentModificationException' khi người dùng chạm vào bản đồ trong khi đang cập nhật danh sách. Cách duy nhất để giải quyết vấn đề này là sử dụng hộp thoại để ngăn người dùng chạm vào màn hình. –

Các vấn đề liên quan