Android 在AsyncTask的帮助下,从列表数组向Google Maps API v2添加多个标记

Android 在AsyncTask的帮助下,从列表数组向Google Maps API v2添加多个标记,android,google-maps,android-asynctask,google-maps-markers,google-maps-android-api-2,Android,Google Maps,Android Asynctask,Google Maps Markers,Google Maps Android Api 2,我的应用程序需要添加数百个标记(在某些情况下)。为此,我使用“For循环”,如果我使用默认标记,这似乎是一个不错的解决方案。在AsynkTaskclassLoader()的帮助下,我需要为从internet下载的每个标记使用自定义图像。但当我使用自定义标记时,UI会冻结,直到“for循环”完成 添加标记: private List<User> mUsers = new ArrayList<User>(); private GoogleMap mMap; Bitmap bA

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

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

    }
}
private List mUsers=new ArrayList();
私有谷歌地图;
巴瓦塔位图;
.............
私有空标记(){
mMap.clear();
用于(用户:缪斯){
if(user.getGeohash()!=null){
LatLng pos=gh.decode(user.getGeohash());
if(user.getAvatar()!=null){
试一试{
bAvatar=new Loader().execute(user.getAvatar()).get();
}捕捉(中断异常e1){
//TODO自动生成的捕捉块
e1.printStackTrace();
}捕获(执行异常e1){
//TODO自动生成的捕捉块
e1.printStackTrace();
}
mMap.addMarker(新标记选项()
.职位(pos)
.title(user.getStatus())
.icon(BitmapDescriptorFactory.fromBitmap(bAvatar));
}否则{
mMap.addMarker(新标记选项()
.职位(pos)
.title(user.getStatus())
.图标(位图描述符工厂)
.defaultMarker(BitmapDescriptorFactory.HUE_RED));
}
}
}
}
用于图像下载的异步任务:

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

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

    }
}
公共类加载器扩展异步任务{
位图;
@凌驾
受保护的void onPreExecute(){
//TODO自动生成的方法存根
super.onPreExecute();
}
受保护位图doInBackground(字符串…URL){
字符串urldisplay=url[0];
位图mIcon11=null;
试一试{
InputStream in=newjava.net.URL(urldisplay.openStream();
BitmapFactory.Options=new-BitmapFactory.Options();
options.inpurgable=true;
options.inInputShareable=true;
mIcon11=BitmapFactory.decodeStream(in,null,options);
}捕获(例外e){
字符串错误=(e.getMessage()==null)?“doInBackground-Loader”
:e.getMessage();
Log.e(“错误”,Error);
e、 printStackTrace();
}
返回mIcon11;
}
受保护的void onPostExecute(位图结果){
位图=结果;
}
}
我假设我需要将“for循环”替换为
AsynkTask
,其中
列表中的每个用户都将异步下载

  • 请帮助我为
    列表创建
    AsynkTask
  • 我是否应该将
    AsynkTask
    用于
    List
    AsynkTask
    用于图像下载,或者在
    AsynkTask
    中使用
    AsynkTask
    是否正确
  • 任何帮助都将不胜感激。提前感谢。

    首先:

    • 您不应该使用嵌套的异步任务。这是不受支持的
    • 但是,您应该尝试为您的用户合并图像下载
    以下是您需要做的:

    • doInBackground
      方法中创建一个在用户中循环的asyntask
    • doInBackground
      中,为每个用户下载位图
    • 检索位图时,请使用
      publishProgress
      方法
    • 调用
      publishProgress
      将触发UI线程上的
      onProgressUpdate
      方法,您可以在其中将标记添加到地图
    请参见Android开发者网站上的示例