2011-08-22 47 views
6

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

Trả lời

1

Điều bạn gọi là 'Trình quản lý tải' thực sự là triển khai giao diện LoaderManager.LoaderCallbacks<D>. Bạn có thể muốn sử dụng một tên khác, cái này khó hiểu. Tại sao nó là một singleton? Nó thường được gắn với một Activity hoặc Fragment, có thể chỉ là Activity/Fragment thực hiện giao diện. Bạn đang tạo Loaders ở đâu (hoạt động/phân đoạn)? Ngoài ra, hãy đảm bảo bạn gọi LoaderManager.initLoader() từ onCreate()/onActivityCreated(), nếu không trình tải có thể không được khởi động đúng cách.

+0

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

+0

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ù. –

+0

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

0

Khi bạn tạo một con trỏ và trỏ nó tại một cơ sở dữ liệu, bạn không thể đặt nó thành null. Bạn phải đóng con trỏ một cách rõ ràng, hoặc nó sẽ khóa cơ sở dữ liệu cho đến khi nó hết giờ.

Tôi khuyên bạn nên tận dụng vòng đời Android và các cuộc gọi lại hiện có của bạn để triển khai sửa lỗi này.

Hy vọng điều này sẽ hữu ích!

+0

Tốt bắt - đó phải là changeCursor() không swapCursor() - Tôi đã thay đổi rằng bây giờ – Pikaling

+0

là bạn vẫn còn có những vấn đề tương tự? – Codeman

+0

Không, tôi đã cố khắc phục và làm cho nó tồi tệ hơn! Luôn luôn cách ... – Pikaling

Các vấn đề liên quan