2016-12-20 9 views

答えて

5

は別のプレゼンターの状態を保存可能な戦略ともObservableの状態があります。あなたはBundleへのデータ保存の標準のAndroid途中省略こう

Activity(単純な変数とネットワーク要求のない状態を保存することだけができます。):

public class MainActivity extends AppCompatActivity implements MainActivityView { 
    private static final String TAG_RETAIN_FRAGMENT = "retain_fragment"; 

    MainActivityPresenter mPresenter; 

    private MainActivityRetainFragment mRetainFragment; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     initRetainFragment(); 
     initPresenter(); 
    } 

    private void initRetainFragment() { 
     FragmentManager fm = getSupportFragmentManager(); 
     mRetainFragment = (MainActivityRetainFragment) fm.findFragmentByTag(TAG_RETAIN_FRAGMENT); 
     if (mRetainFragment == null) { 
      mRetainFragment = new MainActivityRetainFragment(); 
      fm.beginTransaction().add(mRetainFragment, TAG_RETAIN_FRAGMENT).commit(); 
     } 
    } 

    private void initPresenter() { 
     mPresenter = mRetainFragment.getPresenter(); 
     mRetainFragment.retainPresenter(null); 
     if (mPresenter == null) { 
      mPresenter = new MainActivityPresenter(); 
     } 
     mPresenter.attachView(this); 
    } 

    @Override 
    protected void onDestroy() { 
     super.onDestroy(); 
     if (!isFinishing()) { 
      mRetainFragment.retainPresenter(mPresenter); 
      return; 
     } 
     mPresenter.detachView(); 
     mPresenter = null; 
    } 
} 

Fragmentを保持:

public class MainActivityRetainFragment extends Fragment { 
    private MainActivityPresenter presenter; 

    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setRetainInstance(true); 
    } 

    public void retainPresenter(MainActivityPresenter presenter) { 
     this.presenter = presenter; 
    } 

    public MainActivityPresenter getPresenter() { 
     return presenter; 
    } 
} 

アクティビティライフサイクルイベントの処理方法に注目してください。 Activityが作成されると、Fragmentがバックスタックに追加され、ライフサイクルイベントではバックスタックから復元されます。保持Fragmentにはビューがありません。構成変更中はプレゼンターのための保持者に過ぎません。あなたはメモリリークが懸念される場合

setRetainInstance(true) 

mPresenter.attachView(this); 
を:プレゼンターは、発表者のビューが復元され、復元されるたびに、正確にbackstackから同じフラグメントを(そして、それはコンテンツです)復元できますメインの呼び出しに注意してください

これまでのActivityの参照は新しいものに置き換えられました。ここでは、設定の変更の助けをhere

1

私は、プレゼンターの特定のViewStateクラスでビューの状態をカプセル化して処理しました。テストするのは簡単です。

public interface BaseViewState { 
    void saveState(@NonNull Bundle outState); 

    void restoreState(@Nullable Bundle savedInstanceState); 
} 

class HomeViewState implements BaseViewState { 

    static final long NONE_NUM = -1; 

    static final String STATE_COMIC_NUM = "state_comic_num"; 

    private long comicNum = NONE_NUM; 

    @Inject 
    HomeViewState() { 
    } 

    @Override 
    public void saveState(@NonNull Bundle outState) { 
     outState.putLong(STATE_COMIC_NUM, comicNum); 
    } 

    @Override 
    public void restoreState(@Nullable Bundle savedInstanceState) { 
     if (savedInstanceState != null) { 
      comicNum = savedInstanceState.getLong(STATE_COMIC_NUM, NONE_NUM); 
     } 
    } 

    long getComicNumber() { 
     return comicNum; 
    } 

    void setComicNum(long comicNum) { 
     this.comicNum = comicNum; 
    } 
} 

プレゼンターのviewStateから値を取得/設定すると、プレゼンターのステートレスと同様に更新された状態を維持できます。

public class HomePresenter implements HomeContract.Presenter { 

    private HomeViewState viewState; 

    HomeViewState getViewState() { 
     return viewState; 
    } 

    @Override 
    public void loadComic() { 
     loadComic(viewState.getComicNumber()); 
    } 
    ... 
} 

アクティビティビューでは、保存と復元の呼び出しを開始する必要があります。 retain Fragment

public class MainActivity extends BaseActivity implements HomeContract.View { 

     @Override 
     protected void onCreate(Bundle savedInstanceState) { 
      super.onCreate(savedInstanceState); 
      ... 
      homePresenter.getViewState().restoreState(savedInstanceState); 
     } 


     @Override 
     public void onSaveInstanceState(Bundle outState, PersistableBundle outPersistentState) { 
      super.onSaveInstanceState(outState, outPersistentState); 

      homePresenter.getViewState().saveState(outState); 
     } 
    ... 
} 
+0

おかげで、このような取扱いに関する

より。しかし、そのバンドルに例のためのタイマーのようなObservableを保存することは可能ですか? – MobileDev

関連する問題