2016-11-19 2 views
0

내가 지금과 같은 단일 접촉 검색 해요 경우 : 나는 RxJava를 사용 할 것 어떻게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가 어떤 식 으로든 이것을 향상시킬 수 있습니까?

답변

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를 'some result'로 변환합니다 - 데이터베이스에서 실제 연락처를 가져옵니다 (.onActivityResult에서 수행했습니다) 왜냐하면 이것은 느린 동작이고 메인 스레드가 아닌 동작이어야하기 때문이다. –

+0

데이터베이스 (.map() 연산자에서 쿼리 한 후 PublishSubject (.subscribe() 메서드로 전달) –

관련 문제