3

我的應用需要添加數百個標記(在某些情況下)。爲此,我正在使用「for循環」,如果我使用默認標記,這似乎不是一個壞的解決方案。我需要使用自定義圖像爲每個標記,我從互聯網下載AsynkTaskLoader()幫助下載。但是當我使用自定義標記時,UI會凍結,直到「for循環」結束。使用AsyncTask的幫助在列表數組中添加多個標記到Google Maps API v2

添加標記:

private List<User> mUsers = new ArrayList<User>(); 
private GoogleMap mMap; 
Bitmap bAvatar; 

............. 

private void drawMarkers() { 
     mMap.clear(); 
     for (User user : mUsers) { 
      if (user.getGeohash() != null) { 
       LatLng pos = gh.decode(user.getGeohash()); 
       if (user.getAvatar() != null) { 
        try { 
         bAvatar = new Loader().execute(user.getAvatar()).get();      
        } catch (InterruptedException e1) { 
         // TODO Auto-generated catch block 
         e1.printStackTrace(); 
        } catch (ExecutionException e1) { 
         // TODO Auto-generated catch block 
         e1.printStackTrace(); 
        } 
        mMap.addMarker(new MarkerOptions() 
          .position(pos) 
          .title(user.getStatus()) 
          .icon(BitmapDescriptorFactory.fromBitmap(bAvatar))); 
       } else { 
        mMap.addMarker(new MarkerOptions() 
          .position(pos) 
          .title(user.getStatus()) 
          .icon(BitmapDescriptorFactory 
            .defaultMarker(BitmapDescriptorFactory.HUE_RED))); 
       } 

      } 
     } 
    } 

的AsyncTask圖像下載:

public class Loader extends AsyncTask<String, Void, Bitmap> { 
    Bitmap bitmap; 

    @Override 
    protected void onPreExecute() { 
     // TODO Auto-generated method stub 
     super.onPreExecute(); 
    } 

    protected Bitmap doInBackground(String... urls) { 
     String urldisplay = urls[0]; 
     Bitmap mIcon11 = null; 
     try { 
      InputStream in = new java.net.URL(urldisplay).openStream(); 
      BitmapFactory.Options options = new BitmapFactory.Options(); 
      options.inPurgeable = true; 
      options.inInputShareable = true; 
      mIcon11 = BitmapFactory.decodeStream(in, null, options); 
     } catch (Exception e) { 
      String error = (e.getMessage() == null) ? "doInBackground - Loader" 
        : e.getMessage(); 
      Log.e("Error", error); 
      e.printStackTrace(); 
     } 
     return mIcon11; 
    } 

    protected void onPostExecute(Bitmap result) { 

     bitmap = result; 

    } 
} 

我認爲我需要與AsynkTask取代 「for循環」,其中從List<User>每個用戶異步下載。

  1. 請幫我創建AsynkTaskList<User>陣列。
  2. 我是否應該將AsynkTask用於List<User>AsynkTask用於圖像下載,還是在AsynkTask內部使用AsynkTask是否正確?

任何幫助將不勝感激。提前致謝。

回答

0

第一:

  • 你不應該使用嵌套AsyncTasks。這不被支持。
  • 但是,您應該嘗試爲用戶合併圖像下載。

這裏就是你需要做的:

  • 創建穿過doInBackground方法用戶環路的asyntask。
  • 對於每個用戶,在doInBackground下載位圖
  • 當您檢索位圖時使用publishProgress方法。
  • 調用publishProgress將在UI線程上觸發onProgressUpdate方法,您可以在其中將標記添加到地圖。

查看Android開發人員網站上的DownloadFilesTask示例。

相關問題