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

Java 在AsyncTask中设置循环以检索序列的下一次迭代,java,android,iterator,android-asynctask,android-gridview,Java,Android,Iterator,Android Asynctask,Android Gridview,我正在从一个集合下载几个图像和名称,并将它们应用于网格视图。我在使我的AsyncTask正常工作时遇到了一些问题。我需要从一个url返回两个不同的值,一个图像和名称。目前,我可以正确下载所有内容并将信息应用到我的ImageView和TextView,但我的方法只有在我的适配器中调用它时才有效 问题: 当我将AsyncTask设置为下载所有内容时,它仅将序列的第一个值应用于网格中的视图。当我记录“artistImages”时,它会大量打印出序列中的其他URL,我不知道为什么会发生这种情况,但URL

我正在从一个
集合
下载几个图像和名称,并将它们应用于
网格视图
。我在使我的
AsyncTask
正常工作时遇到了一些问题。我需要从一个url返回两个不同的值,一个图像和名称。目前,我可以正确下载所有内容并将信息应用到我的
ImageView
TextView
,但我的方法只有在我的
适配器中调用它时才有效

问题:

当我将
AsyncTask
设置为下载所有内容时,它仅将序列的第一个值应用于网格中的
视图。当我记录“artistImages”时,它会大量打印出序列中的其他URL,我不知道为什么会发生这种情况,但URL中的任何数据实际上都没有应用到我的
适配器中

我所尝试的:

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;
我已经尝试在
doInBackground()
中设置一个循环来运行我的
迭代器
n次

在迭代器将序列中第一个集合的数据应用于所有
视图之前,我尝试使用
布尔值来停止迭代器

我已尝试在我的
异步任务中设置
适配器

我尝试在我的
适配器
中设置一个新的
异步任务
,而不是创建一个新类

我已尝试在
onPostExecute()
适配器中设置我的
ImageView

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

我已经尝试为我的
视图设置
异步任务
,这样我的
迭代器
就可以在功能上运行,图像和名称也可以异步应用

我已经做了很多研究,在某一点上停止循环或
AsyncTask
,在
GridView
中或使用
适配器设置
AsyncTaks
,并且更多地阅读了
线程
处理程序
,以及
AsyncTask

所有这些尝试要么导致仅使用序列的第一组,要么根本不下载和应用任何内容。因此,在我的
AsyncTask
中使用我的
迭代器
非常困难

这是我用来下载图片和名字的代码。只要我在
getView
方法我的
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;

所以,我不确定如何正确设置,是时候寻求帮助了。在经历了相当多的失败尝试后,从积极的方面来说,我学到了很多让我的应用程序更高效的方法。我非常感谢您的建议。

下面的代码应该让您对如何处理适配器和异步任务有一个合理的认识。像@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
    }
}

您没有对正在迭代的值执行任何操作。它应该如何工作?您分配
artistImages
很多次,但只返回最后一个值。因此我的问题是。我不知道为什么使用该方法下载图像和名称在我的
AsyncTask
中不起作用,但如果我在
适配器中直接使用它,它会起作用。在这种情况下,我不知道如何正确使用
AsyncTask
。您使用
artistImages
artistName
做什么?是否应该将它们添加到栅格视图中?如果是这样的话,那就是你没有这么做。代码不在那里。你只是一遍又一遍地分配它们。它也不应该在适配器内部工作。我正在使用
artistName
调用
setText()
,并使用一个库,基本上可以帮助我解码
artistImage
InputStream
。我不知道还能说什么。只要我调用
适配器中的所有内容
@aneal,@ABentSpoon是正确的,它就可以100%正常工作。此代码:
artistImages=((ImageHolder)temp).getImageURL(ImageSize.MEGA);artistName=((音乐中心)temp.getName()什么都不做。你写这三个留置权是为了什么?这实际上非常有用。我对每件事都更加了解
ArtistImage image=artistImages.get(position)
抛出一个n
indexOutofBoundsException
,我必须找出原因,但这一切都非常有用。非常感谢。