尝试通过背景操作设置ImageView



我正在与googlemap合作。我已经实现了自定义标记窗口,此窗口包含标记的照片。我将照片的URL视为字符串,然后将其设置为带有线程的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);
}

您是在主UI线程的ImageView上设置图像。如果此代码在Activity中运行,则可以使用imageview.setImageBitmap(bitmap);呼叫上的runOnUiThread(Runnable runnable);迫使其在UI线程上发生。如果您不在活动中,则可以使用使用主循环器或异步框架创建的处理程序。

这是在UI线程上下载图像的一个很好的教程。管理多个线程,它正在使用TreadPoolExecutor来解决多个线程的管理,但包括使用处理程序将位图获取UI线程的良好描述。

最新更新