LoginSignup
69
71

More than 5 years have passed since last update.

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

Posted at

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()

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

69
71
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
69
71