Android 使用Loader加载联系人
来源:互联网 发布:数据分布图怎么做 编辑:程序博客网 时间:2024/05/01 01:13
Android 的装载器(Loader)是从Android3.0之后新引入的API,主要完成单线程耗时数据异步装载功能,并在数据有更新时自动通知UI刷新,业内也叫加载器,装载机。
一个使用装载器的的应用会包含以下组件:
1:一个Activity或者Fragment
2:一个LoaderManage的实例
3:一个被ContentProvider所支持的数据的CursorLoader.。或者你从Loader,AsynTaskLoader实现自己的装载器来加载数据。
4:实现LoaderManager.LoaderCallBacks,管理自己的加载器。
5:显示装载器的途径,比如说ArrayAdapter
6:一个数据源,比如当是CursorLoader,它将是一个ContentProvider
这里通过两张图来展示Loader加载数据:
Loader加载原理:
、
Loader加载流程:
在这里,我们通过Loader读取本地联系人,首先添加读取联系人的权限:
<uses-permission android:name="android.permission.READ_CONTACTS"/>如果手机是版本是6.0,还需要动态申请权限。全部代码如下:
public class MainActivity extends AppCompatActivity { private ListView list ; private ArrayAdapter<String> arrayAdapter ; private List<String> contactList = new ArrayList<>(); private LoaderManager loaderManager ; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); list= (ListView)findViewById(R.id.contact_list); arrayAdapter = new ArrayAdapter<String>(this,android.R.layout.simple_list_item_1,contactList); list.setAdapter(arrayAdapter); //获取LoaderManager loaderManager = getSupportLoaderManager(); //动态申请权限 if (ContextCompat.checkSelfPermission(this, Manifest.permission.READ_CONTACTS) != PackageManager.PERMISSION_GRANTED) { ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.READ_CONTACTS}, 0); } else { loaderManager.initLoader(0, null, mLoaderCallback); } } @Override protected void onResume() { super.onResume(); //loaderManager.initLoader(0,null,mLoaderCallback); } //callBack 实现 private LoaderManager.LoaderCallbacks<Cursor> mLoaderCallback = new LoaderManager.LoaderCallbacks<Cursor>() { private final String[] Contact_PROJECTION = { ContactsContract.CommonDataKinds.Phone.DISPLAY_NAME, ContactsContract.CommonDataKinds.Phone.NUMBER}; @Override public Loader<Cursor> onCreateLoader(int id, Bundle args) { CursorLoader cursorLoader = new CursorLoader(MainActivity.this, ContactsContract.CommonDataKinds.Phone.CONTENT_URI, Contact_PROJECTION, null, null, null); return cursorLoader ; } @Override public void onLoadFinished(Loader<Cursor> loader, Cursor data) { //首先要清空数据源,避免重复数据 contactList.clear(); while (data.moveToNext()) { String displayName = data.getString(data.getColumnIndex(ContactsContract.CommonDataKinds.Phone.DISPLAY_NAME)); String number = data.getString(data.getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER)); //分两行展示 contactList.add(displayName+"\n"+number); } arrayAdapter.notifyDataSetChanged(); } @Override public void onLoaderReset(Loader<Cursor> loader) { contactList.clear(); } }; @Override protected void onDestroy() { super.onDestroy(); loaderManager.destroyLoader(0); } @Override protected void onSaveInstanceState(Bundle outState) { super.onSaveInstanceState(outState); Log.e("LoaderManager","====onSaveInstanceState"); } @Override public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) { super.onRequestPermissionsResult(requestCode, permissions, grantResults); if(requestCode == 0) { if(grantResults[0] == PackageManager.PERMISSION_GRANTED) { loaderManager.initLoader(0, null, mLoaderCallback); } } }}
这样我们就能读取本地的联系人了。
0 0
- Android 使用Loader加载联系人
- 使用Loader获取Android联系人列表
- Android加载器Loader使用
- Android使用CursorLoader加载手机联系人
- Android Loader详解二:使用加载器
- Android Loader详解二:使用加载器
- Android Loader详解二:使用加载器
- Android Loader详解二:使用加载器
- Android Loader加载器使用详解
- Android Loader详解二:使用加载器
- 使用Android-Universal-Image-Loader加载图片
- Android异步加载器Loader的使用
- android---(Loader异步加载)
- Android Loader 加载器
- 使用loader加载swf
- Android图片异步加载之Android-Universal-Image-Loader使用
- Android图片异步加载之Android-Universal-Image-Loader使用
- Android 使用Android-Universal-Image-Loader进行异步数据加载
- 【java基础】浅谈链表结构
- 离线并发与锁机制
- 一文读懂机器学习、数据科学、深度学习和统计学之间的区别
- HashMap分析
- mac os 安装 brew
- Android 使用Loader加载联系人
- 海量数据查询优化
- 冒泡排序
- malloc与new的不同点
- 线程池ThreadPoolExecutor
- 初用博客
- System.in.read()使用
- 杭电2023题
- java多线程