美文网首页安卓开发博客
线程和线程池 -- Loader

线程和线程池 -- Loader

作者: TomyZhang | 来源:发表于2018-07-22 17:48 被阅读2次

    一、概念

    在Android 3.0 中引入了 Loader 机制,让开发者能轻松在 Activity 和 Fragment 中异步加载数据,Loader 机制具有以下特征:
    ● 可用于每个 Activity 或 Fragment。
    ● 支持异步加载数据。
    ● 监控数据源并在内容变化时传递新结果。
    ● 在某一配置更改后重建加载器时,会自动重新连接上一个加载器的游标。因此,它们无需重新查询其数据。

    二、常用类

    Loader:
    一种执行异步加载数据的抽象类,这是加载器的基类。我们通常会使用 CursorLoader,但也可以实现自己的子类。当加载器处于活动状态时,应监控其数据源并在内容变化时传递新结果。

    AsyncTaskLoader:
    提供 AsyncTask 来执行工作的抽象加载器。

    CursorLoader:
    AsyncTaskLoader 的子类,它将查询 ContentResolver 并返回一个 Cursor。使用此加载器是从 ContentProvider 异步加载数据的最佳方式,而不用通过 Activity 或 Fragment 的 API 来执行托管查询。

    LoaderManager:
    一种与 Activity 或 Fragment 相关联的抽象类,用于管理一个或多个 Loader 实例。这有助于应用管理与 Activity 或 Fragment 生命周期相关的、运行时间较长的操作。它常见的用法是 与 CursorLoader 一起使用,不过应用也可以自由写入自己的加载器,用于加载其他类型的数据。

    LoaderManager.LoaderCallbacks:
    回调接口,用于客户端与 LoaderManager 进行交互,主要有如下三个方法:
    onCreateLoader():初始化并返回一个新的Loader实例。
    onLoadFinished():当一个加载器完成加载过程之后会回调这个方法。
    onLoaderReset():当一个加载器被重置并且数据无效时会回调这个方法。

    三、使用

    public class LoaderActivity extends AppCompatActivity {
    
       @BindView(R.id.listView)
       ListView listView;
    
       private LoaderManager loaderManager;
       private ArrayAdapter<String> arrayAdapter ;
       private List<String> contactList = new ArrayList<>();
    
       @Override
       protected void onCreate(@Nullable Bundle savedInstanceState) {
           super.onCreate(savedInstanceState);
           setContentView(R.layout.activity_loader);
           ButterKnife.bind(this);
    
           arrayAdapter = new ArrayAdapter<String>(this,android.R.layout.simple_list_item_1,contactList);
           listView.setAdapter(arrayAdapter);
       
           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);
           }
    
       }
    
       //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(LoaderActivity.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 onResume() {
           super.onResume();
           //loaderManager.initLoader(0,null,mLoaderCallback);
       }
    
       @Override
       protected void onDestroy() {
           super.onDestroy();
           loaderManager.destroyLoader(0);
       }
    
       @Override
       protected void onSaveInstanceState(Bundle outState) {
           super.onSaveInstanceState(outState);
       }
       
       @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);
               }
           }
       }
    }
    

    相关文章

      网友评论

        本文标题:线程和线程池 -- Loader

        本文链接:https://www.haomeiwen.com/subject/vmfrmftx.html