0

I'm trying to load messages from database but consistently getting IllegalArgumentException, my data source looks like this

@Override
public void loadInitial(@NonNull LoadInitialParams params, @NonNull LoadInitialCallback<ConversationMessage> callback) {
    long start = System.currentTimeMillis();

    MmsSmsDatabase db = DatabaseFactory.getMmsSmsDatabase(context);
    List<MessageRecord> records = new ArrayList<>();
    int totalCount = db.getConversationCount();
    int effectiveCount = params.requestedStartPosition;


    try (MmsSmsDatabase.Reader reader = db.readerFor(db.getConversationForCalls(threadId, params.requestedStartPosition, params.requestedLoadSize))) {
        MessageRecord record;
        while ((record = reader.getNext()) != null && effectiveCount < totalCount && !isInvalid()) {
            records.add(record);
            effectiveCount++;
        }
    }


    SizeFixResult<MessageRecord> result = SizeFixResult.ensureMultipleOfPageSize(records, params.requestedStartPosition, params.pageSize, totalCount);

    List<ConversationMessage> items = Stream.of(result.getItems())
            .map(ConversationMessageFactory::createWithResolvedData)
            .toList();

    callback.onResult(items, params.requestedStartPosition, result.getTotal());
    Log.d(TAG, "[Initial Load]  effectiveCount: " + effectiveCount + ", totalCount: " + totalCount );
    Log.d(TAG, "[Initial Load] " + (System.currentTimeMillis() - start) + " ms | thread: " + threadId + ", start: " + params.requestedStartPosition + ", requestedSize: " + params.requestedLoadSize + ", actualSize: " + result.getItems().size() + ", totalCount: " + result.getTotal());

}

@Override
public void loadRange(@NonNull LoadRangeParams params, @NonNull LoadRangeCallback<ConversationMessage> callback) {
    long start = System.currentTimeMillis();

    MmsSmsDatabase db = DatabaseFactory.getMmsSmsDatabase(context);
    List<MessageRecord> records = new ArrayList<>(params.loadSize);
    Log.d(TAG, "[Update] " + (System.currentTimeMillis() - start) + " ms | thread: " + threadId + ", start: " + params.startPosition + ", size: "+ params.loadSize);

    try (MmsSmsDatabase.Reader reader = db.readerFor(db.getConversationForCalls(threadId, params.startPosition, params.loadSize))) {
        MessageRecord record;
        while ((record = reader.getNext()) != null && !isInvalid()) {
            records.add(record);
        }
    }

    List<ConversationMessage> items = Stream.of(records)
            .map(ConversationMessageFactory::createWithResolvedData)
            .toList();
    callback.onResult(items);

}

Initial page load corrctly but when I'm scrollling, I'm facing java.lang.IllegalArgumentException: page introduces incorrect tiling at androidx.paging.PagedStorage.insertPage(PagedStorage.java:545)

My page configuration look like this

DataSource.Factory<Integer, ConversationMessage> factory = new CallsDataSource.Factory(context, -1, invalidator);
    PagedList.Config config = new PagedList.Config.Builder()
            .setPageSize(15)
            .setInitialLoadSizeHint(30)
            .build();
    this.messages = new LivePagedListBuilder<>(factory, config).setFetchExecutor(CallsDataSource.EXECUTOR)
            .setInitialLoadKey(0)
            .build();
Muhammad Nadeem
  • 211
  • 2
  • 14

0 Answers0