我正在使用googlemap。我已经实现了自定义标记窗口,此窗口包含标记的照片。我将照片的网址作为字符串并将其设置为带有线程的imageview。但是,代码不与用户同步。当我单击标记时,它会显示我单击的上一个标记的照片。当我进行调试时,我可以看到真正的url值来自背景但设置图像进入imageview操作变得迟到了。我怎么解决这个问题?我试过毕加索和滑翔,但仍然存在同样的问题。
@Override
public void onMapReady(GoogleMap map) {
this.Window = (ViewGroup) getLayoutInflater().inflate(R.layout.marker_window, null);
this.imageview = (ImageView) Window.findViewById(R.id.marker_photo);
googleMap = map;
googleMap.setInfoWindowAdapter(new GoogleMap.InfoWindowAdapter() {
@Override
public View getInfoWindow(Marker marker) {
return null;
}
@Override
public View getInfoContents(final Marker marker) {
createThread(imageview,URL).start();
mapWrapperLayout.setMarkerWithInfoWindow(marker, infoWindow);
return infoWindow;
}
return null;}
});
}
private synchronized Thread createThread(final ImageView imageView, final String URL)
{
Thread thread=new Thread(new Runnable() {
@Override
public void run() {
download_image(URL,imageView);
}
});
return thread;
}
public void download_image(String url,ImageView imageview) {
URL newurl = null;
try {
newurl = new URL(url);
} catch (MalformedURLException e) {
e.printStackTrace();
}
Bitmap bitmap = null;
try {
bitmap= BitmapFactory.decodeStream(newurl.openConnection().getInputStream());
} catch (Exception e) {
e.printStackTrace();
}
imageview.setImageBitmap(bitmap);
}
答案 0 :(得分:0)
您正在关闭主UI线程的ImageView上设置图像。如果此代码在Activity
内运行,则可以使用runOnUiThread(Runnable runnable);
调用上的imageview.setImageBitmap(bitmap);
强制它在UI线程上发生。如果您不在活动中,则可以使用使用主Looper或Handler框架创建的AsyncTask。
答案 1 :(得分:0)
这是一个很好的教程,可以将后台线程上下载的图像下载到UI线程。 Managing Multiple Threads它正在使用ThreadPoolExecutor来解决多个线程的管理问题,但是包含了使用Handler将位图添加到UI线程的良好描述。