一进入页面就网络获取弹幕数据,然后加入到控件中,报数组越界
lfh1991 opened this issue · 3 comments
lfh1991 commented
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()方法,循环加入。直接就崩溃了
hust201010701 commented
覆盖XAdapter的getSingleLineHeight方法了么?需要指定行高。
另外,如果想快速定位问题的话,最后把代码贴一下。
lfh1991 commented
我只是在你的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布局完成时调用,调用后记得移除