有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java Android VideoView在长时间运行(超过24小时)后冻结

我正在制作一个循环播放视频的应用程序。只要设备打开,它就应该一直播放。我有一个变量中的视频列表,我使用索引循环播放每个视频。该应用程序工作正常,但当它在某个点运行数小时(超过20小时)时,videoView会冻结在单个帧上,并且不会调用onCompletiononError侦听器。我在带有API 17和API 19的设备上运行这个。它们都会得到相同的错误。 下面是我的代码(两种执行播放循环的方法):

public void playNextVideo(){
    if(playIndex < 0) { playIndex = 0; }
     if(allPromos.size() > 0) {
          try {
              Promo p = allPromos.get(playIndex);
              playVideo(p);
          } catch (IndexOutOfBoundsException e) {
              Log.w("EXCEPTION", e);
              isPlaying = false;
          } finally {
              playIndex++;
              if (playIndex >= allPromos.size()) {
                  playIndex = 0;
              }
          }
      } else {
          Log.d("PlayNextVideo", "No videos in the playlist");
      }
}

public void playVideo(Promo promo) {
    File videoFile = new File(promo.getLocal_link());
    if (!videoFile.exists()) {
        Log.d("VIDEOPLAYER", "Video " + playIndex + " Has been skipped. File not found");
        playNextVideo();
    } else {
        if (videoView.isPlaying()) {
            videoView.stopPlayback();
        }
        videoView.setVideoPath(promo.getLocal_link());
        videoView.requestFocus();
        videoView.start();

        videoView.setOnPreparedListener(new MediaPlayer.OnPreparedListener() {
            @Override
            public void onPrepared(MediaPlayer mp) {
                mp.setLooping(false);
            }
        });

        videoView.setOnCompletionListener(new MediaPlayer.OnCompletionListener() {
            @Override
            public void onCompletion(MediaPlayer mp) {
                videoView.stopPlayback();
                playNextVideo();
            }
        });

        videoView.setOnErrorListener(new MediaPlayer.OnErrorListener() {
            @Override
            public boolean onError(MediaPlayer mp, int what, int extra) {
                Log.d("MEDIA PLAYER ERROR", what + ", " + extra);
                videoView.stopPlayback();
                try{
                    mp.release();
                } catch (Exception e) {
                    Log.w("RELEASE EXCEPTION", e);
                }
                playNextVideo();
                return true;
            }
        });
    }
}

共 (0) 个答案