2013-04-15 41 views
5

Tôi đang gặp phải sự cố với Trình tải.Android - onLoadFinished không được gọi là

Tôi có Hoạt động, hiển thị danh sách các bản ghi được lấy từ DB địa phương. Khi hoạt động bắt đầu, các bản ghi sẽ tự động được tải thông qua phương thức LoaderManager.initLoader().

Cũng có khả năng làm mới danh sách theo cách thủ công thông qua nút làm mới trong ActionBarSherlock. Tuy nhiên, sau khi hoàn thành một hoạt động khác mà thêm một bản ghi vào DB, onLoadFinished không được gọi.

Tôi đang sử dụng SimpleCursorLoader và đây là đoạn mã từ hoạt động:

@Override 
public void onStart() { 
    ... 
    getSupportLoaderManager().initLoader(0, null, this); 
} 

@Override 
public void onPause() { 
    ... 
    getSupportLoaderManager().destroyLoader(0); 
} 

public void refreshRecords() { 
    getSupportLoaderManager().restartLoader(0, null, this); 
} 

@Override 
public Loader<Cursor> onCreateLoader(int id, final Bundle args) { 
Loader<Cursor> l = new SimpleCursorLoader(this) { 
    @Override 
    public Cursor loadInBackground() { 
     return recordDAO.getCursor(); 
    } 
}; 
l.forceLoad(); 
return l; 
} 

@Override 
public void onLoadFinished(Loader<Cursor> loader, Cursor c) { 
    // updateUI 
} 

@Override 
public void onLoaderReset(Loader<Cursor> loader) { 
} 

Vấn đề là sau khi kết thúc hoạt động khác, onLoaderCreate được gọi, nhưng onLoaderFinished không được gọi.

sau khi một số lỗi, tôi đã phát hiện ra rằng SimpleCursorAdapter.deliverResults() còn được gọi là, nụ kết thúc lên trên .. if (isReset()) { ..

Tôi có thiếu cái gì? Làm cách nào để buộc tải lại dữ liệu?

Cảm ơn bạn trước

Trả lời

14

tôi cuối cùng đã tìm thấy giải pháp cho vấn đề này nhờ vào các cuộc thảo luận trên

https://groups.google.com/forum/#!topic/android-developers/DbKL6PVyhLI

public static <T> void initLoader(final int loaderId, final Bundle args, final LoaderCallbacks<T> callbacks, 
     final LoaderManager loaderManager) { 
    final Loader<T> loader = loaderManager.getLoader(loaderId); 
    if (loader != null && loader.isReset()) { 
     loaderManager.restartLoader(loaderId, args, callbacks); 
    } else { 
     loaderManager.initLoader(loaderId, args, callbacks); 
    } 
} 
+0

Làm việc cho tôi. Cảm ơn bạn. –

+7

Không phù hợp với tôi! – Radu

+3

Hầu như giải pháp đúng: như đã đề cập trên https://groups.google.com/forum/#!topic/android-developers/DbKL6PVyhLI (và tôi đã thử nghiệm nó), điều kiện đặt lại là! Loader.isReset(), nghĩa là, 'Bạn chỉ nên khởi động lại bộ nạp nếu bộ nạp KHÔNG được đặt lại.' (được viết bởi Etienne). Vui lòng cập nhật câu trả lời của bạn. – Pascal

1

fwiw, tôi đã có một vấn đề tương tự từ cố gắng để ngay lập tức khởi động lại bộ nạp lần thứ hai, trước khi onLoadFinished đầu tiên được gọi, kết quả là không được gọi.

này làm việc cho tôi:

if(loader == null) 
    loader = loaderMngr.initLoader(
     0, null, myLoaderCallbacks 
     ); 
else if(loader.isAbandoned()) 
    return; 
else 
    loaderMngr.restartLoader(
     0, null, myLoaderCallbacks 
     );  
4

giải pháp RAB không làm việc cho tôi

tôi làm việc Giải pháp, luôn phá hủy Loader trước khi khởi động lại

Loader<Cursor> loader = mLoaderManager.getLoader(mKeyLoader); 
if (loader != null) 
{ 
    mLoaderManager.destroyLoader(mKeyLoader); 
} 
mLoaderManager.restartLoader(mKeyLoader, args, this); 
+0

Làm việc cho tôi, cảm ơn! – szidijani

+0

Cảm ơn. Cuối cùng tôi đã tìm thấy một lý do tại sao để lực lượng tải luôn gọi phương thức onLoadFinished. – MistaGreen

1

Ngoài câu trả lời RAB của , nếu bạn đang sử dụng tùy chỉnh Loader, hãy đảm bảo rằng nếu bạn gọi super nếu bạn qua viết deliverResult():

@Override 
public void deliverResult(D data) { 
    super.deliverResult(data); // <--onLoadFinished() will not be called if you don't call this 
    ... 
}