2017-12-08 22 views
0

電話連絡先リストデータベースから連絡先を取得する必要があります。ユーザーがたくさんの連絡先を読み込んでいる場合、何も表示されず、何も表示されず、何も表示されません。私はそれをRxで分割して、一度に20の連絡先をロードしたいが、遅延読み込みではなく、開始時にすべての連絡先を読み込む。この時点で私はconcatとobservablesの引っ張りでそれを試したが、すべての結果を収集し、それらを取得した後、直後に連絡先の次のパックを続行するごとに20の連絡先を返す代わりにすべてを終了した後に戻ります。この実装で何が問題になっていますか?Rxjava分割連絡先

@Override public Observable<List<Contact>> getPhoneContacts() { 
    return Observable.fromCallable(this::getCursor) 
     .concatMap(cursor -> { 
      List<Observable<List<Contact>>> list = new ArrayList<>(); 
      int pagesCount = cursor.getCount()/20 + 1; 
      for(int i = 0; i < pagesCount; i++){ 
      list.add(Observable.just(getContactList(cursor))); 
      } 
      return Observable.concat(list).compose(upstream -> { 
      cursor.close(); 
      return upstream; 
      }); 
     }); 
    } 

    private List<Contact> getContactList(Cursor cursor) { 
    List<Contact> contacts = new ArrayList<>(); 
    if (cursor != null && !cursor.isClosed() && areContactsPresent(cursor)) { 
     while (contacts.size() < 20){ 
     if (cursor.moveToNext()) { 
      String id = cursor.getString(cursor.getColumnIndex(ContactsContract.Contacts._ID)); 
      Contact contact = getContact(cursor, id); 
      if (contact != null) { 
       contacts.add(contact); 
      } 

     } 
     //else { 
     // cursor.close(); 
     // break; 
     //} 
     } 
    } 
    return contacts; 
    } 

    private Cursor getCursor(){ 
    return contentResolver.query(ContactsContract.Contacts.CONTENT_URI, 
     null, ContactsContract.Data.HAS_PHONE_NUMBER+">0", null, ContactsContract.Contacts.DISPLAY_NAME + " ASC"); 
    } 

    private Contact getContact(Cursor cursor, String id) { 
    Contact contact = null; 
    Cursor phonesCursor = contentResolver.query(
     ContactsContract.CommonDataKinds.Phone.CONTENT_URI, 
     null, 
     ContactsContract.CommonDataKinds.Phone.CONTACT_ID + " = ?", 
     new String[]{id}, null); 
    if (phonesCursor != null) { 
     while (phonesCursor.moveToNext()) { 
     String name = cursor.getString(cursor.getColumnIndex(
      ContactsContract.Contacts.DISPLAY_NAME)); 
     String phoneNo = phonesCursor.getString(
      phonesCursor.getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER)); 
     if (!phoneNo.isEmpty()) { 
      contact = Contact.create(name, phoneNo); 
     } 
     } 
     phonesCursor.close(); 
    } 
    return contact; 
    } 

答えて

0

あなたの元に観察ニーズは今、代わりに各発光が連絡先のリストを提供します意味単一ContactList<Contact>、各リストを返すこと

Observable.create((ObservableOnSubscribe<List<Contact>>) emitter -> { 
    int pagesCount = cursor.getCount()/20 + 1; 
    for(int i = 0; i < pagesCount; i++){ 
     emitter.onNext(getContactList(cursor)); // Passes list with 20 items to onNext() 
    } 
    emitter.onComplete(); 
}); 

あなたのデータソースのようなものを見て実装ごとに20項目あります。

次に、すべての連絡先が読み込まれるのを待つ代わりに、各発信でUIを更新できます。