2015-09-08 5 views
6

mvpでは、アクティビティの参照を弱参照に保存します。 WeakReference<Activity> view = new WeakReference<Activity>(activity); 参照が失われた場合。それを取り戻すことはできますか?Android MVP WeakRefrence

答えて

4

Activityへの参照が失われた場合、そのアクティビティはガベージコレクトされ、もう存在しないことを意味します。あなたは存在しないものを取り戻すことはできません。

Ex。これが構成変更のために発生した場合、新しいactivityが作成されたことを意味します。

新しく作成したビューを同じプレゼンタに添付する方法が必要です。

ライブラリをお探しの場合はmosbynucleusをご覧ください。

+0

"新しく作成したビューを添付する方法が必要です"とはどうすればいいですか? あなたの答えはそれほど多くありません –

+1

@MethnaniBilel解決するのは複雑な問題です...どのように解決したのかを見るために、mosbyやnuclesを見てください。 – LordRaydenMK

1

MVPActivityへの参照を保存する必要はないと思いますが、それは難しいか弱いかは関係ありません。

この参照をPresenterに保存しているとします。レイヤーを実際にデカップリングするには、ViewActivity)を表すインターフェイスを作成し、アクティビティの代わりに使用する必要があります。

だから、あなたがしたい:

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

あなたActivityは、上からインターフェイスを実装する必要があります。あなたのプレゼンターで

public class LoginActivity implements LoginView { 
    ... 
} 

あなたが持っていると思います:

class LoginPresenter { 
    private LoginView mView; 

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

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

これを行うための即時の利点:

  1. 異なる層が本当にデカップリングされています。 Activityを変更することができます(代わりにFragmentsを使用することにします)。Presenterに触れないでください。

  2. あなたの発表者はJUnitを使用して完全にテスト可能です!あなたの相互作用が正しいことを確認するために何かを使用する必要はありません、LoginViewを模擬するために単なる平文Mockito

もう一つのポイントは、注意する - あなたはあなたのPresenterあなたViewをより長生きしてもよろしいですか?回避できない状況がいくつかありますが、ほとんどの場合、寿命が同じです。Viewが破壊された場合は、Presenterも同様です。

+1

mViewはLoginActivityの強力なリファレンスです。 – Ricardo