Java 迭代不同步
我正在使用Parse.com作为我的后端。我试图在背景中加载一个效果很好的对象,但是这些对象有一个指向图像的指针。问题是,为了查询image类中的图像,我传递了一个ParseObject,以便获得图像指向的对象,如下所示:Java 迭代不同步,java,android,parse-platform,Java,Android,Parse Platform,我正在使用Parse.com作为我的后端。我试图在背景中加载一个效果很好的对象,但是这些对象有一个指向图像的指针。问题是,为了查询image类中的图像,我传递了一个ParseObject,以便获得图像指向的对象,如下所示: ParseObject advertToGetImageFrom = ParseObject.createWithoutData("Advert", advertList.get(j).getObjectId()); 然而,我的日志显示了这个结果 D/a
ParseObject advertToGetImageFrom = ParseObject.createWithoutData("Advert", advertList.get(j).getObjectId());
然而,我的日志显示了这个结果
D/app:DT34J9zFKI
D/应用程序:dAqVrnZ1rf
D/应用程序:bNtIfOCqeE
D/应用程序:加载的图像:1
D/应用程序:加载的图像:1
D/应用程序:加载的图像:1
这是合理的,因为加载是异步的。但是,所有返回的图像都是相同的吗?为什么会这样?以下是整个通话:
for (int j = 0; j < titleMap.size(); j++){
ParseQuery<ParseObject> query2 = ParseQuery.getQuery("Image");
ParseObject advertToGetImageFrom = ParseObject.createWithoutData("Advert", objectList.get(j).getObjectId());
Log.d("app", advertToGetImageFrom.getObjectId());
query2.whereEqualTo("advertId", advertToGetImageFrom);
query2.findInBackground(new FindCallback<ParseObject>() {
public void done(final List<ParseObject> imageList, ParseException e) {
// commentList now has the comments for myPost
Log.d("app", "Images loaded: " + imageList.size());
if (imageList != null) {
ParseFile pFile = (ParseFile) imageList.get(0).get("image");
pFile.getDataInBackground(new GetDataCallback() {
public void done(byte[] data, ParseException e) {
if (e == null) {
Bitmap bmp = decodeFile(data);
ParseObject advertID = imageList.get(0).getParseObject("advertId");
imageMap.put(advertID.getObjectId(), bmp);
if (imageMap.size() == titleMap.size())
updateCardView();
} else {
Log.d("test", "There was a problem downloading the data.");
}
}
});
}
}
});
}
for(int j=0;j
不熟悉parse.com,但我可以大胆猜测一下
我怀疑您的问题在于线路:
ParseObject advertID = imageList.get(0).getParseObject("advertId");
在这里,您正在访问imageList
,该列表提供给findInBackground
调用的done
回调。问题是,您现在处于getDataInBackground
调用的done
回调中,尽管imageList
是final
,但这并不会使其不可变,并且可能自原始调用以来已发生更改
乍一看,这似乎不是一件可怕的事情,因为这只会影响广告ID
,但进一步思考,您可能会发现问题所在
我认为解决方案可能是获取可能更改的数据的本地副本。比如:
pFile.getDataInBackground(new GetDataCallback() {
// **** Grab the ParseObject befor it gets changed.
ParseObject theParseObject = imageList.get(0);
public void done(byte[] data, ParseException e) {
if (e == null) {
Bitmap bmp = decodeFile(data);
// **** Refer to the grabbed ParseObject not the changing outer one.
ParseObject advertID = theParseObject.getParseObject("advertId");
如果这不能解决您的问题,那么我确信会是这样。您完全正确。当我记录pFile时,它是不同的,但是来自done方法的数据返回相同的字节数组。但是,我不知道如何在getDataInBackground和done方法之间捕获文件。好像没有要抓到的文件?我必须解码从done方法得到的字节数组,但这似乎不可能,因为它变化太快了?