android - 在 AsyncTask 的帮助下从 List 数组向 Google Maps API v2 添加多个标记

标签 android google-maps android-asynctask google-maps-markers google-maps-android-api-2

我的应用程序需要添加数百个标记(在某些情况下)。为此,我使用“for 循环”,如果我使用默认标记,这似乎是一个不错的解决方案。我需要为每个标记使用自定义图像,这是我在 AsynkTask 的帮助下从互联网上下载的。类 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;

    }
}

我假设我需要用 AsynkTask 替换“for 循环”每个用户来自 List<User>将被异步下载。

  1. 请帮我创建AsynkTask对于 List<User>数组。
  2. 我应该结合AsynkTask吗?对于 List<User>AsynkTask用于图像下载还是使用 AsynkTask 是否正确?里面AsynkTask

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

最佳答案

首先:

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

这是您需要做的:

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

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

关于android - 在 AsyncTask 的帮助下从 List 数组向 Google Maps API v2 添加多个标记,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17535148/

相关文章:

java - 需要帮助弄清楚为什么我无法使用自定义 ArrayAdapter 更改 TextView 文本

android - 如何在 Android/AndEngine 中变形两个图像

Android NDK Native LIB,如何处理现有的 stdio?

javascript - 谷歌地图js API : map is not centered in bootstrap

java - 如何实现单个函数以在 AsyncTask 之后返回数据,或者如果之前已缓存则同步返回数据?

java - 如何将数据从单独的线程类传递到 Android 中的 Activity

android - 没有足够的空间显示广告需求 480 75

python - 将来自 Python 的 Google map 地理编码器与 urllib2 结合使用

android - 在不使用 map android的情况下从邮政编码获取纬度和经度

java - 如何从 AsyncTask 返回 boolean 值?