VideoView内存泄漏

时间:2017-04-07 14:18:18

标签: android memory-leaks android-videoview

你们有没有遇到类似的内存泄漏? 这就是我目前处理VideoView的方式

@Override
protected void onFinishInflate() {
    super.onFinishInflate();
    ButterKnife.bind(this);

    Uri videoUri = Uri.parse(String.format("android.resource://%s/%s", getContext().getPackageName(), videoRes));
    videoView.setVideoURI(videoUri);
    videoView.setOnPreparedListener(mp -> {
        mp.setLooping(true);
        videoView.start();
    });
}

这就是我对LeakCanary的看法

enter image description here

任何帮助表示赞赏!

4 个答案:

答案 0 :(得分:2)

将ButterKnife与Fragments一起使用时,您需要使用Unbinder中的onDestroyView()来正确地取消引用片段的视图 - 因为片段与活动的生命周期不同。

存在相关问题here

答案 1 :(得分:0)

如果您正在使用Butterknife,请确保取消绑定,如果您不确定在onDestroy中调用videoView.stopPlayback()

答案 2 :(得分:0)

这在我AppCompatActivity内没有使用Butterknife

的情况下修复了它

第1步:创建实用程序类

public class AudioServiceContext extends ContextWrapper {

    public AudioServiceContext(Context base) {
        super(base);
    }

    public static ContextWrapper getContext(Context base) {
        return new AudioServiceContext(base);
    }

    @Override
    public Object getSystemService(String name) {
        if (Context.AUDIO_SERVICE.equals(name)) {
            return getApplicationContext().getSystemService(name);
        }
        return super.getSystemService(name);
    }
}

第2步:在您的活动中,使用此实用程序类

public class YourVideoActivity extends AppCompatActivity {

    private VideoView videoView;

    @Override
    protected void attachBaseContext(Context newBase) {
        super.attachBaseContext(AudioServiceContext.getContext(newBase));
    }

    //etc...
}

信用:https://medium.com/@chauyan/confirmed-videoview-leak-on-android-ac502856a6cf

答案 3 :(得分:0)

videoView.suspend()onPause()onDestory()中致电# Calculation of cumulative binomial distribution def PDP(p, N, min): pdp=0 for k in range(min, N+1): pdp += (float(factorial(N))/(factorial(k)*factorial(N-k)))*(p**k)*((1-p)**(N-k)) return pdp