你会如何使用RxJava来检索联系人?

时间:2016-11-19 10:54:12

标签: java android rx-java

如果我像这样检索单个联系人:

    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会以任何方式改善这一点吗?

1 个答案:

答案 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);