Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/228.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 迭代不同步_Java_Android_Parse Platform - Fatal编程技术网

Java 迭代不同步

Java 迭代不同步,java,android,parse-platform,Java,Android,Parse Platform,我正在使用Parse.com作为我的后端。我试图在背景中加载一个效果很好的对象,但是这些对象有一个指向图像的指针。问题是,为了查询image类中的图像,我传递了一个ParseObject,以便获得图像指向的对象,如下所示: ParseObject advertToGetImageFrom = ParseObject.createWithoutData("Advert", advertList.get(j).getObjectId()); 然而,我的日志显示了这个结果 D/a

我正在使用Parse.com作为我的后端。我试图在背景中加载一个效果很好的对象,但是这些对象有一个指向图像的指针。问题是,为了查询image类中的图像,我传递了一个ParseObject,以便获得图像指向的对象,如下所示:

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方法得到的字节数组,但这似乎不可能,因为它变化太快了?