将parsefile数组转换为Byte数组时如何解决越界错误?

时间:2015-12-08 21:48:15

标签: android parse-platform indexoutofboundsexception

所以我要尽可能清楚地解决这个问题。

1)所以我从Parse查询了一个ParseFile图像数组,我想将它们转换成Bitmap数组。所以这是代码。

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();
    }
}

2)现在在该方法中我调用了convertFileArray()方法,该方法接受parsefile数组并将其转换为位图。这是代码。

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)好的,现在我想循环遍历一串Names,&#34; John,Mary,Adam,Susan等等。)对于那个位置的每个名字,我想从Bitmap添加相应的Image阵列。因此,如果John位于名称Array中的位置0,我应该将John的位置0处的图像从我的Byte数组添加到我调用的类中#Card; CardModel&#34;这是代码。请注意,这三种方法都属于一类。

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);
        }
}

4)最后,当我进入另一个活动时,用户点击了#34;完成&#34; (首先调用queryImage方法,其中调用了convertFileArray()方法)然后调用queryDoneSetCards()方法。我得到一个超出界限的索引例外我无法弄清楚它为什么不起作用。

Process: com.lorentzos.swipecards.example, PID: 23182
java.lang.IndexOutOfBoundsException: Invalid index 0, size is 0


12-08 13:26:47.218 23182-23182/com.lorentzos.swipecards.example E/AndroidRuntime: FATAL EXCEPTION: main
             Process: com.lorentzos.swipecards.example, PID: 23182
             java.lang.IndexOutOfBoundsException: Invalid index 0, size is 0
             at java.util.ArrayList.throwIndexOutOfBoundsException(ArrayList.java:255)
             at java.util.ArrayList.get(ArrayList.java:308)
             at com.lorentzos.swipecards.MyParse.MyParse.queryDoneSetCards(MyParse.java:285)
             at com.lorentzos.swipecards.MyParse.MyParse.convertFileArray(MyParse.java:267)
             at com.lorentzos.swipecards.MyParse.MyParse.queryImage(MyParse.java:143)
             at com.lorentzos.swipecards.CardFinal.Card_FINALE.onClick(Card_FINALE.java:258)
             at android.view.View.performClick(View.java:4803)
             at android.view.View$PerformClick.run(View.java:19981)
             at android.os.Handler.handleCallback(Handler.java:739)
             at android.os.Handler.dispatchMessage(Handler.java:95)
             at android.os.Looper.loop(Looper.java:135)
             at android.app.ActivityThread.main(ActivityThread.java:5430)
             at java.lang.reflect.Method.invoke(Native Method)
             at java.lang.reflect.Method.invoke(Method.java:372)
             at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:913)
             at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:706)

2 个答案:

答案 0 :(得分:1)

queryCardNames的大小与BitmapArray不同,这就是您获得 IndexOutOfBoundsException 的原因。

queryDoneSetCards()方法中,更改

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

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

答案 1 :(得分:1)

在使用解析时,我发现将一些调用放入异步任务是很有用的。特别是某些数据依赖于其他数据的部分。在异步任务中获取所有数据然后使用它而不是尝试链接异步解析调用是很有用的。

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);
        }
    }
}

然后在异步任务的queryDoneSetCards中调用onPostExecute()。在执行queryDoneSetCards()循环之前,您还应该检查以确保BitmapArray和name Array具有相同的大小