RxAndroid로 화면 보호기 만들기

13601 단어 AndroidRxJavaRxAndroid
예를 들어 ◯초를 조작하지 않으면 경로 잠금 화면 같은 것을 표시한다.일반적으로 타이머를 사용하면 번거로움을 느낄 수 있지만 RxJavaRxAndroid를 사용하면 간단하다.

RxJava+RxAnroid의 경우


예를 들어 화면에 EditBoxButton가 있는데'문자열의 입력'과'단추가 눌렸는지'를 감시하고 만약에 조작이 없으면××라고 적었을 때 RxJava+RxAndroid에 다음과 같은 내용을 쓸 수 있다.
MyActivity.java
public class MyActivity extends Activity {
    private static final String TAG = "MyActivity";
    private Subscription _subscription;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_my);

        final EditText editName = (EditText)findViewById(R.id.editName);
        final View buttonOk = findViewById(R.id.buttonOk);

        // OnTextChangeEvent や OnClickEvent をただの Void シグナルに変換
        final Func1<Object, Void> signalizer = new Func1<Object, Void>() {
            @Override
            public Void call(Object onClickEvent) {
                return null;
            }
        };

        // 文字入力イベントのストリームと…
        _subscription = ViewObservable.text(editName).map(signalizer)
                // ボタン押されたのストリームを合体
                .mergeWith(ViewObservable.clicks(buttonOk).map(signalizer))
                // 3秒間なんもなかったらエラーにする
                .timeout(3, TimeUnit.SECONDS)
                .subscribe(new Action1<Void>() {
                    @Override
                    public void call(Void dummy) {
                        // 何かアクションがあったらこっち
                        Log.d(TAG, "文字が入力されたか、ボタンが押されたよ");
                    }
                }, new Action1<Throwable>() {
                    @Override
                    public void call(Throwable throwable) {
                        // 3秒間何もなかったらこっち
                        runOnUiThread(new Runnable() {
                            @Override
                            public void run() {
                                Toast.makeText(MyActivity.this, 
                                    "3秒間何も操作がありませんでした", Toast.LENGTH_SHORT)
                                    .show();
                            }
                        });
                    }
                });
    }

    @Override
    protected void onDestroy() {
        // イベント系は無限ストリームだから開放してやらないとリークするはず
        _subscription.unsubscribe();
        super.onDestroy();
    }
}
ViewObservable.text(editName)는 텍스트를 입력할 때마다 신호를 보내는 흐름이고, ViewObservable.clicks(buttonOk) 단추를 눌렀을 때마다 신호를 보내는 흐름이다.그것들mergeWith을 합병하다.
나머지는 연결 timeout 에 불과하다.3초 안에 신호등이 있으면 온넥스트→new Action<Void>()곳, 3초 이상 조작이 없으면 시간을 초과해 온에로→new Action<Throwable>()곳으로 날아간다.이후 자유롭게 선택하십시오. 여기는 Toast만 표시됩니다.
주의, 사건이 발생하는 흐름은 무한하다. 즉, 존재하지 않는다onComplete.이렇게 Observable하면 반드시 스스로 구독을 취소해야 한다unsubscribe.
이거 움직이면 이렇게 되는 느낌.

Xamarin.안드로이드+Rx 본가의 경우


그럼 저는 Xamarin입니다.Xamarin 에서는 본사 Reactive Extensions 를 사용할 수 있습니다.Rx 안드로이드와 같은 일을 하면 아래처럼 똑똑하게 쓸 수 있어요.
MainActivity.cs
[Activity(Label = "RxJavaSample", MainLauncher = true, Icon = "@drawable/icon")]
public class MainActivity : Activity
{
    protected override void OnCreate(Bundle bundle)
    {
        base.OnCreate(bundle);

        // Set our view from the "main" layout resource
        SetContentView(Resource.Layout.Main);

        var editName = FindViewById<EditText>(Resource.Id.editName);
        var buttonOk = FindViewById<Button>(Resource.Id.buttonOk);

        Observable.FromEventPattern<TextChangedEventArgs>(editName, "TextChanged").Select(_=>true)
            .Merge(Observable.FromEventPattern(buttonOk, "Click").Select(_=>true))
            .Timeout(TimeSpan.FromSeconds(3))
            .Subscribe(_ => {} , 
            e => RunOnUiThread(() => Toast.MakeText(this, 
                "3秒間何も操作がありませんでした", ToastLength.Short).Show()));
    }
}

총결산


Reactive Extensions를 사용하면 UI 이벤트를 흐름으로 변환하여 작성, 가공, 필터링 등 다양한 애플리케이션을 사용할 수 있습니다.하지만 이것은 Rx의 힘의 절반이다.반면 웹API, DB 등 모델로부터의 응답도 유동화할 수 있다.둘 다 Observable이면 나중에 연결하면 프로그램이 완성됩니다!
그럼 다 같이 Rx에 잠기세요!

좋은 웹페이지 즐겨찾기