加载器
- 可用于每个 Activity 和 Fragment。
- 支持异步加载数据。
- 监控其数据源并在内容变化时传递新结果。
- 在某一配置更改后重建加载器时,会自动重新连接上一个加载器的 Cursor。 因此,它们无需重新查询其数据。
以CursorLoader为例子
1 . 继承接口LoaderManager.LoaderCallbacks
2 . 初始化Loader
通常,您会使用 Activity 的 onCreate() 方法或片段的 onActivityCreated() 方法初始化
Loader。您执行操作如下:// Prepare the loader. Either re-connect with an existing one,
// or start a new one.
getLoaderManager().initLoader(0, null, this);
initLoader() 方法采用以下参数:
用于标识加载器的唯一 ID。在此示例中,ID 为 0。 在构建时提供给加载器的可选参数(在此示例中为 null )。
3 .重写三个方法
LoaderManager.LoaderCallbacks 包括以下方法:
onCreateLoader():针对指定的 ID 进行实例化并返回新的 Loader onLoadFinished() :将在先前创建的加载器完成加载时调用 onLoaderReset(): 将在先前创建的加载器重置且其数据因此不可用时调用
@Override
public Loader<Cursor> onCreateLoader(int id, Bundle args) {
String locationSetting = Utility.getPreferredLocation(getActivity());
String sortOrder = WeatherContract.WeatherEntry.COLUMN_DATE + " ASC";
Uri weatherForLocationUri =
WeatherContract.WeatherEntry.buildWeatherLocationWithStartDate(
locationSetting,
System.currentTimeMillis());
return new CursorLoader(
getActivity(),
weatherForLocationUri,
FORECAST_COLUMNS,
null,
null,
sortOrder);
}
@Override
public void onLoadFinished(Loader<Cursor> loader, Cursor data) {
mForecastAdapter.swapCursor(data);
}
@Override
public void onLoaderReset(Loader<Cursor> loader) {
mForecastAdapter.swapCursor(null);
}
4 . 由于数据库中存的列比较多,查询时候全取出来比较耗时间,所以可利用投影,取你需要的部分,
一般是查询函数 的projection参数,string数组,取时候用对应的列ID就行
一个例子:
private static final String[] FORECAST_COLUMNS = {
WeatherContract.WeatherEntry.TABLE_NAME + "." + WeatherContract.WeatherEntry._ID,
WeatherContract.WeatherEntry.COLUMN_DATE,
WeatherContract.WeatherEntry.COLUMN_SHORT_DESC,
WeatherContract.WeatherEntry.COLUMN_MAX_TEMP,
WeatherContract.WeatherEntry.COLUMN_MIN_TEMP,
WeatherContract.LocationEntry.COLUMN_LOCATION_SETTING,
WeatherContract.WeatherEntry.COLUMN_WEATHER_ID,
WeatherContract.LocationEntry.COLUMN_COORD_LAT,
WeatherContract.LocationEntry.COLUMN_COORD_LONG
};
static final int COL_WEATHER_ID = 0;
static final int COL_WEATHER_DATE = 1;
static final int COL_WEATHER_DESC = 2;
static final int COL_WEATHER_MAX_TEMP = 3;
static final int COL_WEATHER_MIN_TEMP = 4;
static final int COL_LOCATION_SETTING = 5;
static final int COL_WEATHER_CONDITION_ID = 6;
static final int COL_COORD_LAT = 7;
static final int COL_COORD_LONG = 8;