1

我有一个问题,我有一个 GridView,我在其中使用 ImageView 加载图像,这些图像存储在 SD 中,为此我使用 Runnable 类进行加载。当它滚动 GridView 时,图像被加载到对应的框(ImageView)中,在其他表格中,我正在制作类似于音乐专辑列表的东西,图像被加载到专辑中,但也加载到另一个等等,你怎么能做同步?即如果一个充电,不被加载到另一个

我希望我明白

谢谢

PD:对不起我的英语

public View getView(int position, View convertView, ViewGroup parent) {
    View v = convertView;
    if (v == null) {
        LayoutInflater vi = (LayoutInflater) getContext().getSystemService("layout_inflater");
        v = vi.inflate(R.layout.listitemalbum, null);
    }

    bnSong = songs.get(position);
    if (bnSong != null) {
        coverAlbum = (ImageView) v.findViewById(R.id.imgCover);
        coverAlbum.setScaleType(ImageView.ScaleType.CENTER_CROP);

        if (bnSong.getAlbum() == null){
            coverAlbum.setBackgroundResource(R.drawable.mksong);
        }else{
            try {
                Runnable r = new Runnable() {
                    @Override
                    public void run() {
                        try{
                            Thread.sleep(1000);                                 
                            Storage storage = new Storage();                                
                            cover = storage.getOpenImagen(bnSong.getAlbum(), "ALBUM");
                        }catch (Exception e){
                            e.printStackTrace();
                        }
                        coverAlbum.post(new Runnable() {
                            @Override
                            public void run() {
                                coverAlbum.invalidate();
                                coverAlbum.setImageBitmap(null);
                                if (cover != null){
                                    coverAlbum.setImageBitmap(cover);
                                }else {
                                    coverAlbum.setBackgroundResource(R.drawable.mksong);
                                }
                            }
                        });
                    }
                };
                new Thread(r).start();
            } catch (Exception e) {
                coverAlbum.setBackgroundResource(R.drawable.mksong);
            }
        }
    }
    return v;
}
4

2 回答 2

1

我正在使用 Android Universal Loader,这是我制作这个的最佳库https://github.com/nostra13/Android-Universal-Image-Loader

于 2013-05-21T21:28:23.330 回答
1

谷歌团队发布了一个专门针对您的问题的库,名为“volley”。虽然它很新。这里的信息:https ://developers.google.com/live/shows/474338138/ 。

但是,为了在没有库的情况下解决您的问题:首先,您应该在可运行和线程上使用 android AsyncTask 和executeOnExecutor(THREAD_POOL_EXECUTOR)方法。您正在为屏幕上的每个视图以及每次滚动时创建一个新线程。如果你真的想用 runnables 做这个,使用 ExecutorService 创建一个线程池,然后将你的 runnables 发布到那里。

现在,您遇到的问题是在重用视图时图像被覆盖。您需要做的是在下载图像后检查查看位置的项目是否具有相同的相册。这通常最好使用视图上的标签来完成。

public View getView(int position, View convertView, ViewGroup parent) {
View v = convertView;
if (v == null) {
    LayoutInflater vi = (LayoutInflater) getContext().getSystemService("layout_inflater");
    v = vi.inflate(R.layout.listitemalbum, null);
}

final Song song = songs.get(position);
if (song != null) {
    final ImageView coverAlbum = (ImageView) v.findViewById(R.id.imgCover);
    coverAlbum.setScaleType(ImageView.ScaleType.CENTER_CROP); // Why not do this once, at inflation?

    final Album album = song.getAlbum();
    coverAlbum.setTag(album);        

    if (album == null){
        coverAlbum.setBackgroundResource(R.drawable.mksong);
    }else{
        // This should really be in a full class which extends AsyncTask
        AsyncTask<Album, Void, Bitmap> task = new AsyncTask<Album, Void, Bitmap>() {
            @Override
            public Bitmap doInBackground(Album... albums) {
                final Album album = albums[0];
                try{
                    Storage storage = new Storage();                                
                    return storage.getOpenImagen(album, "ALBUM");
                }catch (Exception e){
                    e.printStackTrace();
                    return null;
                }
            }

            @Override
            protected void onPostExecute(Bitmap cover) {
                final Album currentAlbum = (Album) coverAlbum.getTag();
                if(!album.equals(currentAlbum))
                    return;

                coverAlbum.invalidate();
                coverAlbum.setImageBitmap(null);
                if (cover != null){
                    coverAlbum.setImageBitmap(cover);
                }else {
                    coverAlbum.setBackgroundResource(R.drawable.mksong);
                }
            }
        }

        task.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR, album)
    }
}
return v;
于 2013-05-22T13:03:20.077 回答