Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/219.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
Android 如何解决将parsefile数组转换为字节数组时的越界错误?_Android_Parse Platform_Indexoutofboundsexception - Fatal编程技术网

Android 如何解决将parsefile数组转换为字节数组时的越界错误?

Android 如何解决将parsefile数组转换为字节数组时的越界错误?,android,parse-platform,indexoutofboundsexception,Android,Parse Platform,Indexoutofboundsexception,所以我要尽可能清楚地把它分解 1) 因此,我从Parse查询了ParseFile图像数组,并希望将它们转换为位图数组。下面是代码 public void queryImage() { ParseQuery<ParseObject> query = ParseQuery.getQuery("TestObject"); //So lets queryImage all the images that belong to the user. query.setLi

所以我要尽可能清楚地把它分解

1) 因此,我从Parse查询了ParseFile图像数组,并希望将它们转换为位图数组。下面是代码

public void queryImage() {
    ParseQuery<ParseObject> query = ParseQuery.getQuery("TestObject");

    //So lets queryImage all the images that belong to the user.
    query.setLimit(2);
    query.whereExists("ImageFile");
    query.orderByDescending("createdAt");
    try {
        List<ParseObject> lists2 = query.find();
        for(ParseObject cardImage : lists2) {
            ParseImageFileArrayList.add((ParseFile) cardImage.get("ImageFile"));
        }
        convertFileArray(ParseImageFileArrayList);//Here is another I created
    } catch(ParseException e) {
        e.printStackTrace();
    }
}
private void convertFileArray(ArrayList<ParseFile> arrayList) {
    for(ParseFile file: arrayList) {
        if(file != null) {
            file.getDataInBackground(new GetDataCallback() {
                @Override
                public void done(byte[] bytes, ParseException e) {
                    if(e == null) {
                        bmp1 = BitmapFactory.decodeByteArray(bytes,0,bytes.length);
                        BitmapArray.add(bmp1);
                    } else {

                    }
                }
            });
        }
    }
}
3) 好的,现在我想循环一个名称字符串,“John,Mary,Adam,Susan,等等),对于该位置的每个名称,我想从位图数组中添加相应的图像。因此,如果John位于名称数组中的位置0,我应该将字节数组中John的位置0处的图像添加到我称为“CardModel”的类中“这是密码。请注意,这三种方法都在一个类中

public void queryDoneSetCards() {//Here we need to make an Array of Cardmodels.
        for(int i = 0; i < queryCardNames.size(); i++) {
            CardModel cardModel = new CardModel();
            cardModel.setImageAsBitmap(BitmapArray.get(i));//HERE IS WHERE IM GETTING THE ERROR!
            CardModelArray.add(cardModel);
        }
}

queryCardNames
的大小与
BitmapArray
不同,这就是为什么会出现索引自动边界异常的原因

queryDoneSetCards()
方法中,更改

