【问题标题】:How to fix SimpleExoPlayer.stop() on a null object reference?如何修复空对象引用上的 SimpleExoPlayer.stop()?
【发布时间】:2022-11-18 21:46:04
【问题描述】:

滚动 viewpager 时,我无法停止视频播放。

这是我的 MainActivity 的 Viewpager scrollListener 代码:

       viewPager.registerOnPageChangeCallback(new ViewPager2.OnPageChangeCallback() {
            @Override
            public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {
                super.onPageScrolled(position, positionOffset, positionOffsetPixels);
                simpleExoPlayer1.stop();    //error is here
                Log.e("onPageScrolled", "onPageScrolled");

            }

            @Override
            public void onPageSelected(int position) {
                super.onPageSelected(position);
                Log.e("onPageSelected", "onPageSelected");

            }

            @Override
            public void onPageScrollStateChanged(int state) {
                super.onPageScrollStateChanged(state);
                Log.e("onPageScrolStateChang", "onPageScrollStateChanged");
            }
        });

        myAdapter = new VideoSliderAdapter(getApplicationContext(), videoPaths,
                MainActivity2.this, this);
        viewPager.setAdapter(myAdapter);    

    }

    @Override
    public void clicktoupdate(ImageView playPause, int position,
                              PlayerView playerView,
                              SimpleExoPlayer simpleExoPlayer1) {
        // get data
        Toast.makeText(this, "Playing..", Toast.LENGTH_SHORT).show();
        Uri videoUri = Uri.parse(videoPaths.get(position));
        playPause.setVisibility(View.GONE);
        playerView.setVisibility(View.VISIBLE);
        simpleExoPlayer1 = new SimpleExoPlayer.Builder(getApplicationContext())
                .setSeekBackIncrementMs(5000)
                .setSeekForwardIncrementMs(5000)
                .build();
        playerView.setPlayer(simpleExoPlayer1);
        playerView.setKeepScreenOn(true);
        simpleExoPlayer1.addListener(new Player.Listener() {
            @Override
            public void onPlayerStateChanged(boolean playWhenReady, int playbackState) {
                if (playbackState == Player.STATE_BUFFERING) {
//                    progressBar.setVisibility(View.VISIBLE);
                } else if (playbackState == Player.STATE_READY) {
//                    progressBar.setVisibility(View.GONE);
                }
            }
        });

        MediaItem mediaItem = MediaItem.fromUri(videoUri);
        simpleExoPlayer1.setMediaItem(mediaItem);
        simpleExoPlayer1.prepare();
        simpleExoPlayer1.play();
    }

这是我的适配器的 Viewholder 代码:

   public class ViewHolder extends RecyclerView.ViewHolder {
    PlayerView playerView;
    ImageView thumbnailImage;
    ImageView playPauseBtn;
    ImageView bt_fullscreen, bt_lockscreen;
    SimpleExoPlayer simpleExoPlayer;
    ProgressBar progressBar;
    LinearLayout sec_mid, sec_bottom;

    public ViewHolder(@NonNull View view) {
        super(view);
        playerView = view.findViewById(R.id.statusSliderVideo);
        thumbnailImage = view.findViewById(R.id.statusSliderThumbnailImage);
        playPauseBtn = view.findViewById(R.id.playPauseBtn);
        progressBar = view.findViewById(R.id.progress_bar);
        bt_fullscreen = view.findViewById(R.id.bt_fullscreen);
        bt_lockscreen = view.findViewById(R.id.exo_lock);
        sec_mid = view.findViewById(R.id.sec_controlvid1);
        sec_bottom = view.findViewById(R.id.sec_controlvid2);
        playPauseBtn.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                int position = getAdapterPosition();
                if (position != RecyclerView.NO_POSITION) {
                    onitemclicklisteners.clicktoupdate(playPauseBtn, position, playerView, simpleExoPlayer);
                }
            }
        });
    }


}

public interface Onitemclicklisteners {
    void clicktoupdate(ImageView playPause, int position, PlayerView playerView, SimpleExoPlayer simpleExoPlayer);

}

一旦应用程序启动,这是我得到的错误:

java.lang.NullPointerException: Attempt to invoke virtual method 'void com.google.android.exoplayer2.SimpleExoPlayer.stop()' on a null object reference

我想我必须在 MainActivity 中创建 simpleExoPlayer1 global,请帮我解决这个问题。提前致谢

【问题讨论】:

    标签: android exoplayer


    【解决方案1】:

    您是否尝试过空检查? 是这样的:

    if (simpleExoPlayer1 != null) {
      simpleExoPlayer1.stop();
    }
    

    这将修复崩溃。 但也许问题出在你代码的其他地方;你在注册OnPageChangeCallback之前初始化了simpleExoPlayer1了吗?

    【讨论】:

      【解决方案2】:

      simpleExoPlayer1 对象正在您的 clicktoupdate() 接口覆盖中实例化。 clicktoupdate() 函数只会被调用单击视图持有者时.因此,当您第一次打开该应用程序时,onPageScrolled() 一定是出于某种原因被调用,它正试图停止 simpleExoPlayer1。但是,simpleExoPlayer1 还没有被实例化,因为用户还没有点击 view holder!这就是它崩溃的原因 - simpleExoPlayer1 对象尚未实例化,因此为空。

      你可以做一些事情来解决这个问题,但我认为 simpleExoPlayer1 可以在活动的 onCreate() 方法中实例化一次,所以将它移到那里应该可以解决你的问题。

      在调用视图寻呼机侦听器之前,尝试将以下 sn-p 移动到您的 onCreate() 内部。

      @Override
      public void onCreate(Bundle savedInstanceState) {
          ...
          simpleExoPlayer1 = new SimpleExoPlayer.Builder(getApplicationContext())
              .setSeekBackIncrementMs(5000)
              .setSeekForwardIncrementMs(5000)
              .build();
          
          viewPager.registerOnPageChangeCallback(...);
          ...
      }
      

      最后提示:使用驼峰式大小写来定义方法和变量 例如,clicktoupdate() 应该是 clickToUpdate()。它使它更具可读性:)

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-07-24
        • 1970-01-01
        • 1970-01-01
        • 2017-04-24
        • 2021-08-16
        • 1970-01-01
        相关资源
        最近更新 更多