2016-11-19 16 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を使用してコードを長時間実行すると、別の問題が発生する可能性があります。 これを解決するには、

+0

ちょっと、わかりました。 ContactUriをObservable.just()に渡していますが、ここで何が起こっているのか詳しく教えてください。これは、インテントからデータを取得した後ですか?これを実行するには、onActivityResultのコールバックを待たなければなりませんか? – syfy

+0

通常、rxパイプラインのオペレータは一度作成されました。 Observable.defer()演算子は、この演算子が呼び出されるたびに新しいパイプラインを作成するようrxJavaに指示します。あなたのURI(onActivityResultでこれを呼び出す)を実行し、バックグラウンドスレッド(.subscribeOn()演算子)に実行を切り替え、そのuriを「何らかの結果」に変換する - データベースから実際の連絡先を取得する(あなたは.onActivityResultで行いました)なぜなら、それは動作が遅く、メインスレッドではなく実行されるべきであるからです。 –

+0

データベース(.map()演算子から問い合わせがあった後、PublishSubject(.subscribe()メソッドによって)に渡されます。 –

関連する問題