DJp*_*phy 3 android view nullpointerexception android-activity
我有一个活动 A [MainActivity],从中启动活动 B [视频播放器]
情况 1:单击活动 A 中的视频缩略图 => 转到活动 B => 播放视频几秒钟(重要:您需要播放视频几秒钟) => 单击返回导航 => 返回到 Activity A =>没有崩溃。
情况 2:单击 Activity A 中的视频缩略图 => 转到 Activity B => 缓冲区和视频开始播放 => 立即单击返回导航(重要:不要播放视频)=> 应用程序尝试返回 Activity A = >崩溃与其一致。
注意:我没有在 Activity A 的 onResume() 中编写任何代码,只是为了确保我没有重写任何 onResume() 相关代码,这可能会导致崩溃。堆栈跟踪并不指向应用程序代码中的一行,它只是显示来自 android 源库的堆栈跟踪。我为此花费了4 个多小时,非常感谢任何帮助。
活动B[玩家活动]代码:
public class VitamioPlayerActivity extends AppCompatActivity implements MediaPlayer.OnErrorListener, MediaPlayer.OnPreparedListener, MediaPlayer.OnTimedTextListener {
public static final String TAG = VitamioPlayerActivity.class.getSimpleName();
@Bind(R.id.videoView)
VideoView videoView;
@Bind(R.id.progressBar)
ProgressBar progressBar;
@Bind(R.id.subtitle_view)
TextView mSubtitleView;
private VideoModel videoModel;
private long mPosition = 0;
private boolean isLiveChannel;
@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_vitamio);
    ButterKnife.bind(this);
    StrictMode.ThreadPolicy policy = new StrictMode.ThreadPolicy.Builder().permitAll().build();
    StrictMode.setThreadPolicy(policy);
    if (getIntent() == null)
        return;
    if (getIntent().getExtras() == null)
        return;
    if (!getIntent().getExtras().containsKey(AppConstant.KEY_BUNDLE_VIDEO))
        return;
    videoModel = (VideoModel) getIntent().getExtras().getSerializable(AppConstant.KEY_BUNDLE_VIDEO);
    if (videoModel == null)
        return;
    playVideo();
}
VideoControllerView controllerView;
void playVideo() {
    String path = null;
    if (videoModel.isLoadBalancer()) {
        path = URLHelper.getInstance().getPlayableVideoUrl(videoModel.getVideoUrl());
    } else
        path = videoModel.getVideoUrl();
    if (TextUtils.isEmpty(path)) {
        Toast.makeText(this, "Please edit MediaPlayer Activity, " + "and set the path variable to your media file path." + " Your media file must be stored on sdcard.", Toast.LENGTH_LONG).show();
        return;
    }
    isLiveChannel = !(path.contains(".mp4"));
    videoView.setVideoURI(Uri.parse(path));
    videoView.setMediaController(controllerView = new VideoControllerView(this, !isLiveChannel));
    videoView.requestFocus();
    videoView.start();
    videoView.setOnPreparedListener(this);
    videoView.setOnErrorListener(this);
}
@Override
public void onPrepared(MediaPlayer mediaPlayer) {
    mediaPlayer.setPlaybackSpeed(1.0f);
}
@Override
public void onTimedText(String text) {
    mSubtitleView.setText(text);
}
@Override
public void onTimedTextUpdate(byte[] pixels, int width, int height) {
    int a = 1;
}
@Nullable
@OnClick(R.id.imvHeaderBack)
void doBack() {
    finish();
}
@Override
public void onBackPressed() {
    finish();
}
@Override
protected void onPause() {
    mPosition = videoView.getCurrentPosition();
    videoView.stopPlayback();
    super.onPause();
}
@Override
protected void onResume() {
    if (mPosition > 0) {
        videoView.seekTo((int) mPosition);
        mPosition = 0;
    }
    super.onResume();
}
@Override
public boolean onError(MediaPlayer mp, int what, int extra) {
    WindowUtils.getInstance().genericInfoMsgWithOKCallBack(this, null, "Sorry, Cannot Play Video", R.color.redStatus,
            new ViewConstructor.InfoDisplayListener() {
                @Override
                public void onPositiveSelection(DialogInterface alertDialog) {
                    doBack();
                }
            });
    return true;
}
}
堆栈跟踪:
java.lang.NullPointerException: Attempt to invoke virtual method 'void android.view.View.dispatchWindowVisibilityChanged(int)' on a null object reference
    at android.view.ViewGroup.dispatchWindowVisibilityChanged(ViewGroup.java:1310)
    at android.view.ViewGroup.dispatchWindowVisibilityChanged(ViewGroup.java:1310)
    at android.view.ViewGroup.dispatchWindowVisibilityChanged(ViewGroup.java:1310)
    at android.view.ViewGroup.dispatchWindowVisibilityChanged(ViewGroup.java:1310)
    at android.view.ViewGroup.dispatchWindowVisibilityChanged(ViewGroup.java:1310)
    at android.view.ViewGroup.dispatchWindowVisibilityChanged(ViewGroup.java:1310)
    at android.view.ViewGroup.dispatchWindowVisibilityChanged(ViewGroup.java:1310)
    at android.view.ViewGroup.dispatchWindowVisibilityChanged(ViewGroup.java:1310)
    at android.view.ViewRootImpl.performTraversals(ViewRootImpl.java:1410)
    at android.view.ViewRootImpl.doTraversal(ViewRootImpl.java:1134)
    at android.view.ViewRootImpl$TraversalRunnable.run(ViewRootImpl.java:6050)
    at android.view.Choreographer$CallbackRecord.run(Choreographer.java:860)
    at android.view.Choreographer.doCallbacks(Choreographer.java:672)
    at android.view.Choreographer.doFrame(Choreographer.java:608)
    at android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.java:846)
    at android.os.Handler.handleCallback(Handler.java:739)
    at android.os.Handler.dispatchMessage(Handler.java:95)
    at android.os.Looper.loop(Looper.java:148)
    at android.app.ActivityThread.main(ActivityThread.java:5442)
    at java.lang.reflect.Method.invoke(Native Method)
    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:738)
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:628)
进一步检查文档后,看起来您从 onCreate 文档中陷入了这种情况:https://developer.android.com/reference/android/app/Activity.html#onCreate (android.os.Bundle )
您可以从此函数中调用 finish(),在这种情况下,将立即调用 onDestroy(),而不会执行活动生命周期的任何其余部分(onStart()、onResume()、onPause() 等)。
由于您onBackPressed和doBack两者都调用了finish(),您可能会遇到竞争条件,该条件videoView仍在您的 Activity 中开始onCreate,在结束之前按下后退onCreate,并且您的 Activity 在尝试播放时被破坏,同时videoView跳过所有其他生命周期功能,从而导致因这个奇怪的堆栈跟踪而崩溃。
修复:覆盖并在那里onResume调用并覆盖并在那里调用videoView.startonDestroyonStopif (videoView.isPlaying()) videoView.stopPlayback
| 归档时间: | 
 | 
| 查看次数: | 3618 次 | 
| 最近记录: |