2015年6月12日金曜日

SharedPrefenreces の値変更 + RxAndroid で状態の変更を
バックグラウンドのActivityに伝える

前回のエントリ「状態の変更をバックグラウンドのActivityに伝える方法はどれがいいんだろう?」の 3) を RxAndroid を使って実装してみました。

onStart() で値をチェックするのではなく、SharedPreferences の値が true になったイベントと起動時の処理を同じストリームになるようにしてみました。
  1. public class MainActivity extends Activity {  
  2.   
  3.     @InjectView(R.id.list)  
  4.     ListView listView;  
  5.   
  6.     private Subscription subscription = Subscriptions.empty();  
  7.   
  8.     private static final String FAVORITE_PREF_KEY = "favorite_changed";  
  9.   
  10.     @Override  
  11.     protected void onCreate(Bundle savedInstanceState) {  
  12.         super.onCreate(savedInstanceState);  
  13.         setContentView(R.layout.activity_main);  
  14.         ButterKnife.inject(this);  
  15.   
  16.         final SharedPreferences pref = getSharedPreferences("reload_flag", MODE_PRIVATE);  
  17.   
  18.         final Observable<List<String>> observable = ContentObservable.fromSharedPreferencesChanges(pref)  
  19.                 .filter(new Func1<String, Boolean>() {  
  20.                     @Override  
  21.                     public Boolean call(String prefKey) {  
  22.                         return FAVORITE_PREF_KEY.equals(prefKey) && pref.getBoolean(prefKey, false);  
  23.                     }  
  24.                 })  
  25.                 .startWith(FAVORITE_PREF_KEY)  
  26.                 .flatMap(new Func1<String, Observable<List<String>>>() {  
  27.                     @Override  
  28.                     public Observable<List<String>> call(String s) {  
  29.                         return Observable.create(new Observable.OnSubscribe<List<String>>() {  
  30.                             @Override  
  31.                             public void call(Subscriber<? super List<String>> subscriber) {  
  32.                                 try {  
  33.                                     subscriber.onNext(getDataFromServer());  
  34.                                 } catch (Exception e) {  
  35.                                     subscriber.onError(e);  
  36.                                 }  
  37.                             }  
  38.                         }).subscribeOn(Schedulers.newThread());  
  39.                     }  
  40.                 });  
  41.   
  42.         subscription = AppObservable.bindActivity(this, observable)  
  43.                 .subscribe(new Subscriber<List<String>>() {  
  44.                     @Override  
  45.                     public void onCompleted() {  
  46.                     }  
  47.   
  48.                     @Override  
  49.                     public void onError(Throwable e) {  
  50.                         e.printStackTrace();  
  51.                         pref.edit().putBoolean(FAVORITE_PREF_KEY, false).apply();  
  52.                     }  
  53.   
  54.                     @Override  
  55.                     public void onNext(List<String> data) {  
  56.                         listView.setAdapter(new ArrayAdapter<>(MainActivity.this,  
  57.                                 android.R.layout.simple_list_item_1, data));  
  58.                         pref.edit().putBoolean(FAVORITE_PREF_KEY, false).apply();  
  59.                     }  
  60.                 });  
  61.     }  
  62.   
  63.     private List<String> getDataFromServer() throws Exception {  
  64.         // mock  
  65.         Thread.sleep(1000);  
  66.   
  67.         final Calendar c = Calendar.getInstance();  
  68.   
  69.         List<String> data = new ArrayList<>();  
  70.         for (int i = 0; i < 20; i++) {  
  71.             data.add(i + " : " + DateFormat.format("hh時mm分ss秒", c));  
  72.         }  
  73.         return data;  
  74.     }  
  75.   
  76.     @Override  
  77.     protected void onDestroy() {  
  78.         subscription.unsubscribe();  
  79.         super.onDestroy();  
  80.     }  
  81.   
  82.     @OnItemClick(R.id.list)  
  83.     void onItemClick(int position) {  
  84.         Intent intent = new Intent(this, SubActivity.class);  
  85.         startActivity(intent);  
  86.     }  
  87. }  
  1. public class SubActivity extends Activity {  
  2.   
  3.     @Override  
  4.     protected void onCreate(Bundle savedInstanceState) {  
  5.         super.onCreate(savedInstanceState);  
  6.         setContentView(R.layout.activity_sub);  
  7.         ButterKnife.inject(this);  
  8.     }  
  9.   
  10.     @OnClick(R.id.favorite_button)  
  11.     void onFavoriteButtonClicked() {  
  12.         // サーバー通信とかして、状態を変更できたとする  
  13.   
  14.         final SharedPreferences pref = getSharedPreferences("reload_flag", MODE_PRIVATE);  
  15.         pref.edit().putBoolean("favorite_changed"true).apply();  
  16.     }  
  17. }  


SubActivity でボタンをクリックすると、MainActivity でリロードが走ります。



0 件のコメント:

コメントを投稿