Tôi đang gặp một số vấn đề với AsyncTaskLoader của mình, không chắc chắn chúng có liên quan như chúng vừa xảy ra khi cố gắng khởi động lại Trình tải. Trong ứng dụng của tôi, tôi có 3 trường hợp của một CursorAdapter tùy chỉnh, được hỗ trợ bởi 3 trường hợp của một AsyncTaskLoader tùy chỉnh được quản lý bởi 1 singleton LoaderManager. Những vấn đề liên quan đến hai cặp Adaptor/Loader differenct, nhưng mã được sử dụng là như nhau trong mỗi trường hợp:Rắc rối với các cuộc gọi lại AsyncTaskLoader tùy chỉnh
getLoaderManager().restartLoader(loaderId, bundle, loaderManager);
Vấn đề 1: Tôi gọi restartLoader() và LoaderManager đăng ký một cuộc gọi đến onCreateLoader, nhưng không phải là người onLoaderReset(). Trình tải được phân phốiResult(), nhưng onLoadFinished() không bao giờ được gọi. Trình tải không có cờ 'đặt lại' hoặc 'bắt đầu' được đặt (xem mã bên dưới).
Vấn đề 2: Tôi gọi restartLoader() và LoaderManager đăng ký cuộc gọi đến onLoaderReset(). Trình tải lên đến onReset(), nhưng không nhận thêm bất kỳ thứ gì. Con trỏ được đặt thành null, nhưng không có Con trỏ mới nào được tải.
Bất kỳ ý tưởng nào về sự cố có thể là gì? Dưới đây là một số mã cho Loader và Loader Manager:
CustomCursorLoader.java
@Override
protected void onStartLoading() {
Log.v(TAG, "Starting Loader");
if (lastCursor != null) {
deliverResult(lastCursor);
}
if (takeContentChanged() || lastCursor == null) {
forceLoad();
}
}
@Override
public void deliverResult(Cursor cursor) {
Log.v(TAG, "Delivering result");
if (isReset()) {
Log.v(TAG, "reset");
if (cursor != null) {
cursor.close();
}
return;
}
Cursor oldCursor = lastCursor;
lastCursor = cursor;
if (isStarted()) {
Log.v(TAG, "started");
super.deliverResult(cursor);
}
if (oldCursor != null && oldCursor != cursor && !oldCursor.isClosed()) {
oldCursor.close();
}
}
@Override
protected void onReset() {
Log.v(TAG, "Reset");
super.onReset();
onStopLoading();
if (lastCursor != null && !lastCursor.isClosed()) {
lastCursor.close();
}
lastCursor = null;
}
CustomCursorLoaderManager.java:
@Override
public Loader<Cursor> onCreateLoader(int loaderId, Bundle bundle) {
return new CustomCursorLoader();
}
@Override
public void onLoadFinished(Loader<Cursor> loader, Cursor cursor) {
cursorAdapter.changeCursor(cursor);
}
@Override
public void onLoaderReset(Loader<Cursor> loader) {
cursorAdapter.changeCursor(null);
}
1. Vâng, tôi biết tên không rõ ràng, xin lỗi. 2. Nó không phải là một singleton nữa - được làm việc trên phần đó 3. Vấn đề chính tôi đang có là tôi muốn có thể sử dụng cùng một con trỏ với cùng một Loader trong các mảnh khác nhau gắn liền với hoạt động khác nhau – Pikaling
Bạn có muốn chia sẻ con trỏ? Đó có thể không phải là một ý kiến hay: các trình tải được quản lý bởi các hoạt động/phân đoạn, do đó trình tải của bạn có thể bị đóng khi một hoạt động khác kết thúc. Bạn có thể sử dụng cùng một Loader _class_ và có nó instantiated trong các hoạt động khác nhau/fragments mặc dù. –
Cảm ơn sự giúp đỡ của bạn. Tôi đã đi qua và làm lại tất cả các mã của tôi, tất cả làm việc ngay bây giờ. Đôi khi tôi ghét OOP ... – Pikaling