2015-09-08 14 views
6

In mvp salviamo il riferimento di un'attività in un riferimento debole. WeakReference<Activity> view = new WeakReference<Activity>(activity); Se perdiamo il riferimento. possiamo riaverlo?Android MVP WeakRefrence

risposta

4

Se si perde il riferimento al proprio Activity, significa che l'attività è stata raccolta e non esiste più. Non puoi recuperare ciò che non esiste.

Es. Se ciò accade a causa di modifiche alla configurazione, significa che è stato creato un nuovo activity.

È necessario un modo per allegare la vista appena creata allo stesso relatore.

Se cerchi librerie che ti aiutino, dai un'occhiata a mosby e nucleus.

+0

"È necessario un modo per allegare la vista appena creata" come fare? grazie mille per la tua risposta –

+1

@MethnaniBilel è un problema complesso da risolvere ... dai un'occhiata a mosby e/o nucles per vedere come hanno risolto. – LordRaydenMK

1

Non penso che dovresti salvare un riferimento a Activity in MVP - non importa se è difficile o debole!

Suppongo che stiate memorizzando questo riferimento nel Presenter. Per disaccoppiare realmente i livelli è necessario creare un'interfaccia che descriva il tuo View (Activity) e utilizzarlo al posto dell'attività.

Quindi faresti:

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

tuo Activity dovrebbe implementare l'interfaccia dall'alto.

public class LoginActivity implements LoginView { 
    ... 
} 

Nel vostro presentatore avreste:

class LoginPresenter { 
    private LoginView mView; 

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

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

benefici immediati di fare questo:

  1. I diversi strati sono davvero disaccoppiati. Puoi cambiare il tuo Activity (ad esempio, decidi di usare Fragments) senza toccare il tuo Presenter.

  2. Il presentatore è completamente testabile solo con JUnit! Non è necessario utilizzare alcunché di fantasia per verificare che le interazioni siano corrette, semplicemente Mockito per simulare il LoginView.

Un altro punto da notare - sei sicuro che vuoi che il tuo Presenter a sopravvivere tuo View? Ci sono alcune situazioni in cui questo non può essere evitato, ma nella maggior parte dei casi hanno la stessa durata - quando lo View viene distrutto dovrebbe essere lo Presenter.

+1

Il tuo mView è un riferimento forte di LoginActivity. – Ricardo