loader的基本用法

    xiaoxiao2023-01-25  6

    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" /> 3.自定义的异步loader

    /** * 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; } }

    转载请注明原文地址: https://ju.6miu.com/read-1138459.html
    最新回复(0)