Android中的Loader
来源:互联网 发布:决战武林进阶数据弩炮 编辑:程序博客网 时间:2024/06/13 23:38
1、Loader基本使用
//loader实现 AsyncTaskLoader<Long> asyncTaskLoader = new AsyncTaskLoader<Long>(this) { //后台加载 @Override public Long loadInBackground(/*do nothing*/) { long i; for (i = 0; i < 10000000L; i++) {} return i; } //监听取消加载 @Override public void onCanceled(Long data) { makeToast("onCanceled: " + data); } }; //loader启动,并清空上一次加载的数据 asyncTaskLoader.forceLoad(); //监听数据加载 asyncTaskLoader.registerListener(0, new Loader.OnLoadCompleteListener<Long>() { @Override public void onLoadComplete(Loader<Long> loader, Long data) { makeToast("onLoadComplete: " + data); } }); //取消加载 asyncTaskLoader.cancelLoad();
2、获得取消任务时的数值
//获取任务取消时的数据 public void button2Click(View v) { final AsyncTaskLoader<Long> asyncTaskLoader = new AsyncTaskLoader<Long>(this) { private boolean isCanceled = false; //设置为true @Override public void cancelLoadInBackground() { isCanceled = true; } @Override public Long loadInBackground() { long i; for (i = 0; i < 10000000L && !isCanceled; i++) {/*do nothing*/} return i; } @Override public void onCanceled(Long data) { makeToast("onCanceled: " + data); } }; asyncTaskLoader.forceLoad(); asyncTaskLoader.registerListener(0, new Loader.OnLoadCompleteListener<Long>() { @Override public void onLoadComplete(Loader<Long> loader, Long data) { makeToast("onLoadComplete: " + data); } }); //加入延迟,防止得到初始值 (new Handler()).postDelayed(new Runnable() { @Override public void run() { asyncTaskLoader.cancelLoadInBackground(); } }, 3); }
3、使用CursorLoader获取联系人,实时更新
public class SecondActivity extends AppCompatActivity { private SimpleCursorAdapter mAdapter; private CursorLoader mCursorLoader; private final String[] CONTACT_NAME_PROJECTION = new String[] { ContactsContract.Contacts._ID, ContactsContract.Contacts.DISPLAY_NAME }; private static final int CONTACT_NAME_LOADER_ID = 0; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_second); initAdapter(); mCursorLoader = new CursorLoader(this, ContactsContract.Contacts.CONTENT_URI, CONTACT_NAME_PROJECTION, null, null, ContactsContract.Contacts.DISPLAY_NAME + " ASC"); mCursorLoader.registerListener(CONTACT_NAME_LOADER_ID, new Loader.OnLoadCompleteListener<Cursor>() { @Override public void onLoadComplete(Loader<Cursor> loader, Cursor data) { Toast.makeText(SecondActivity.this, "onLoadComplete", Toast.LENGTH_SHORT).show(); if (mAdapter != null) { //显示数据 mAdapter.swapCursor(data); } } }); mCursorLoader.startLoading(); } @Override protected void onDestroy() { super.onDestroy(); mCursorLoader.cancelLoad(); } private void initAdapter() { mAdapter = new SimpleCursorAdapter(this, android.R.layout.simple_list_item_1, null, new String[] {ContactsContract.Contacts.DISPLAY_NAME}, new int[] {android.R.id.text1}, 0); ListView listView = (ListView) findViewById(R.id.contact_names); if (listView != null) { listView.setAdapter(mAdapter); } } public void button0Click(View v) { Intent intent = new Intent(this, ThirdActivity.class); startActivity(intent); }}
4、Activity与LoadManager使用
public class ThirdActivity extends AppCompatActivity implements LoaderManager.LoaderCallbacks<Cursor> { SimpleCursorAdapter mAdapter; private static final int CONTACT_NAME_LOADER_ID = 0; // Projection 定义为仅仅显示联系人的 display name static final String[] CONTACTS_NAME_PROJECTION = new String[] { ContactsContract.Contacts._ID, ContactsContract.Contacts.DISPLAY_NAME }; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_third); initAdapter(); Bundle args = new Bundle(); args.putString("Key", "Value"); //Fragment也使用这个,初始化 getLoaderManager().initLoader(CONTACT_NAME_LOADER_ID, args, this); } private void initAdapter() { mAdapter = new SimpleCursorAdapter(this, android.R.layout.simple_list_item_1, null, new String[] { ContactsContract.Contacts.DISPLAY_NAME }, new int[] { android.R.id.text1}, 0); ListView listView = (ListView) findViewById(R.id.contact_names); if (listView != null) { listView.setAdapter(mAdapter); mAdapter.swapCursor(null); } } @Override public Loader<Cursor> onCreateLoader(int id, Bundle args) { Toast.makeText(ThirdActivity.this, "onCreateLoader args = " + args.toString(), Toast.LENGTH_SHORT).show(); // return new CursorLoader(this, ContactsContract.Contacts.CONTENT_URI, CONTACTS_NAME_PROJECTION, null, null, ContactsContract.Contacts.DISPLAY_NAME + " ASC") { @Override public Cursor loadInBackground() { try { Thread.sleep(3000); // 线程睡眠 3s } catch (Exception e) { e.printStackTrace(); } return super.loadInBackground(); } }; } //加载完成 @Override public void onLoadFinished(Loader<Cursor> loader, Cursor c) { Toast.makeText(ThirdActivity.this, "onLoadFinished", Toast.LENGTH_SHORT).show(); if (mAdapter != null) { mAdapter.swapCursor(c); } } //加载重置 //getLoaderManager().getLoader(CONTACT_NAME_LOADER_ID).reset();触发的是Loader.onReset 方法 //getLoaderManager().destroyLoader(CONTACT_NAME_LOADER_ID),触发 onLoaderReset 方法, @Override public void onLoaderReset(Loader<Cursor> loader) { Toast.makeText(ThirdActivity.this, "onLoaderReset", Toast.LENGTH_SHORT).show(); if (mAdapter != null) { mAdapter.swapCursor(null); } }}
0 0
- Android中的Loader机制
- Android中的Loader
- Android中的Universal-Image-Loader的使用
- Android-Universal-Image-Loader中的缓存分析
- Android Loader
- Android Loader
- Android Loader
- Android Loader
- Android:Loader
- android loader
- Android-loader
- Android Loader
- Java中的Class Loader
- Java中的Class Loader
- 嵌入式中的Boot Loader
- Webpack中的loader
- webpack中的babel-loader
- Qt中的loader
- Makefile:3: *** missing separator. Stop.
- 原码、反码和补码的表示范围
- 枚举类和注解
- 图的拓扑排序
- 轮播图[左右旋转滚动],可配置是否自动轮播/半透明/居中放大等等,简单实用
- Android中的Loader
- log4j.properties一般配置
- Hit-Testing in iOS
- recovery的init.rc中挂载system
- SurvivalShooter学习笔记(四.敌人攻击)
- 用Margin还是用Padding
- download
- maven(2)------maven构建项目
- VS2012不能启动谷歌调试