onStart() で値をチェックするのではなく、SharedPreferences の値が true になったイベントと起動時の処理を同じストリームになるようにしてみました。
- public class MainActivity extends Activity {
- @InjectView(R.id.list)
- ListView listView;
- private Subscription subscription = Subscriptions.empty();
- private static final String FAVORITE_PREF_KEY = "favorite_changed";
- @Override
- protected void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
- setContentView(R.layout.activity_main);
- ButterKnife.inject(this);
- final SharedPreferences pref = getSharedPreferences("reload_flag", MODE_PRIVATE);
- final Observable<List<String>> observable = ContentObservable.fromSharedPreferencesChanges(pref)
- .filter(new Func1<String, Boolean>() {
- @Override
- public Boolean call(String prefKey) {
- return FAVORITE_PREF_KEY.equals(prefKey) && pref.getBoolean(prefKey, false);
- }
- })
- .startWith(FAVORITE_PREF_KEY)
- .flatMap(new Func1<String, Observable<List<String>>>() {
- @Override
- public Observable<List<String>> call(String s) {
- return Observable.create(new Observable.OnSubscribe<List<String>>() {
- @Override
- public void call(Subscriber<? super List<String>> subscriber) {
- try {
- subscriber.onNext(getDataFromServer());
- } catch (Exception e) {
- subscriber.onError(e);
- }
- }
- }).subscribeOn(Schedulers.newThread());
- }
- });
- subscription = AppObservable.bindActivity(this, observable)
- .subscribe(new Subscriber<List<String>>() {
- @Override
- public void onCompleted() {
- }
- @Override
- public void onError(Throwable e) {
- e.printStackTrace();
- pref.edit().putBoolean(FAVORITE_PREF_KEY, false).apply();
- }
- @Override
- public void onNext(List<String> data) {
- listView.setAdapter(new ArrayAdapter<>(MainActivity.this,
- android.R.layout.simple_list_item_1, data));
- pref.edit().putBoolean(FAVORITE_PREF_KEY, false).apply();
- }
- });
- }
- private List<String> getDataFromServer() throws Exception {
- // mock
- Thread.sleep(1000);
- final Calendar c = Calendar.getInstance();
- List<String> data = new ArrayList<>();
- for (int i = 0; i < 20; i++) {
- data.add(i + " : " + DateFormat.format("hh時mm分ss秒", c));
- }
- return data;
- }
- @Override
- protected void onDestroy() {
- subscription.unsubscribe();
- super.onDestroy();
- }
- @OnItemClick(R.id.list)
- void onItemClick(int position) {
- Intent intent = new Intent(this, SubActivity.class);
- startActivity(intent);
- }
- }
- public class SubActivity extends Activity {
- @Override
- protected void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
- setContentView(R.layout.activity_sub);
- ButterKnife.inject(this);
- }
- @OnClick(R.id.favorite_button)
- void onFavoriteButtonClicked() {
- // サーバー通信とかして、状態を変更できたとする
- final SharedPreferences pref = getSharedPreferences("reload_flag", MODE_PRIVATE);
- pref.edit().putBoolean("favorite_changed", true).apply();
- }
- }
SubActivity でボタンをクリックすると、MainActivity でリロードが走ります。
0 件のコメント:
コメントを投稿