3

我的应用程序需要添加数百个标记(在某些情况下)。为此,我使用“for循环”,如果我使用默认标记,这似乎不是坏的解决方案。我需要为我在AsynkTaskclass的帮助下从 Internet 下载的每个标记使用自定义图像Loader()。但是当我使用自定义标记时,UI 会冻结,直到“for 循环”完成。

添加标记:

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;

    }
}

我假设我需要将“for loop”替换为AsynkTask每个用户List<User>将被异步下载的位置。

  1. 请帮我创建数组AsynkTaskList<User>
  2. 我应该结合AsynkTaskfor List<User>withAsynkTask来下载图片还是在AsynkTask里面使用是否正确AsynkTask

任何帮助将不胜感激。提前致谢。

4

1 回答 1

0

第一的:

  • 你不应该使用嵌套的 AsyncTasks。这是不支持的。
  • 但是,您应该尝试为您的用户组合您的图像下载。

这是您需要做的:

  • 在方法中创建一个循环遍历您的用户的异步任务doInBackground
  • doInBackground为每个用户下载位图,
  • publishProgress检索位图后使用该方法。
  • 调用publishProgress 将触发onProgressUpdateUI 线程上的方法,您可以在其中将标记添加到地图。

请参阅Android 开发者网站上的DownloadFilesTask示例。

于 2013-07-08T22:35:02.803 回答