Loader介绍

来源:互联网 发布:网络共享打印机搜不到 编辑:程序博客网 时间:2024/06/06 00:34

Loader是一个Android上的异步加载方案。

它只能实现在Activity和Fragment。

你需要实现LoaderManager.LoaderCallbacks<Cursor>。

 

而实现这个接口,必须实现三个虚函数:

public Loader<Cursor> onCreateLoader(int id, Bundle args);

public void onLoadFinished(Loader<Cursor> loader, Cursor data);

public void onLoaderReset(Loader<Cursor> loader);

 

OnCreateLoader 是在调用了getLoaderManager().initLoader(0, null, this)之后才有framework调用,并返回一个Loader<Cursor>,一般我们返回默认CursorLoader,当然我们也可以自已去实现一个AsyncTask的子类。

当CusorLoader执行完以后就调onLoadFinished()。但我们调getLoaderManager().restartLoader(0, null, this)的时候,它就会调onLoaderReset。

Android提供LoaderManager的目的就在于可以管理多个AsyncTask,注意它的ID参数。

 

以下是一个Android自带的例子,用来加载联系人:

public static class CursorLoaderListFragment extends ListFragment            implements OnQueryTextListener, LoaderManager.LoaderCallbacks<Cursor> {        // This is the Adapter being used to display the list's data.        SimpleCursorAdapter mAdapter;        // If non-null, this is the current filter the user has provided.        String mCurFilter;        @Override public void onActivityCreated(Bundle savedInstanceState) {            super.onActivityCreated(savedInstanceState);            // Give some text to display if there is no data.  In a real            // application this would come from a resource.            setEmptyText("No phone numbers");            // We have a menu item to show in action bar.            setHasOptionsMenu(true);            // Create an empty adapter we will use to display the loaded data.            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);            // Start out with a progress indicator.            setListShown(false);            // Prepare the loader.  Either re-connect with an existing one,            // or start a new one.            getLoaderManager().initLoader(0, null, this);        }        @Override public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {            // Place an action bar item for searching.            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) {            // Called when the action bar search text has changed.  Update            // the search filter, and restart the loader to do a new query            // with this filter.            mCurFilter = !TextUtils.isEmpty(newText) ? newText : null;            getLoaderManager().restartLoader(0, null, this);            return true;        }        @Override public boolean onQueryTextSubmit(String query) {            // Don't care about this.            return true;        }        @Override public void onListItemClick(ListView l, View v, int position, long id) {            // Insert desired behavior here.            Log.i("FragmentComplexList", "Item clicked: " + id);        }        // These are the Contacts rows that we will retrieve.        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<Cursor> onCreateLoader(int id, Bundle args) {            // This is called when a new Loader needs to be created.  This            // sample only has one Loader, so we don't care about the ID.            // First, pick the base URI to use depending on whether we are            // currently filtering.            Uri baseUri;            if (mCurFilter != null) {                baseUri = Uri.withAppendedPath(Contacts.CONTENT_FILTER_URI,                        Uri.encode(mCurFilter));            } else {                baseUri = Contacts.CONTENT_URI;            }            // Now create and return a CursorLoader that will take care of            // creating a Cursor for the data being displayed.            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<Cursor> loader, Cursor data) {            // Swap the new cursor in.  (The framework will take care of closing the            // old cursor once we return.)            mAdapter.swapCursor(data);            // The list should now be shown.            if (isResumed()) {                setListShown(true);            } else {                setListShownNoAnimation(true);            }        }        public void onLoaderReset(Loader<Cursor> loader) {            // This is called when the last Cursor provided to onLoadFinished()            // above is about to be closed.  We need to make sure we are no            // longer using it.            mAdapter.swapCursor(null);        }    }


 

http://blog.sina.com.cn/s/blog_62c5894901014g5x.html 

原创粉丝点击