private void prepare(final Runnable runnable) { if (drawTask == null) { drawTask = createTask( mDanmakuView.isDanmakuDrawingCacheEnabled(), timer, mDanmakuView.getContext(), mDanmakuView.getWidth(), mDanmakuView.getHeight(), new IDrawTask.TaskListener() { @Override public void ready() { runnable.run(); } }); } else { runnable.run(); } }
@Override public void handleMessage(Message msg) { int what = msg.what; switch (what) { case PREPARE: if (mParser == null || !mDanmakuView.isViewReady()) { sendEmptyMessageDelayed(PREPARE, 100); } else { prepare( new Runnable() { @Override public void run() { mReady = true; if (mCallback != null) { mCallback.prepared(); } } }); } break; case START: Long startTime = (Long) msg.obj; if (startTime != null) { pausedPostion = startTime.longValue(); } else { pausedPostion = 0; } case RESUME: quitFlag = false; if (mReady) { mTimeBase = System.currentTimeMillis() - pausedPostion; timer.update(pausedPostion); removeMessages(RESUME); sendEmptyMessage(UPDATE); drawTask.start(); } else { sendEmptyMessageDelayed(RESUME, 100); } break; case SEEK_POS: Long deltaMs = (Long) msg.obj; mTimeBase -= deltaMs; timer.update(System.currentTimeMillis() - mTimeBase); if (drawTask != null) drawTask.seek(timer.currMillisecond); pausedPostion = timer.currMillisecond; removeMessages(RESUME); sendEmptyMessage(RESUME); break; case UPDATE: if (quitFlag) { break; } long startMS = System.currentTimeMillis(); long d = timer.update(startMS - mTimeBase); if (mCallback != null) { mCallback.updateTimer(timer); } if (d < 0) { removeMessages(UPDATE); sendEmptyMessageDelayed(UPDATE, 60 - d); break; } d = mDanmakuView.drawDanmakus(); removeMessages(UPDATE); if (d == -1) { // reduce refresh rate sendEmptyMessageDelayed(UPDATE, 100); break; } if (d <= 16) { sendEmptyMessage(UPDATE); SystemClock.sleep(16 - d); break; } sendEmptyMessage(UPDATE); break; case SHOW_DANMAKUS: Long start = (Long) msg.obj; if (start == null && drawTask != null) { drawTask.requestClear(); } else if (start != null && drawTask != null) { drawTask.start(); drawTask.seek(start); drawTask.requestClear(); obtainMessage(START, start).sendToTarget(); } mDanmakusVisible = true; break; case HIDE_DANMAKUS: if (mDanmakuView != null) { mDanmakuView.clear(); } Boolean quitDrawTask = (Boolean) msg.obj; if (quitDrawTask.booleanValue() && this.drawTask != null) { this.drawTask.quit(); } mDanmakusVisible = false; if (!quitDrawTask) { break; } case PAUSE: case QUIT: removeCallbacksAndMessages(null); quitFlag = true; mDrawTimes.clear(); pausedPostion = timer.currMillisecond; if (what == QUIT) { if (this.drawTask != null) { this.drawTask.quit(); } if (this.getLooper() != Looper.getMainLooper()) this.getLooper().quit(); if (mParser != null) { mParser.release(); } } break; } }