hust201010701/XDanmuku

一进入页面就网络获取弹幕数据,然后加入到控件中,报数组越界

lfh1991 opened this issue · 3 comments

Process: com.orzangleli.recyclerviewdanmu, PID: 4134
                                                                            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.orzangleli.xdanmuku.DanmuContainerView.getBestLine(DanmuContainerView.java:228)
                                                                                at com.orzangleli.xdanmuku.DanmuContainerView.addTypeView(DanmuContainerView.java:180)
                                                                                at com.orzangleli.xdanmuku.DanmuContainerView.addDanmu(DanmuContainerView.java:158)

我在MainActivity的OnCreate里执行网络请求,获取到了20条弹幕数据。
然后直接调用addDanmu()方法,循环加入。直接就崩溃了

覆盖XAdapter的getSingleLineHeight方法了么?需要指定行高。
另外,如果想快速定位问题的话,最后把代码贴一下。

我只是在你的demo上小小的改动了一下,改动的地方只有MainActivity,其他都是你的原代码。

 protected void onCreate(Bundle savedInstanceState) {
  ....
 new Thread() {
            @Override
            public void run() {
                super.run();
                while (true) {
                    for (int i = 0; i < 20; i++) {
                        Message msg = new Message();
                        msg.what = 1;
                        msg.arg1 = i;
                        handler.sendMessage(msg);
                        try {
                            // 延时1秒
                            sleep(1000);
                        } catch (InterruptedException e) {
                            e.printStackTrace();
                        }
                    }
                }
            }
        }.start();
}

  Handler handler = new Handler(){
        @Override
        public void handleMessage(Message msg) {
            super.handleMessage(msg);
            if (msg.what == 1) {
                addDanmu(msg.arg1);
            }
        }
    };

    public void addDanmu(int i) {
        DanmuEntity danmuEntity = new DanmuEntity();
        danmuEntity.setContent("弹幕"+i);
        danmuEntity.setType(0);
        danmuEntity.setTime("23:20:11");
        danmuContainerView.addDanmu(danmuEntity);
    }

其实就是模拟一进入页面,就获取一些弹幕并显示的情景。结果就崩溃了。
从崩溃的地方看是getBestLine()这个方法中的spanList空指针了。
但是如果我把这段代码放到某个按钮的点击事件中,就能正常运行,不会出现这个异常了。
难道是还没初始化完毕的原因?
@hust201010701

xbyl commented

danmuContainerView.viewTreeObserver.addOnGlobalLayoutListener(this)
override fun onGlobalLayout() {
danmuContainerView.viewTreeObserver.removeOnGlobalLayoutListener(this)
}
在view布局完成时调用,调用后记得移除