1.loader的用法实例如下
public class MainActivity extends AppCompatActivity implements LoaderManager.LoaderCallbacks<Cursor> {
private SimpleCursorAdapter mAdapter;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
// 3. 设置Adapter
ListView listView = (ListView) findViewById(R.id.main_list);
mAdapter = new SimpleCursorAdapter(
this,
android.R.layout.simple_list_item_1,
null,
new String[]{
ContactsContract.Contacts.DISPLAY_NAME
},
new int[]{
android.R.id.text1
},
CursorAdapter.FLAG_REGISTER_CONTENT_OBSERVER
);
listView.setAdapter(mAdapter);
//MyLog.d("MainActivity", "onCreate");
System.out.println("MainActivity.onCreate");
// 1. 创建Loader
LoaderManager manager = getSupportLoaderManager();
// 初始化Loader,如果已经存在,那么不进行创建
// 参数1: 将要创建的Loader 的 ID,
// 参数2: Loader在创建的时候,传递的参数
// 参数3: 回调接口,当Loader需要创建、销毁、数据加载完成时回调
manager.initLoader(998, null, this);
// http://ic.snssdk.com/neihan/stream/mix/v1/?content_type=-102&message_cursor=-1&loc_time=1432654641&latitude=40.0522901291784&longitude=116.23490963616668&city=%E5%8C%97%E4%BA%AC&count=30&screen_width=800&iid=2767929313&device_id=2757969807&ac=wifi&channel=baidu2&aid=7&app_name=joke_essay&version_code=400&device_platform=android&device_type=KFTT&os_api=15&os_version=4.0.3&openudid=b90ca6a3a19a78d6
}
@Override
protected void onResume() {
super.onResume();
System.out.println("MainActivity.onResume");
}
@Override
protected void onPause() {
super.onPause();
System.out.println("MainActivity.onPause");
}
@Override
protected void onStop() {
super.onStop();
System.out.println("MainActivity.onStop");
}
@Override
protected void onDestroy() {
super.onDestroy();
System.out.println("MainActivity.onDestroy");
}
/**
* 创建特定的Loader
*
* @param id
* @param args
* @return
*/
@Override
public Loader<Cursor> onCreateLoader(int id, Bundle args) {
Loader<Cursor> ret = null;
switch (id) {
case 998:
System.out.println("MainActivity.onCreateLoader");
// 2. 创建 CursorLoader,直接自动加载内容提供者的数据
ret = new CursorLoader(
this,
ContactsContract.Contacts.CONTENT_URI,
null,
null,
null,
null
);
break;
}
return ret;
}
/**
* 当Loader对象加载完数据之后,回调
*
* @param loader
* @param data
*/
@Override
public void onLoadFinished(Loader<Cursor> loader, Cursor data) {
// 4.
System.out.println("MainActivity.onLoadFinished");
int id = loader.getId();
switch (id) {
case 998:
mAdapter.changeCursor(data);
break;
}
}
/**
* 释放Loader的数据和资源,相当于销毁
*
* @param loader
*/
@Override
public void onLoaderReset(Loader<Cursor> loader) {
// 5. 释放关闭 Cursor
// 可以根据Loader的ID,进行特定资源的释放
int id = loader.getId();
switch (id) {
case 998:
System.out.println("MainActivity.onLoaderReset");
mAdapter.changeCursor(null);
break;
}
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
getMenuInflater().inflate(R.menu.main_menu, menu);
return true;
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
switch (item.getItemId()) {
case R.id.action_add:
ContentValues values = new ContentValues();
Uri uri = getContentResolver().insert(
ContactsContract.RawContacts.CONTENT_URI,
values
);
Toast.makeText(MainActivity.this, "Insert " + uri, Toast.LENGTH_SHORT).show();
break;
}
return true;
}
}
2.布局文件
<?xml version="1.0" encoding="utf-8"?>
<ListView
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/main_list"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
android:paddingBottom="@dimen/activity_vertical_margin"
tools:context="mobi.vhly.loaderdemo.MainActivity"
/>
/**
* 1. 继承AsyncTaskLoader,确认好 返回的数据类型 范型就是结果类型 doInBackground 返回值
*/
public class NetworkLoader extends AsyncTaskLoader<JSONObject> {
private String mUrl;
/**
* 在构造中传递各种参数
*
* @param context
* @param url
*/
public NetworkLoader(Context context, String url) {
super(context);
mUrl = url;
}
@Override
protected void onStartLoading() {
// 这个方法必须要重写,如果没有重写,数据不会自动加载
// forceLoad 会强制触发异步任务的加载,执行 loadInBackground()
forceLoad();
}
/**
* 子线程加载数据的部分,
*
* @return
*/
@Override
public JSONObject loadInBackground() {
JSONObject ret = null;
byte[] data = HttpTool.doGet(mUrl);
//Log.d("NetworkLoader", "get data " + data.length);
// 网络链接完成之后,考虑,cancel, reset, abort 各种情况的处理
if (isLoadInBackgroundCanceled()) {
// 不处理,不返回
} else {
if (isReset()) {
// 不返回数据,但是可以考虑,把数据保存到本地
} else {
if (data != null) {
try {
String str = new String(data, "UTF-8");
ret = new JSONObject(str);
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
} catch (JSONException e) {
e.printStackTrace();
}
}
}
}
return ret;
}
}