【问题标题】:How to solve out of bounds error when converting parsefile array to Byte array?将parsefile数组转换为Byte数组时如何解决越界错误?
【发布时间】:2015-12-08 21:48:15
【问题描述】:

所以我将尽可能清楚地分解它。

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

2) 现在在那个方法中,我调用了convertFileArray() 方法,该方法接收该解析文件数组并将其转换为位图。这是它的代码。

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 在名称 Array 中的位置 0,我应该将 John 的位置 0 处的图像从我的 Byte 数组添加到我称为“CardModel”的类中 这是代码。请注意,这 3 个方法都在 1 个类中.

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) 最后,当我进入另一个活动时,用户单击“完成”(首先调用 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)

【问题讨论】:

  • 请添加完整的堆栈跟踪,其中包含越界错误。
  • 您的错误出现在 queryDoneSetCards() 方法的 for 循环中。尝试设置一些断点或放置一些日志语句,以确保 queryCardNames 集合有数据并且存在
  • @doubleA querycardNames 很好。它给了我一个关于 cardModel.setImageAsBitmap(BitmapArray.get(i)); 的错误。显示我的 BitmapArray 是空的...也许是因为我在后台线程中执行此操作。 convertFileArray() 方法中是否有 file.getDataInBackground 的替代方法?

标签: android parse-platform indexoutofboundsexception


【解决方案1】:

queryCardNames 的大小与BitmapArray 不同,这就是为什么会出现 IndexOutOfBoundsException

queryDoneSetCards()方法中,改变

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

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

【讨论】:

  • 我试过了,BitmapArray 也给了我一个 indexOutOfBounds 异常。它说大小是0..
  • 如果BitmapArray size为0,则不进入循环,如何得到IndexOutOfBoundsException??
  • 好吧,当我使用 queryCardNames 数组进行 for 循环并使用 cardModel.setImageAsBitmap(BitmapArray.get(i));在 for 循环中,我得到了 indexoutofBounds 异常。但是,如果我按照您发布的操作进行操作,我仍然会得到索引超出范围的异常。原因:java.lang.IndexOutOfBoundsException: Invalid index 0, size is 0
  • 如果您在后台获取数据并在回调中将数据添加到数组中,那么根据您调用查询卡名称的位置,您将不会有任何数据。
【解决方案2】:

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

您的转换文件数组将是同步的。

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-10-01
    • 2017-01-23
    • 2013-04-02
    • 1970-01-01
    • 1970-01-01
    • 2010-12-02
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多