2016-11-19 21 views
0

如果我檢索像這樣一個聯繫人:你會如何使用RxJava來檢索聯繫人?

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

是的,你可以這樣做,使用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); 
+0

嘿,我覺得這很容易混淆。您將'ContactUri'傳遞給'Observable.just()',請您詳細說明這裏發生了什麼?這是從意圖檢索數據後?我是否必須等待onActivityResult的回調才能執行此操作? – syfy

+0

通常rx管道的操作者創建一次。 Observable.defer()運算符告訴rxJava每次調用該運算符時創建新的管道。它需要你的URI(在onActivityResult中調用它),將執行切換到後臺線程(.subscribeOn()運算符),然後將該uri轉換爲'某個結果' - 從數據庫中獲得實際聯繫人(你在.onActivityResult中實現了這種聯繫) ,因爲它運行緩慢,應該不在主線程中完成。 –

+0

從數據庫(.map()運算符查詢聯繫人後,它將發送到PublishSubject(通過.subscribe()方法) –

相關問題