ush109rockのブログ

主にiOS/Androidの情報を発信していきます。

独自リスナーの作り方

はじめに

あるクラスで処理を行ってその結果をActivityや別クラスに通知したい場合、どのようにすればよいか。 本記事では、独自でリスナーを作り、それを特定のクラスで受け取る例を書いていきます。

リスナーとは

あるイベントが発生してくれたことを通知してくれるもの。

登場人物

  • リスナー
    イベント発生通知をしてくれる。

  • インターフェース
    イベントの通知元と通知先の仲介役。基本的にインターフェースを通して通知先に通知する。

  • レシーバー
    イベントを受け取る。

具体例

Calculation

public class CalculationListener {

    private ResultInterface listener;

    public Calculation(ResultInterface listener) {
        this.listener = listener;
    }

    public void calc(int a, int b) {
        int sum = a + b;
        this.listener.result(sum);
    }
}

ResultInterface

public interface ResultInterface {
    void result(int sum);
}

MainActivity

public class MainActivity extends AppCompatActivity implements ResultInterface {
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        Calculation obj = new CalculationListener(this);
        obj.calc(10,20);
    }

    @Override
    public void result(int sum) {
        String msg = String.valueOf(sum);
        Log.d("MainActivity", msg);
    }
}

もしくは

public class MainActivity extends AppCompatActivity {
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        Calculation obj = new CalculationListener(new ResultInterface() {
            @Override
            public void result(int sum) {
                String msg = String.valueOf(sum);
                Log.d("MainActivity", msg);
            }
        });
        obj.calc(10,20);
    }
}

結果

MainActivity: 30

解説

上記コードにおける、登場人物。

  • リスナー → CalculationListener
  • インターフェース → ResultInterface
  • レシーバー → MainActivity

ポイント

  1. CalculationListenerオブジェクト生成時、リスナー(CalculationListener)に通知先(MainActivity)を教えておく
  2. CalculationListenerで計算したあと、インタフェースを通して通知先に計算結果を教えてくれる。

まとめ

MainActivityを自分自身だとすると、
自分の連絡先を警察に教えておき、財布がみつかったら教えた連絡先に電話してください。 のような感じ。