Androidにて独自イベントを取得する場合はListenerを作成するのが通例ですが
規模の大きいアプリだとListener(Callback)のパッケージが肥大化しがちです。
これをRxAndroidとRetrolambdaを利用することで解決できます。
一般的なケース
OnCustomListener.java
public interface OnCustomListener {
void onSuccess();
}
HogeView.java
public class HogeView extends View {
private OnCustomListener mListener;
public void setListener(OnCustomListener listener) {
this. mListener = listener;
}
public void hoge() {
// 何らかの処理
if (mListener != null) {
mListener.onSuccess();
}
}
}
MainActivity.java
public class MainActivity extends Activity implements OnCustomListener{
private HogeView mHogeView;
private void init() {
mHogeView.setListener(this);
}
@Override
public void onSuccess() {
Log.d(TAG, "onSuccess");
}
}
RxAndroidとRetrolambdaを併用したケース
HogeView.java
public class HogeView extends View {
private Action0 mListener;
public void setListener(Action0 listener) {
this. mListener = listener;
}
public void hoge() {
// 何らかの処理
if (mListener != null) {
mListener.call();
}
}
}
MainActivity.java
public class MainActivity extends Activity {
private HogeView mHogeView;
private void init() {
mHogeView.setListener(this::onSuccess);
/*
↓↓の省略した記述です↓↓
mHogeView.setListener(new Action{
@Override
public void call() {
onSuccess();
}
});
*/
}
private void onSuccess() {
Log.d(TAG, "onSuccess");
}
}
コードの長さはさほど変わっていませんが、interfaceの代わりを立派に務めてくれます。
RxAndroidとRetrolambdaを利用することでListenerクラスを減らすことができ、独自Viewから呼ばれる処理もprivate化することができます。
また、引数や返り値が欲しい場合はAction1やFuncなどを利用することで柔軟に対応可能です。
RxAndroidとRetrolambdaは本当に相性がいいですね!!