Android onLoadFinishedとonLoaderResetコールバックの詳細と例

5189 ワード

Android onLoadFinishedとonLoaderResetコールバックの詳細と例
onLoadFinished
この方法は、前に作成したローダがロードプロセスを完了した後に呼び出され、ローダに適用されたデータが解放される前に呼び出されることを保証する.この方法では、古いデータの使用をすべて削除する必要があります(すぐに削除されるので)、ローダがこれらのことをするので、自分で解放しないでください.
ローダは、アプリケーションがデータを使用しないことを認識すると、すぐにデータを解放します.たとえば、データがCursorLoaderからのカーソルの場合は、カーソルのclose()を呼び出すべきではありません.カーソルがCursorAdapterに配置されている場合は、古いカーソルを閉じないようにswapCursor()メソッドを使用します.例:

//  Adapter          . 
SimpleCursorAdapter mAdapter; 
... 
 
public void onLoadFinished(Loader loader, Cursor data) { 
  // Swap the new cursor in. (The framework will take care of closing the 
  // old cursor once we return.) 
  mAdapter.swapCursor(data); 
} 

onLoaderReset
作成したローダがリセットされ、データが無効になった場合、このメソッドが呼び出されます.このコールバックは、データがいつ解放されるかを発見し、参照を解放することができます.
次の実装呼び出しパラメータはnullのswapCursor()です.

//   Adapter          
SimpleCursorAdapter mAdapter;
... 
 
public void onLoaderReset(Loader loader) { 
  //        onLoadFinished()          ,            
  mAdapter.swapCursor(null); 
}


一例として、ここでは、連絡先contentproviderからクエリーデータを返すListViewを含むコンテンツをFragmentが表示する機能を完全に実現し、cursorLoaderを使用してproviderに対するクエリーを管理する.

public static class CursorLoaderListFragment extends ListFragment 
    implements OnQueryTextListener, LoaderManager.LoaderCallbacks { 
 
  //            Adapter 
  SimpleCursorAdapter mAdapter; 
 
  //    null,           
  String mCurFilter; 
 
  @Override public void onActivityCreated(Bundle savedInstanceState) { 
    super.onActivityCreated(savedInstanceState); 
 
    //          ,           .         
    //          . 
    setEmptyText("No phone numbers"); 
 
    //              . 
    setHasOptionsMenu(true); 
 
    //       adapter,              
    mAdapter = new SimpleCursorAdapter(getActivity(), 
        android.R.layout.simple_list_item_2, null, 
        new String[] { Contacts.DISPLAY_NAME, Contacts.CONTACT_STATUS }, 
        new int[] { android.R.id.text1, android.R.id.text2 }, 0); 
    setListAdapter(mAdapter); 
 
    //   loader.                    
    getLoaderManager().initLoader(0, null, this); 
  } 
 
  @Override public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) { 
    //             . 
    MenuItem item = menu.add("Search"); 
    item.setIcon(android.R.drawable.ic_menu_search); 
    item.setShowAsAction(MenuItem.SHOW_AS_ACTION_IF_ROOM); 
    SearchView sv = new SearchView(getActivity()); 
    sv.setOnQueryTextListener(this); 
    item.setActionView(sv); 
  } 
 
  public boolean onQueryTextChange(String newText) { 
    //                 .   
    //     ,   loader          
    mCurFilter = !TextUtils.isEmpty(newText) ? newText : null; 
    getLoaderManager().restartLoader(0, null, this); 
    return true; 
  } 
 
  @Override public boolean onQueryTextSubmit(String query) { 
    //           
    return true; 
  } 
 
  @Override public void onListItemClick(ListView l, View v, int position, long id) { 
    //          
    Log.i("FragmentComplexList", "Item clicked: " + id); 
  } 
 
  //                  . 
  static final String[] CONTACTS_SUMMARY_PROJECTION = new String[] { 
    Contacts._ID, 
    Contacts.DISPLAY_NAME, 
    Contacts.CONTACT_STATUS, 
    Contacts.CONTACT_PRESENCE, 
    Contacts.PHOTO_ID, 
    Contacts.LOOKUP_KEY, 
  }; 
  public Loader onCreateLoader(int id, Bundle args) { 
    //      loader       .      Loader, 
    //        ID.    base URI,URI        
    Uri baseUri; 
    if (mCurFilter != null) { 
      baseUri = Uri.withAppendedPath(Contacts.CONTENT_FILTER_URI, 
          Uri.encode(mCurFilter)); 
    } else { 
      baseUri = Contacts.CONTENT_URI; 
    } 
 
    //          CursorLoader,         
    // Cursor       
    String select = "((" + Contacts.DISPLAY_NAME + " NOTNULL) AND (" 
        + Contacts.HAS_PHONE_NUMBER + "=1) AND (" 
        + Contacts.DISPLAY_NAME + " != '' ))"; 
    return new CursorLoader(getActivity(), baseUri, 
        CONTACTS_SUMMARY_PROJECTION, select, null, 
        Contacts.DISPLAY_NAME + " COLLATE LOCALIZED ASC"); 
  } 
 
  public void onLoadFinished(Loader loader, Cursor data) { 
    //    cursor   .(              cursor   ) 
    mAdapter.swapCursor(data); 
  } 
 
  public void onLoaderReset(Loader loader) { 
    //     Cursor       onLoadFinished()  . 
    // Cursor     ,           . 
    mAdapter.swapCursor(null); 
  } 
} 

読書に感謝して、みんなを助けることができることを望んで、みんなの当駅に対する支持に感謝します!