2016-11-19 2 views
0

Wenn ich einen einzigen Kontakt wie so Abrufen:Wie würden Sie RxJava verwenden, um Kontakte abzurufen?

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

     } 
    } 
} 

Wie würde ich es tun mit RxJava? Würde RxJava das irgendwie verbessern?

Antwort

0

Ja, Sie können dies tun, verwenden Sie PublishSubject dafür.

PublishSubject<Contact> contactPipe = PublishSubject.create(); 

Wenn Sie einen anderen Kontakt haben, rufen Sie contactPipe.onNext (newContact); Zugriff auf Quelle von Kontakten contactPipe.asObservable.subscribeOn(Schedulers.computation);

Ein weiteres Problem in Ihrem Code verwenden - langen Betrieb mit db auf Hauptthread. Um das zu lösen, verwenden Sie

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

Hey, ich finde das verwirrend. Du übergibst 'ContactUri' an 'Observable.just() ', kannst du bitte erläutern, was hier vor sich geht? Ist dies nach dem Abrufen der Daten aus der Absicht? Muss ich auf den Rückruf von onActivityResult warten, um das auszuführen? – syfy

+0

In der Regel Benutzer von RX-Pipeline einmal erstellt. Der Operator Observable.defer() teilt rxJava mit, dass bei jedem Aufruf dieses Operators eine neue Pipeline erstellt wird. Es nimmt Ihre URI (rufen Sie dies in onActivityResult), schaltet die Ausführung auf Hintergrund Thread (.subscribeOn() -Operator), und wandelt dann diese uri in "ein Ergebnis" - Sie erhalten Ihren tatsächlichen Kontakt aus der Datenbank (Sie taten das in. OnActivityResult) , weil es langsame Operation ist und nicht auf dem Hauptthread getan werden sollte. –

+0

Nachdem der Kontakt vom Datenbankoperator (.map() abgefragt wurde, wird er an die Methode PublishSubject (by .subscribe()) übergeben. –

Verwandte Themen