在单独的类中实现肾上腺素时泄漏活动上下文



我在应用程序中使用了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);

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

最新更新