2017-04-07 5 views
2

Hat jemand von Ihnen ein ähnliches Speicherleck festgestellt? Dies ist, wie ich die Videoview am VideoView Speicherleck

@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(); 
    }); 
} 

Dies ist

Moment Handhabung, was ich auf LeakCanary bekommen

enter image description here

Jede Hilfe dankbar!

+3

'ButterKnife.bind' gibt' Unbinder' zurück. Halten Sie es als Mitglied und kann 'Unbinder.unbind'' onDetacheFromWindow' und prüfen, ob Sie das gleiche Leck haben – Blackbelt

+0

Ich benutze weder Butterknife noch ein Fragment - zusätzlich gibt es im 'onCompletion (MediaPlayer mp)' Callback ein 'mVideoView .stopPlayback() ' –

Antwort

2

Wenn Sie ButterKnife mit Fragmenten verwenden, müssen Sie die Unbinder in onDestroyView() verwenden, um die Fragmentansichten korrekt zu dereferenzieren - da Fragmente unterschiedliche Lebenszyklen zu Aktivitäten haben.

Es gibt ein ähnliches Problem here.

0

Wenn Sie Buttermesser verwenden, stellen Sie sicher, zu lösen, und wenn Sie in einem AppCompatActivity für mich

videoView.stopPlayback() in der onDestroy nennen
+0

Der Aufruf von' stopPlayback() 'scheint nicht gut genug zu sein. Ich bekomme das gleiche Speicherleck, sogar damit. – AutonomousApps

-1

Dieses es behoben, das ist nicht mit Buttermesser

aint't stellen Sie sicher,

Schritt 1: erstellen Sie eine Utility-Klasse

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); 
    } 
} 

Schritt 2: innerhalb Ihrer Aktivität, benutzen Sie diese Utility-Klasse

public class YourVideoActivity extends AppCompatActivity { 

    private VideoView videoView; 

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

    //etc... 
} 

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

+0

Das hat nicht funktioniert. Ich habe genau das gleiche Leck. – AutonomousApps

0

Anruf videoView.suspend() in onPause() oder onDestory().

+0

Willkommen bei Stack Overflow! Vielen Dank für dieses Code-Snippet, das eine begrenzte, sofortige Hilfe bieten kann. Eine [richtige Erklärung würde ihren langfristigen Wert erheblich verbessern] (// meta.stackexchange.com/q/114762/350567), indem * warum * das eine gute Lösung für das Problem ist und es für die Zukunft nützlicher machen würde Leser mit anderen, ähnlichen Fragen. Bitte [bearbeiten] Sie Ihre Antwort, um einige Erklärungen hinzuzufügen, einschließlich der Annahmen, die Sie getroffen haben. – iBug