for(int i = 0; i < queryCardNames.size(); i++) 
for(int i=0;i

for(int i=0;i
在使用parse时,我发现将一些调用放入异步任务中非常有用。特别是某些数据依赖于正在获取的其他数据的部分。只获取异步任务中的所有数据,然后使用它,而不是尝试链接异步解析调用,这是非常有用的

private class MyAsync extends AsyncTask<> {

     protected void doInBackground() {
         queryImage()
     }

     protected void onPostExecute(Long result) {
         queryDoneSetCards();
     }
}

public void queryImage() {
    ParseQuery<ParseObject> query = ParseQuery.getQuery("TestObject");

    //So lets queryImage all the images that belong to the user.
    query.setLimit(2);
    query.whereExists("ImageFile");
    query.orderByDescending("createdAt");
    try {
        List<ParseObject> lists2 = query.find();
        for(ParseObject cardImage : lists2) {
            ParseImageFileArrayList.add((ParseFile) cardImage.get("ImageFile"));
        }
        convertFileArray(ParseImageFileArrayList);//Here is another I created
    } catch(ParseException e) {
        e.printStackTrace();
    }
}
私有类MyAsync扩展了AsyncTask{
受保护的void doInBackground(){
查询图像()
}
受保护的void onPostExecute(长结果){
queryDoneSetCards();
}
}
公共无效查询图像(){
ParseQuery=ParseQuery.getQuery(“TestObject”);
//因此,让我们查询属于用户的所有图像。
查询设置限制(2);
查询。何处存在(“图像文件”);
query.orderByDescending(“createdAt”);
试一试{
List lists2=query.find();
对于(ParseObject cardImage:lists2){
ParseImageFileArrayList.add((ParseFile)cardImage.get(“ImageFile”));
}
convertFileArray(ParseImageFileArrayList);//这是我创建的另一个
}捕获(解析异常){
e、 printStackTrace();
}
}
转换文件数组将是同步的

private void convertFileArray(ArrayList<ParseFile> arrayList) {
    for(ParseFile file: arrayList) {
        if(file != null) {
            byte[] bytes = file.getData();
            bmp1 = BitmapFactory.decodeByteArray(bytes,0,bytes.length);
            BitmapArray.add(bmp1);
        }
    }
}
private void convertFileArray(ArrayList ArrayList){
for(ParseFile文件:arrayList){
如果(文件!=null){
byte[]bytes=file.getData();
bmp1=BitmapFactory.decodeByteArray(字节,0,字节.长度);
添加(bmp1);
}
}
}

然后在异步任务的
onPostExecute()
中调用
queryDoneSetCards
。在执行
queryDoneSetCards()
loop

之前,您可能还应该进行检查,以确保位图数组和名称数组的大小相同。请添加包含越界错误的完整堆栈跟踪。您的错误在
queryDoneSetCards()
方法的for循环中。尝试设置一些断点或在那里放置一些日志语句,以确保queryCardNames集合包含数据和日志exists@doubleAquerycardNames很好。它在cardModel.setImageAsBitmap(BitmapArray.get(i))上给了我一个错误;显示我的位图数组为空…可能是因为我在后台线程中执行此操作。convertFileArray()方法中是否有file.getDataInBackground的替代方法?我试过了,BitmapArray也给了我一个indexOutOfBounds exeception。它是说大小为0..如果BitmapArray大小为0,它将不会进入循环,如何获取IndexOutOfBoundsException??当我为for循环使用queryCardNames数组并使用cardModel.setImageAsBitmap(BitmapArray.get(i));在for循环中,我得到了indexoutofBounds异常。但是如果我按照你发布的那样做,我仍然会得到索引越界异常。原因:java.lang.IndexOutOfBoundsException:索引0无效,大小为0如果您在后台获取数据并将数据添加到回调中的数组中,则根据您调用查询卡名称的位置,那里还没有任何数据。
private class MyAsync extends AsyncTask<> {

     protected void doInBackground() {
         queryImage()
     }

     protected void onPostExecute(Long result) {
         queryDoneSetCards();
     }
}

public void queryImage() {
    ParseQuery<ParseObject> query = ParseQuery.getQuery("TestObject");

    //So lets queryImage all the images that belong to the user.
    query.setLimit(2);
    query.whereExists("ImageFile");
    query.orderByDescending("createdAt");
    try {
        List<ParseObject> lists2 = query.find();
        for(ParseObject cardImage : lists2) {
            ParseImageFileArrayList.add((ParseFile) cardImage.get("ImageFile"));
        }
        convertFileArray(ParseImageFileArrayList);//Here is another I created
    } catch(ParseException e) {
        e.printStackTrace();
    }
}
private void convertFileArray(ArrayList<ParseFile> arrayList) {
    for(ParseFile file: arrayList) {
        if(file != null) {
            byte[] bytes = file.getData();
            bmp1 = BitmapFactory.decodeByteArray(bytes,0,bytes.length);
            BitmapArray.add(bmp1);
        }
    }
}