处理查询的结果

编写:kesenhoo - 原文:http://developer.android.com/training/load-data-background/handle-results.html

正如前面一节课讲到的,你应该在 onCreateLoader()的回调里面使用CursorLoader执行加载数据的操作。Loader查询完后会调用Activity或者FragmentActivity的LoaderCallbacks.onLoadFinished()将结果回调回来。这个回调方法的参数之一是Cursor,它包含了查询的数据。你可以使用Cursor对象来更新需要显示的数据或者进行下一步的处理。

除了onCreateLoader()onLoadFinished(),你也需要实现onLoaderReset()。这个方法在CursorLoader检测到Cursor上的数据发生变化的时候会被触发。当数据发生变化时,系统也会触发重新查询的操作。

处理查询结果

为了显示CursorLoader返回的Cursor数据,需要使用实现AdapterView的视图组件,,并为这个组件绑定一个实现了CursorAdapter的Adapter。系统会自动把Cursor中的数据显示到View上。

你可以在显示数据之前建立View与Adapter的关联。然后在onLoadFinished()的时候把Cursor与Adapter进行绑定。一旦你把Cursor与Adapter进行绑定之后,系统会自动更新View。当Cursor上的内容发生改变的时候,也会触发这些操作。

例如:

  1. public String[] mFromColumns = {
  2. DataProviderContract.IMAGE_PICTURENAME_COLUMN
  3. };
  4. public int[] mToFields = {
  5. R.id.PictureName
  6. };
  7. // Gets a handle to a List View
  8. ListView mListView = (ListView) findViewById(R.id.dataList);
  9. /*
  10. * Defines a SimpleCursorAdapter for the ListView
  11. *
  12. */
  13. SimpleCursorAdapter mAdapter =
  14. new SimpleCursorAdapter(
  15. this, // Current context
  16. R.layout.list_item, // Layout for a single row
  17. null, // No Cursor yet
  18. mFromColumns, // Cursor columns to use
  19. mToFields, // Layout fields to use
  20. 0 // No flags
  21. );
  22. // Sets the adapter for the view
  23. mListView.setAdapter(mAdapter);
  24. ...
  25. /*
  26. * Defines the callback that CursorLoader calls
  27. * when it's finished its query
  28. */
  29. @Override
  30. public void onLoadFinished(Loader<Cursor> loader, Cursor cursor) {
  31. ...
  32. /*
  33. * Moves the query results into the adapter, causing the
  34. * ListView fronting this adapter to re-display
  35. */
  36. mAdapter.changeCursor(cursor);
  37. }

删除废旧的Cursor引用

当Cursor失效的时候,CursorLoader会被重置。这通常发生在Cursor相关的数据改变的时候。在重新执行查询操作之前,系统会执行你的onLoaderReset()回调方法。在这个回调方法中,你应该删除当前Cursor上的所有数据,避免发生内存泄露。一旦onLoaderReset()执行结束,CursorLoader就会重新执行查询操作。

例如:

  1. /*
  2. * Invoked when the CursorLoader is being reset. For example, this is
  3. * called if the data in the provider changes and the Cursor becomes stale.
  4. */
  5. @Override
  6. public void onLoaderReset(Loader<Cursor> loader) {
  7. /*
  8. * Clears out the adapter's reference to the Cursor.
  9. * This prevents memory leaks.
  10. */
  11. mAdapter.changeCursor(null);
  12. }