3
A
答えて
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);
}
...
}
関連する問題
- 1. AndroidアプリのRxJavaとMVP
- 2. Android、RxJava、MVP、メモリリーク
- 3. Androidのオリエンテーション変更を正しく処理する方法
- 4. Androidオリエンテーション変更
- 5. Androidエミュレータ:オリエンテーションの変更
- 6. Android:オリエンテーション変更アニメーション
- 7. Androidでオリエンテーション変更のアクティビティを再作成する理由
- 8. FragmentPagerAdapter - オリエンテーションの変更を処理する方法は?
- 9. AndroidでのRxJavaとMVVMパターンによるエラー処理
- 10. Android:オリエンテーションの変更開始の意図?
- 11. Android:オリエンテーションの変更でCardViewのレイアウトを変更
- 12. オリエンテーションの変更
- 13. Android ICS + ActionBarタブ+オリエンテーションの変更
- 14. RxJavaの並列処理 - フィルタ
- 15. オリエンテーションの変更とscreen.width
- 16. オリエンテーションの変更と通知
- 17. RxJavaのAndroidルームで空のクエリ結果を処理する
- 18. オリエンテーションが変更されたときのレイアウトの変更はどのように処理されますか?
- 19. Retrofit 2とRxJavaのエラー処理オペレータ
- 20. オリエンテーションでのフラグメントレイアウトの変更
- 21. Rxjavaでのネットワークエラーの処理2 - Retrofit 2
- 22. Androidでオリエンテーションを変更する
- 23. AndroidでRxJavaの購読を優雅に処理するには?
- 24. Retrofit2 + RxJavaエラー処理
- 25. Android MVP:モデルクラス/手動トリガーエラーからのエラー処理
- 26. RxJavaでの堅牢なエラー処理
- 27. Android:オリエンテーション変更後に削除されたカスタムオブジェクトへの変更
- 28. モバイルアプリバックエンドAPIドメインの変更の処理 - iOSとAndroid
- 29. オリエンテーションでのAndroid WebViewの更新
- 30. ローテーションの変更の処理とユーザーの離脱処理
おかげで、このような取扱いに関する
より。しかし、そのバンドルに例のためのタイマーのようなObservableを保存することは可能ですか? – MobileDev