问题描述:
我现在的弹幕文件每五分钟一个xml文件,当播放完当前的弹幕时,播放下一个需要重新加载数据并且解析,然后呈现。这个过程大概需要5-7秒,这样给用户的感觉是弹幕断了。
现在的需求是弹幕切换的时候,无缝续播,让用户感觉不到我再切换弹幕文件,这样该如何做呢,目前毫无头绪。
解决方法:
首先,mDanmakuView是个单例的模式,如果弹幕正在播放的时候,我调用prepare()去加载新的弹幕内容时,会造成当前播放弹幕的暂停和卡顿,这个和需求是不一致的。
所以需要再工作线程开启数据的解析和配置,具体代码如下:
mDanmakuView.setCallback(new DrawHandler.Callback() { @Override public void updateTimer(DanmakuTimer timer) {
//在mDanmakuView的回调方法处,调用异步任务的解析任务,这样不会阻塞主线程。 if (timer.currMillisecond >= 290000 && timer.currMillisecond <= 291000 && flag == 0) { createParser(); flag = 1; thread.start(); } } @Override public void drawingFinished() { Log.e("DFM", "drawingFinished 第一个CallBack"); } @Override public void danmakuShown(BaseDanmaku danmaku) { } @Override public void prepared() { Toast.makeText(MainActivity.this, "弹幕准备完成", Toast.LENGTH_SHORT).show(); // mDanmakuView.start(); } });
//这个是为了将parser的数据指定为新的弹幕数据源。
public void createParser() { parserParam = createParser(this.getResources().openRawResource(R.raw.danmu5_10)); }//这个是为了在工作线程中配置弹幕数据,首先构建一个加载了新的弹幕内容的Danmakus实例,然后遍历该实体并且依次取出其中的弹幕数据,通过addDanmaku()方法依次添加弹幕到mDanmakuView里面,注意,这里会在某个瞬间执行遍历方法,所以放到工作线程比较合适,不然会阻塞主线程。Thread thread = new Thread(new Runnable() { @Override public void run() { Danmakus danmakus = (Danmakus) parserParam. setConfig(mContext). setDisplayer(((DrawTask) ((DanmakuSurfaceView) mDanmakuView).getHandler().getDrawTask()).getmDisp()). setTimer(((DrawTask) ((DanmakuSurfaceView) mDanmakuView).getHandler().getDrawTask()).getmTimer()).getDanmakus(); if (danmakus != null && danmakus.items != null) { Iterator<BaseDanmaku> iterator = danmakus.items.iterator(); while (iterator.hasNext()) { mDanmakuView.addDanmaku(iterator.next()); } } } });这样就可以实现弹幕的无缝续播。