Posted at

Applicationクラスを使ってObserverパターンを実装する

More than 5 years have passed since last update.

Observerパターンは、オブジェクトの状態を観測(observe)して、何か変更があったら任意の動作をするデザインパターンの一つです。

Androidではデータの変更を観測するのにContentObserverが用意されています。

この記事では独自のObserverパターンをApplicationクラスを使って実装します。

使い道はContentProviderを使ってない時のデータ変更の観測とか、アプリ内の設定変更の観測とかに使えると思います。

まずは独自のObserverインタフェースを実装します。


Observer.java

public interface Observer {

void notify();
}

次にApplicationクラスを継承して独自のMyAppクラスを作ります。

MyAppのstatic変数を使うことで、アクティビティのライフサイクルに影響を受けずに値を保持し続けることができます。

またstaticメソッドを用意することで、アプリ内のどこからでもアクセスすることができます。


MyApp.java

public class MyApp extends Application {

private static List<Observer> sObservers = new CopyOnWriteArrayList<Observer>();

public static void notifyObservers() {
for (Observer observer : Observers) {
observer.notify();
}
}

public static void addObserver(Observer observer) {
sObservers.add(observer);
}

public static void removeObserver(Observer observer) {
sObservers.remove(observer);
}
}


CopyOnWriteArrayListは同期化不要なリストです。

同期化不要なCopyOnWriteArrayListを使えの記事が詳しいです。

次に、変更したときを観測して任意の処理をしたいActivityやFragmemtでObserverを実装します。

ライフサイクルメソッドのonResumeやonPauseでObserverの登録、削除をしています。


MyActivity.java

public class MyActivity extends Activity {

private Observer mObserver = new Observer() {
@Override
public void notify() {
// Viewの更新などの任意の動作
}
};

@Override
protected void onResume() {
super.onResume();

// Observerの登録
MyApp.addObserver(mObserver);
}

@Override
protected void onPause() {
super.onPause();

// Observerの削除
MyApp.removeObserver(mObserver);
}
}


後はデータの変更や、設定の変更をしたときに

MyApp.notifyObservers()

を呼べば、任意の処理が走ります。