如果我像这样检索单个联系人:
private void pickContact() {
Intent pickContactIntent = new Intent(Intent.ACTION_PICK, Uri.parse("content://contacts"));
pickContactIntent.setType(Phone.CONTENT_TYPE);
startActivityForResult(pickContactIntent, PICK_CONTACT_REQUEST);
}
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
if (requestCode == PICK_CONTACT_REQUEST) {
if (resultCode == RESULT_OK) {
Uri contactUri = data.getData();
String[] projection = {Phone.NUMBER};
Cursor cursor = getContentResolver()
.query(contactUri, projection, null, null, null);
cursor.moveToFirst();
int column = cursor.getColumnIndex(Phone.NUMBER);
String number = cursor.getString(column);
}
}
}
我如何使用RxJava? RxJava会以任何方式改善这一点吗?
答案 0 :(得分:0)
是的,您可以这样做,使用PublishSubject。
PublishSubject<Contact> contactPipe = PublishSubject.create();
当您有另一个联系人时,请致电contactPipe.onNext(newContact);
要使用contactPipe.asObservable.subscribeOn(Schedulers.computation);
代码中的另一个问题 - 在主线程上使用db进行长时间操作。 要解决这个问题,请使用
Observable.defer(()-> Observable.just(contactUri))
.subscribeOn(Schedulers.io())
.map(t -> {
Contact c = getContactFromDb(contactUri);
return c;
}
// you can hand new contact directly, because PublishSubject implement Subscriber
.subscribe(contactPipe);