Skip to content

Commit 4b5d728

Browse files
committed
优化某些可能闪退的代码
1 parent 99b0714 commit 4b5d728

3 files changed

Lines changed: 49 additions & 26 deletions

File tree

dkplayer-java/src/main/java/com/dueeeke/videoplayer/player/AndroidMediaPlayer.java

Lines changed: 15 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -149,12 +149,20 @@ public int getBufferedPercentage() {
149149

150150
@Override
151151
public void setSurface(Surface surface) {
152-
mMediaPlayer.setSurface(surface);
152+
try {
153+
mMediaPlayer.setSurface(surface);
154+
} catch (Exception e) {
155+
mPlayerEventListener.onError();
156+
}
153157
}
154158

155159
@Override
156160
public void setDisplay(SurfaceHolder holder) {
157-
mMediaPlayer.setDisplay(holder);
161+
try {
162+
mMediaPlayer.setDisplay(holder);
163+
} catch (Exception e) {
164+
mPlayerEventListener.onError();
165+
}
158166
}
159167

160168
@Override
@@ -175,7 +183,11 @@ public void setOptions() {
175183
public void setSpeed(float speed) {
176184
// only support above Android M
177185
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
178-
mMediaPlayer.setPlaybackParams(mMediaPlayer.getPlaybackParams().setSpeed(speed));
186+
try {
187+
mMediaPlayer.setPlaybackParams(mMediaPlayer.getPlaybackParams().setSpeed(speed));
188+
} catch (Exception e) {
189+
mPlayerEventListener.onError();
190+
}
179191
}
180192
}
181193

dkplayer-java/src/main/java/com/dueeeke/videoplayer/player/VideoView.java

Lines changed: 15 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -720,7 +720,7 @@ public void startFullScreen() {
720720
mIsFullScreen = true;
721721

722722
//隐藏NavigationBar和StatusBar
723-
hideSysBar();
723+
hideSysBar(decorView);
724724

725725
//从当前FrameLayout中移除播放器视图
726726
this.removeView(mPlayerContainer);
@@ -730,11 +730,7 @@ public void startFullScreen() {
730730
setPlayerState(PLAYER_FULL_SCREEN);
731731
}
732732

733-
private void hideSysBar() {
734-
ViewGroup decorView = getDecorView();
735-
if (decorView == null) {
736-
return;
737-
}
733+
private void hideSysBar(ViewGroup decorView) {
738734
int uiOptions = decorView.getSystemUiVisibility();
739735
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN) {
740736
uiOptions |= View.SYSTEM_UI_FLAG_HIDE_NAVIGATION;
@@ -753,7 +749,7 @@ public void onWindowFocusChanged(boolean hasWindowFocus) {
753749
super.onWindowFocusChanged(hasWindowFocus);
754750
if (hasWindowFocus && mIsFullScreen) {
755751
//重新获得焦点时保持全屏状态
756-
hideSysBar();
752+
hideSysBar(getDecorView());
757753
}
758754
}
759755

@@ -772,7 +768,7 @@ public void stopFullScreen() {
772768
mIsFullScreen = false;
773769

774770
//显示NavigationBar和StatusBar
775-
showSysBar();
771+
showSysBar(decorView);
776772

777773
//把播放器视图从DecorView中移除并添加到当前FrameLayout中即退出了全屏
778774
decorView.removeView(mPlayerContainer);
@@ -781,11 +777,7 @@ public void stopFullScreen() {
781777
setPlayerState(PLAYER_NORMAL);
782778
}
783779

784-
private void showSysBar() {
785-
ViewGroup decorView = getDecorView();
786-
if (decorView == null) {
787-
return;
788-
}
780+
private void showSysBar(ViewGroup decorView) {
789781
int uiOptions = decorView.getSystemUiVisibility();
790782
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN) {
791783
uiOptions &= ~View.SYSTEM_UI_FLAG_HIDE_NAVIGATION;
@@ -978,13 +970,13 @@ public void setTinyScreenSize(int[] tinyScreenSize) {
978970
*/
979971
protected void setPlayState(int playState) {
980972
mCurrentPlayState = playState;
981-
if (mVideoController != null)
973+
if (mVideoController != null) {
982974
mVideoController.setPlayState(playState);
975+
}
983976
if (mOnStateChangeListeners != null) {
984-
for (int i = 0, z = mOnStateChangeListeners.size(); i < z; i++) {
985-
OnStateChangeListener listener = mOnStateChangeListeners.get(i);
986-
if (listener != null) {
987-
listener.onPlayStateChanged(playState);
977+
for (OnStateChangeListener l : PlayerUtils.getSnapshot(mOnStateChangeListeners)) {
978+
if (l != null) {
979+
l.onPlayStateChanged(playState);
988980
}
989981
}
990982
}
@@ -995,13 +987,13 @@ protected void setPlayState(int playState) {
995987
*/
996988
protected void setPlayerState(int playerState) {
997989
mCurrentPlayerState = playerState;
998-
if (mVideoController != null)
990+
if (mVideoController != null) {
999991
mVideoController.setPlayerState(playerState);
992+
}
1000993
if (mOnStateChangeListeners != null) {
1001-
for (int i = 0, z = mOnStateChangeListeners.size(); i < z; i++) {
1002-
OnStateChangeListener listener = mOnStateChangeListeners.get(i);
1003-
if (listener != null) {
1004-
listener.onPlayerStateChanged(playerState);
994+
for (OnStateChangeListener l : PlayerUtils.getSnapshot(mOnStateChangeListeners)) {
995+
if (l != null) {
996+
l.onPlayerStateChanged(playerState);
1005997
}
1006998
}
1007999
}

dkplayer-java/src/main/java/com/dueeeke/videoplayer/util/PlayerUtils.java

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,8 +19,13 @@
1919
import android.view.ViewConfiguration;
2020
import android.view.WindowManager;
2121

22+
import androidx.annotation.NonNull;
23+
2224
import java.text.SimpleDateFormat;
25+
import java.util.ArrayList;
26+
import java.util.Collection;
2327
import java.util.Date;
28+
import java.util.List;
2429
import java.util.Locale;
2530

2631
/**
@@ -267,4 +272,18 @@ public static String stringForTime(int timeMs) {
267272
return String.format(Locale.getDefault(), "%02d:%02d", minutes, seconds);
268273
}
269274
}
275+
276+
/**
277+
* 获取集合的快照
278+
*/
279+
@NonNull
280+
public static <T> List<T> getSnapshot(@NonNull Collection<T> other) {
281+
List<T> result = new ArrayList<>(other.size());
282+
for (T item : other) {
283+
if (item != null) {
284+
result.add(item);
285+
}
286+
}
287+
return result;
288+
}
270289
}

0 commit comments

Comments
 (0)