RxAndroid로 화면 보호기 만들기
RxJava+RxAnroid의 경우
예를 들어 화면에
EditBox
와 Button
가 있는데'문자열의 입력'과'단추가 눌렸는지'를 감시하고 만약에 조작이 없으면××라고 적었을 때 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에 잠기세요!
Reference
이 문제에 관하여(RxAndroid로 화면 보호기 만들기), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://qiita.com/amay077/items/9d169ff3493e827762bc텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)