2013-05-24 37 views
6

Hiện nay, tôi có một bộ nạpSự khác nhau giữa restartLoader và onContentChanged

@Override 
public Loader<List<HomeMenuRowInfo>> onCreateLoader(int arg0, Bundle bundle) { 
    return new HomeMenuRowInfosLoader(this.getSherlockActivity()); 
} 

Đôi khi, tôi cần phải hỏi bộ nạp để tải lại một lần nữa, do sự thay đổi nội dung. Tôi sẽ làm việc này.

this.getLoaderManager().getLoader(0).onContentChanged(); 

Tuy nhiên, tôi muốn chuyển một số thông tin bổ sung về gói khi nội dung thay đổi. Tôi nhận ra bằng cách sử dụng onContentChanged, không có cách nào để làm như vậy.

Cách duy nhất tôi có thể hình dung ra là

this.getLoaderManager().restartLoader(0, bundle, this); 

tôi đã tự hỏi, liệu có bất kỳ sự khác biệt lớn trong Loader hành vi, của việc sử dụng restartLoader thay vì onContentChanged, bên cạnh khả năng vượt qua trong bó?

Trả lời

4

Tôi nghĩ rằng, sự khác biệt chính là phương pháp restartLoader phá hủy các bộ nạp cũ mà có cùng một ID và bắt đầu một cái mới trong khi phương pháp onContentChanged hoặc buộc nạp để nạp (forceLoad) hoặc đơn giản là đặt một lá cờ cho biết các nội dung đã thay đổi trong khi trình tải đã bị dừng. Trong trường hợp thứ hai, 'chủ sở hữu' của trình tải vẫn chịu trách nhiệm về việc tải lại (re) sau khi nội dung đã thay đổi. Tôi cho rằng điều này được thực hiện tự động bởi loaderManager như trong trường hợp restartLoader.

Nếu bạn quyết định sử dụng phương pháp restartLoader, bạn nên ghi nhớ việc hủy bộ nạp cũ và các tác động có thể xảy ra đối với ứng dụng của bạn, như khởi tạo lại chậm và v.v.

Bạn có thể có một cái nhìn tại các tài liệu hướng dẫn phương pháp để biết thêm - restartLoaderonContentChanged

Cũng lưu ý rằng loader cũ bị phá hủy khi những cái mới kết thúc công việc của mình

0

gọi restartLoader mỗi khi bạn muốn dữ liệu mới hoặc bạn muốn thay đổi đối số của bạn cho con trỏ.

Nếu bạn sử dụng initLoader để tải dữ liệu

lm = fragment.getLoaderManager(); 
lm.initLoader(LOADER_ID_LIST, null, this); 

Mỗi cuộc gọi đến initLoader sẽ trả lại con trỏ cùng onLoadFinished. Phương thức onCreateLoader sẽ chỉ được gọi vào cuộc gọi đầu tiên đến initLoader. Do đó bạn không thể thay đổi truy vấn. Bạn có cùng một dữ liệu con trỏ giống với phương thức onLoadFinished.

@Override 
public void onLoadFinished(
     android.support.v4.content.Loader<Cursor> loader, Cursor cursor) { 
    switch (loader.getId()) { 
    case LOADER_ID_LIST: 
     // The asynchronous load is complete and the data 
     // load a list of 
     populateFromCursor(cursor); 
     break; 
    case LOADER_ID_ENTRY: 
     populateFromCursor(cursor); 
     break; 
    } 
    // The listview now displays the queried data. 
} 

Vì vậy, để có được dữ liệu mới của con trỏ để onLoadFinished sử dụng restartLoader và bạn có thể vượt qua trong thông tin bó nếu bạn muốn. Dưới đây tôi đi qua null vì có một biến toàn cầu có sẵn.

lm = fragment.getLoaderManager(); 
lm.restartLoader(LOADER_ID_LIST, null, this); 

Trình tải sauQuản lý sau đó sẽ gọi số onCreateLoaderMethod.

@Override 
public android.support.v4.content.Loader<Cursor> onCreateLoader(int id, 
     Bundle args) { 

    android.support.v4.content.Loader<Cursor> ret = null; 

    // Create a new CursorLoader with the following query parameters. 
    switch (id) { 

    // load the entire list 
    case LOADER_ID_LIST: 
     String sortOrder = null; 
     switch (mSortOrder) { 
     case 0: 
      sortOrder = RidesDatabaseHandler.KEY_DATE_UPDATE + " desc"; 
      break; 
     case 1: 
      sortOrder = RidesDatabaseHandler.KEY_ID + " desc"; 
      break; 
     case 2: 
      sortOrder = RidesDatabaseHandler.KEY_NAME; 
     } 
     return new CursorLoader(context, RidesDatabaseProvider.CONTENT_URI, 
       PROJECTION, null, null, sortOrder); 

     // load a single item 
    case LOADER_ID_ENTRY: 
     sortOrder = null; 
     String where = RidesDatabaseHandler.KEY_ID + "=?"; 

     String[] whereArgs = new String[] { Integer.toString(lastshownitem) }; 

     return new CursorLoader(context, RidesDatabaseProvider.CONTENT_URI, 
       PROJECTION, where, whereArgs, null); 
    } 
    return ret; 
} 

Ghi chú: Bạn không cần phải gọi initLoader bạn có thể gọi restartLoader mỗi thời điểm đó là trừ khi bạn thực sự muốn cùng một dữ liệu được trả về từ truy vấn trước đó. Bạn không cần phải gọi onContentChanged() và trong số docs nó nói rằng Loader.ForceLoadContentObserver được thực hiện cho bạn.