2015-09-08 4 views
6

In mvp speichern wir diese Referenz einer Aktivität in einer schwachen Referenz. WeakReference<Activity> view = new WeakReference<Activity>(activity); Wenn wir die Referenz verlieren. Können wir es zurückbekommen?Android MVP WeakRefrence

Antwort

4

Wenn Sie den Verweis auf Ihre Activity verlieren, bedeutet dies, dass die Aktivität wurde Müll gesammelt und es existiert nicht mehr. Sie können nicht zurück, was nicht existiert.

Ex. Wenn dies aufgrund einer Konfigurationsänderung geschieht, bedeutet dies, dass ein neuer activity erstellt wurde.

Sie benötigen eine Möglichkeit, die neu erstellte Ansicht an denselben Präsentator anzuhängen. Wenn Sie nach Bibliotheken suchen, die Ihnen helfen, sehen Sie sich mosby und nucleus an.

+0

"Sie benötigen eine Möglichkeit, die neu erstellte Ansicht anzuhängen" wie geht das? thx so viel für Ihre Antwort –

+1

@MethnaniBilel es ist ein komplexes Problem zu lösen ... werfen Sie einen Blick auf Mosby und/oder nuclees zu sehen, wie sie es gelöst haben. – LordRaydenMK

1

Ich glaube nicht, dass Sie eine Referenz auf eine Activity in MVP überhaupt speichern sollten - egal, ob es hart oder schwach ist!

Ich gehe davon aus, dass Sie diese Referenz in der Presenter speichern. Um die Schichten wirklich zu entkoppeln, sollten Sie eine Schnittstelle erstellen, die Ihre View (Activity) beschreibt und sie anstelle der Aktivität verwenden.

So würden Sie tun:

public interface LoginView { 
    displayUsernameError(String error); 
    displayPasswordError(String error); 
    openMainScreen(); 
} 

Ihre Activity sollte die Schnittstelle von oben implementieren.

public class LoginActivity implements LoginView { 
    ... 
} 

In Ihrem Moderator müssten Sie:

class LoginPresenter { 
    private LoginView mView; 

    public LoginPresenter(LoginView view) { 
     mView = view; 
    } 

    public onLoginButtonClicked(String username, char[] password) { 
     ... 
     mView.openMainScreen(); 
    } 
} 

Sofortiger Nutzen, dies zu tun:

  1. Die verschiedenen Schichten wirklich entkoppelt sind. Sie können Ihre Activity ändern (sagen Sie, dass Sie stattdessen Fragments verwenden möchten), ohne Ihre Presenter zu berühren.

  2. Ihr Präsentator ist nur mit JUnit vollständig testbar! Keine Notwendigkeit, irgendetwas zu verwenden, um zu überprüfen, ob Ihre Interaktionen korrekt sind, einfach Mockito, um die LoginView zu verspotten.

Ein weiterer Punkt zu beachten - sind Sie sicher, dass Sie Ihre Presenter Ihre View zu überleben? Es gibt einige Situationen, in denen das nicht vermieden werden kann, aber in den meisten Fällen haben sie die gleiche Lebensdauer - wenn die View zerstört wird, sollte die Presenter auch sein.

+1

Ihr mView ist eine starke Referenz von LoginActivity. – Ricardo