我的应用程序需要添加数百个标记(在某些情况下)。为此,我使用“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>
将被异步下载。
- 请帮我创建
AsynkTask
对于List<User>
数组。 - 我应该结合
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/