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