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)
抛出一个nindexOutofBoundsException
,我必须找出原因,但这一切都非常有用。非常感谢。