Fixed
Status Update
Comments
ng...@gmail.com <ng...@gmail.com> #2
Hi,
This looks really bad but w/o a repro app, we really cannot do anything about it. Is it possible for you to provide a sample app that reproduces your problem ?
This looks really bad but w/o a repro app, we really cannot do anything about it. Is it possible for you to provide a sample app that reproduces your problem ?
fl...@google.com <fl...@google.com>
yb...@google.com <yb...@google.com> #3
Attached is a simple testing app. It inserts 10000 items into the db when activity starts and then displays them using paging. The db is also updated every 1 second. On the screen, if you drag the fast scroll bar up and down quickly a few times, it will eventually crash with this IndexOutOfBoundsException error.
th...@gmail.com <th...@gmail.com> #4
Thanks for the great repro case, tracked it down, investigating a fix.
Problematic behavior:
1) AsyncPagedListDiffer receives new list, takes snapshot for diffing (ui thread)
2) At roughly the same time:
2a) Diff snapshot of old snapshot vs new snapshot (bg thread)
2b) New data arrives in new list, way earlier in the list, so the list is essentially: new page, lots of empty pages, initial load
3) AsyncPagedListDiffer updates lastLoad position with diffutil position mapping
In 3, we try to map the lastLoad position from old snapshot to new snapshot, but fail to distinguish between new list vs new snapshot. Because of all the empty pages, that's a huge discrepancy. This is why the huge scrollbar + lots of swaps triggers this well - there are lots of swaps to new PagedLists while loads are happening very far away from initial load positions.
Will need to account for pages loaded in between time of snapshot, and time of swap.
Problematic behavior:
1) AsyncPagedListDiffer receives new list, takes snapshot for diffing (ui thread)
2) At roughly the same time:
2a) Diff snapshot of old snapshot vs new snapshot (bg thread)
2b) New data arrives in new list, way earlier in the list, so the list is essentially: new page, lots of empty pages, initial load
3) AsyncPagedListDiffer updates lastLoad position with diffutil position mapping
In 3, we try to map the lastLoad position from old snapshot to new snapshot, but fail to distinguish between new list vs new snapshot. Because of all the empty pages, that's a huge discrepancy. This is why the huge scrollbar + lots of swaps triggers this well - there are lots of swaps to new PagedLists while loads are happening very far away from initial load positions.
Will need to account for pages loaded in between time of snapshot, and time of swap.
fl...@google.com <fl...@google.com> #5
ng...@gmail.com <ng...@gmail.com> #6
Awesome! Can not wait for the fix to drop.
ap...@google.com <ap...@google.com> #7
I saw a new WorkManager version was dropped today but no new paging. Any ideas when this fix will be released? Days or weeks? Thanks.
fl...@google.com <fl...@google.com> #8
no promises but it is already scheduled so should be days hopefully.
da...@google.com <da...@google.com> #9
Released with Paging 2.0.0
Description
Version used: 2.1.0-alpha01
Devices/Android versions reproduced on: Nexus 5 (Android 6.0.1) and Emulator (Android 8)
Android Studio 3.3 Canary 13
I create this DAO
import androidx.room.*
import dominando.android.data_room.entity.Book
import io.reactivex.Completable
import io.reactivex.Flowable
import io.reactivex.Maybe
@Dao
interface BookDao {
@Insert(onConflict = OnConflictStrategy.REPLACE)
fun save(book: Book): Completable
@Delete
fun delete(vararg book: Book): Completable
@Query("SELECT * FROM Book WHERE title LIKE :title ORDER BY title")
fun bookByTitle(title: String = "%"): Flowable<List<Book>>
@Query("SELECT * FROM Book WHERE id = :id")
fun bookById(id: String): Maybe<Book>
}
But compilation fails with this error.
error: local variable book is accessed from within inner class; needs to be declared final
When I look to the generated code, this is it.
@Override
public Completable save(Book book) {
return Completable.fromCallable(new Callable() {
@Override
public Void call() throws Exception {
__db.beginTransaction();
try {
__insertionAdapterOfBook.insert(book);
__db.setTransactionSuccessful();
return null;
} finally {
__db.endTransaction();
}
}
});
}
As you can see, book parameter is not marked as final and cannot be accessed inside of Completable.fromCallable.