Android 在AsyncTask的帮助下,从列表数组向Google Maps API v2添加多个标记
我的应用程序需要添加数百个标记(在某些情况下)。为此,我使用“For循环”,如果我使用默认标记,这似乎是一个不错的解决方案。在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
AsynkTask
classLoader()
的帮助下,我需要为从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开发者网站上的示例