在AsyncTask中设置循环以检索序列的下一次迭代

时间:2012-02-22 10:08:22

标签: java android iterator android-asynctask android-gridview

我正在从Collection下载多个图片和名称,并将其应用于GridView。我遇到了一些让AsyncTask正常工作的问题。我需要从一个url返回两个不同的值,一个图像和名称。目前,我可以正确下载所有内容并将信息应用到我的ImageViewTextView,但我执行此操作的方法只有在我Adapter中调用时才有效。

问题:

当我设置AsyncTask以下载所有内容时,它只会将序列的第一个值应用于网格中的Views。当我记录“artistImages”时,它会打印出序列的其他网址很多次,我不知道为什么会发生这种情况,但网址中的数据实际上都没有应用到我的Adapter中。

我尝试了什么:

我已尝试在doInBackground()设置循环以运行Iterator n 次。

我尝试使用Boolean停止我的迭代器,然后才将序列中第一个数据集的数据应用到我的Views

我已尝试在我的Adapter中设置AsyncTask

我尝试在我的AsyncTask中设置一个新Adapter,而不是创建一个新类。

我已尝试在ImageViewonPostExecute()中设置Adapter

我尝试在AsyncTask中使用不同的参数。

我已尝试为AsyncTask设置Views,以便我的Iterator可以在功能上运行,并且图像和名称会异步应用。

我已经做了很多关于在某个时刻停止循环或AsyncTask的研究,在AsyncTaksGridView中设置Adapter,以及通常会在ThreadsHandlersAsyncTask上阅读更多内容。

所有这些尝试或者导致仅使用第一组序列,或者根本没有下载和应用任何序列。所以,我很难在我的Iterator中使用AsyncTask

这是我用来下载图片和名称的代码。只要我在getView方法my Adapter

中使用它,我就可以使用它

用于下载图片和名称:

i++;
artistImage = Artist.getSimilar("Bon Iver", i, key);
new ArrayList<Artist>();
itr = artistImage.iterator();
while (itr.hasNext()) {
    Artist temp = itr.next();
    artistImages = ((ImageHolder) temp).getImageURL(ImageSize.MEGA);
    artistName = ((MusicEntry) temp).getName();
}

只是为了展示一切:

private Iterator<Artist> itr;
private Collection<Artist> artistImage;
private String artistImages = null;
private String artistName = null;
private int i = 0;

AsyncTask:我在我getView的{​​{1}}中调用此内容。 Adapter

new loadImages().execute()

所以,我不确定如何正确设置,现在是时候寻求帮助了。在我公平地分享失败的尝试之后,从好的方面来说,我已经学到了很多关于使我的应用程序更有效率的知识。我很欣赏一些建议。

1 个答案:

答案 0 :(得分:2)

下面的代码应该让您对如何处理适配器和异步任务有充分的了解。就像@ABentSpoon和@Fixpoint一样,我也很困惑你如何使用这些变量。但是我忽略了这些并且理想地关注代码结构应该如何适用于你的情况。

对网格中的每个单元格或项目调用一次Adapter.getView()方法。如果你要从getView()中运行异步任务,它将针对每个项目执行。我认为这就是为什么你会看到巨大的印刷品数量。

public class ArtistImage {
    public String image;
    public String name;
}

public class LoadImages extends AsyncTask<String, Integer, List<ArtistImage>> {
    private List<ArtistImage> artistImages = new ArrayList<ArtistImage>();
    private ArtistAdapter artistAdapter;

    public LoadImages(ArtistAdapter adapter) {
        artistAdapter = adapter;
    }

    @Override
    protected List<ArtistImage> doInBackground(String... params) {
        try {           
            for (int i = 0; i <= 10; i++) {
                Collection<Artist> artistImage = Artist.getSimilar("Bon Iver", i, key);
                Iterator<Artist> itr = artistImage.iterator();
                while (itr.hasNext()) {
                    Artist temp = itr.next();
                    ArtistImage ai = new ArtistImage();
                    ai.image = ((ImageHolder) temp).getImageURL(ImageSize.MEGA);
                    ai.name = ((MusicEntry) temp).getName();
                    artistImages.add(ai);
                }
            }
        } catch (Exception e) {
            Log.i("images", e.getMessage());
        }

        return artistImages;
    }

    @Override
    protected void onPostExecute(List<ArtistImage> result) {
        artistAdapter.setArtistImages(result);
    }
}


public class ArtistAdapter extends ... {
    private List<ArtistImage> artistImages = new ArrayList<ArtistImage>();

    public void setArtistImages(List<ArtistImage> images) {
        this.artistImages = images;
        super.notifyDataSetChanged();
    }

    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        ArtistImage image = artistImages.get(position);
        // render stuff here
    }
}

在您的活动中,无论是onCreate还是某些事件:

ArtistAdapter aa = new ArtistAdapter();
LoadImages loadImages = new LoadImages(aa);
loadImages.execute();