3
A
回答
5
還有就是允許保存演示狀態的另一種策略,也Observable
的狀態:retain Fragment
。你省略將數據保存到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);
因此,以前的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());
}
...
}
在活動的視圖應該啓動呼叫來保存和恢復。
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. RxJava Android處理屏幕方向變化
- 2. Android MVP:處理對RecyclerView的更改
- 3. 處理運行時方向更改android
- 4. Android Picasso處理方向已更改
- 5. RxJava和MVP在Android應用程序
- 6. Android - 在屏幕上處理對話框方向更改
- 7. 片段和處理方向更改
- 8. 在Android上處理RxJava訂閱優雅?
- 9. Android,RxJava,MVP和內存泄漏
- 10. Android:喚醒鎖定和處理方向更改
- 11. 使用上下文和AlertDialog/AsyncTask處理方向更改
- 12. Android Viewpager和方向更改
- 13. Android OnSharedPreferenceChangeListener和方向更改
- 14. 處理方向更改自己
- 15. 安卓:webView的處理方向更改
- 16. 如何處理屏幕方向更改
- 17. 使用碎片處理方向更改
- 18. 有條件地處理方向更改
- 19. 處理方向變更後,在RxJava Android應用程序中處理Retrofit服務響應
- 20. 在屏幕方向更改上處理碎片?
- 21. 處理方向改變微調 - android
- 22. AutoCompleteTextView處理屏幕方向更改
- 23. 如何處理ProgressDialog方向更改?
- 24. 方向更改時處理SQLiteOpenHelper
- 25. 如何在方向更改時處理佈局更改?
- 26. Android在deviceanywhere上更改方向
- 27. 方向改變和手動處理ConfingurationChanges在android
- 28. GWT Mvp和處理程序
- 29. 更改方向ANDROID
- 30. 在android中更改方向
感謝您的幫助。但是它可能保存像Observable一樣的定時器,例如Bundle? – MobileDev