1

我在我的应用程序中使用了 exoplayer 3 次,所以我认为最好在它自己的类中实现它并且只使用它 3 次。

在这样做时,我引入了内存泄漏,因此它会泄漏活动并导致应用程序崩溃。

我不确定为什么会发生这种情况,因为我还没有关闭活动。我想这是因为活动或视图发生了一些变化。

如果您能告诉我我的实现有什么问题导致内存泄漏,我们将不胜感激。

这是我的 exoplayer 控制类:

    public class ExoPlayerControls {

        Context context;
        SimpleExoPlayerView simpleExoplayerView;
        SimpleExoPlayer player;
        boolean preview;

        public ExoPlayerControls(Context context, SimpleExoPlayerView simpleExoplayerView, SimpleExoPlayer player, Boolean preview) {
            this.context = context;
            this.simpleExoplayerView = simpleExoplayerView;
            this.player = player;
            this.preview = preview;

        }

        public boolean setUPExoPlayer (String alarmMediaLocation){
            try {

                if (player != null){
                    player.setPlayWhenReady(false);
                    //URI location of audio
                    Uri mediaURI = Uri.parse(alarmMediaLocation);

                    // Data source Factory
                    DefaultHttpDataSourceFactory datasourceFactory = new DefaultHttpDataSourceFactory("alarm video");

                    // Extractor Factory
                    ExtractorsFactory extractorsFactory = new DefaultExtractorsFactory();

                    // Media source
                    MediaSource mediasource = new ExtractorMediaSource(mediaURI, datasourceFactory, extractorsFactory, null, null);

                    // Prepare the exoplayer
                    player.prepare(mediasource);

                    player.setPlayWhenReady(false);


                } else {

                    // Create a bandwith meter
                    BandwidthMeter bandwidthmeter = new DefaultBandwidthMeter();

                    // Create a track selector
                    TrackSelector trackselector = new DefaultTrackSelector(new AdaptiveTrackSelection.Factory(bandwidthmeter));

                    // Create the player
                    player = ExoPlayerFactory.newSimpleInstance(context, trackselector);

                    //URI location of audio
                    Uri mediaURI = Uri.parse(alarmMediaLocation);

                    // Data source Factory
                    DefaultHttpDataSourceFactory datasourceFactory = new DefaultHttpDataSourceFactory("alarm video");

                    // Extractor Factory
                    ExtractorsFactory extractorsFactory = new DefaultExtractorsFactory();

                    // Media source
                    MediaSource mediasource = new ExtractorMediaSource(mediaURI, datasourceFactory, extractorsFactory, null, null);

                    // Bind the player to the view.
                    simpleExoplayerView.setPlayer(player);

                    // Prepare the exoplayer
                    player.prepare(mediasource);

                    player.setPlayWhenReady(false);
                }


            } catch (Error e){
                Toast.makeText(context, "Exoplayer error" + e, Toast.LENGTH_SHORT).show();
            }

            return  true;
        }

        public void playAlarmMedia(String alarmMediaLocation){

            try {

                boolean exoPlayerSet = setUPExoPlayer(alarmMediaLocation);
                if (exoPlayerSet){
                    // Tell exoplayer to start playing immediately
                    player.setPlayWhenReady(true);
                }

            } catch (Error e){
                Toast.makeText(context, "Exoplayer error" + e, Toast.LENGTH_SHORT).show();
            }
        }
}

我在我的活动中实现它是这样的:

  // Initialise exoplayer controls
        exoPlayerControls = new ExoPlayerControls(this, simpleExoplayerView, player, preview);
        String alarmMediaLocation = downloadedAlarmToPlay.getAlarmMediaLocation();
        exoPlayerControls.setUPExoPlayer(alarmMediaLocation);
4

1 回答 1

0

exoplayer 类具有三个嵌套的静态类/接口 ExoplayerComponent、Factory 和 Listener。通常,任何静态对象都将持有对活动的引用。内存泄漏可能是由方向变化引起的吗?因为活动将无法自我毁灭。因此,较旧的活动实例将保留在内存中,从而导致内存泄漏。克服这个问题的一种方法是使用 getAppplicationContext() 而不是 Activity 上下文 (this)。应用程序上下文是一个单例对象。因此,每次由于屏幕旋转而创建 Activity 时,都不会创建新的上下文实例。

于 2018-02-26T11:00:24.217 回答