“不要将 Android 上下文类放在静态字段中;这是内存泄漏“ - 静态视图的 Lint 警告



有一些标题相似的问题,但它们都是关于你在构造函数中获得的上下文。

有包含项目的回收器视图和一些存在播放\暂停按钮的其他视图。

此类允许此视图一次只能播放一个文件。如果view_1正在播放,并且您在view_2按播放 - 将播放file_2。

这个类中有一个 ImageButton mPlayPauseButton。需要将 ImageButton 设置为 view_1 paused_state。并将 图像按钮 在 view_2 到 playing_state.

棉绒警告

不要将 Android 上下文类放在静态字段中;这是内存泄漏(并且还会破坏即时运行(静态字段将泄漏上下文。

public class CommentsAudioPlayer {
    private static MediaPlayer mPlayer;
    private static ImageButton mPlayPauseButton;
    private static void init(ImageButton imageButton){
        mPlayer = new MediaPlayer();
        mPlayPauseButton = imageButton;
    }
    public static void startPlaying(String dataSource, ImageButton imageButton) {
        init(imageButton);
        try {
            mPlayer.setDataSource(dataSource);
            mPlayer.setOnCompletionListener(new MediaPlayer.OnCompletionListener() {
                @Override
                public void onCompletion(MediaPlayer mp) {
                    stopPlaying();
                }
            });
            mPlayer.setOnPreparedListener(new MediaPlayer.OnPreparedListener() {
                @Override
                public void onPrepared(MediaPlayer mp) {
                    mPlayer.start();
                }
            });
            mPlayer.prepareAsync();
            if (mPlayPauseButton != null) mPlayPauseButton.setSelected(true);
        } catch (Exception e) {
            Log.e("Player", "Error trying to start playing:n" + e.toString());
        }
    }
    public static void stopPlaying() {
        if (mPlayPauseButton != null)
            mPlayPauseButton.setSelected(false);
        mPlayPauseButton = null;
        if (mPlayer!=null)
            mPlayer.release();
        mPlayer = null;
    }
}

警告中的答案:不要将Android上下文类放在静态字段中;这是一个内存泄漏(并且还会破坏即时运行(并不能解决我的问题。

不要将小部件放在static字段中。

选项包括:

  1. 删除此类。 将所有这些逻辑移动到活动(或片段(中,您可以在其中直接访问小组件。

  2. 使用事件总线(LocalBroadcastManager、绿色机器人的事件总线等(。当状态更改时,让您的代码在此处在总线上发布消息。让您的 UI(活动或片段(订阅总线上的消息并更新小部件。

  3. 让您的活动/片段保存CommentsAudioPlayer的实例,并将字段设置为非static CommentsAudioPlayer

在这三者中,第一个选项更简单、更干净、内存密集度更低,执行速度更快。

您应该将

视图(mPlayPauseButton(与该功能分离以避免泄漏。为此,您可以实现侦听器模式。该代码中更简单的方法可能是将"侦听器"对象作为参数传递,而不是直接传递视图引用......

最新更新