Android 3.0引入了CursorLoader实现异步加载数据,为了避免同步查询数据库时阻塞UI线程的问题。在API 11之前可以通过下载支持库,来使之前的系统支持此功能。...to be created public Loader<Cursor onCreateLoader(int id, Bundle args) { // Now create and return a CursorLoader...that will take care of // creating a Cursor for the data being displayed. return new CursorLoader(this
CursorLoader也是AsyncTaskLoader的子类,主要负责数据库查询的异步加载,AsyncTaskLoader可用来所有异步加载。...2.2 CursorLoader CursorLoader是AsyncTaskLoader的子类,内部持有ForceLoadContentObserver变量,观察者来实现对数据源的数据更新,执行加载数据操作...当然你也可以用来绑定谷歌提供的CursorLoader ,在Loader创建的时候被调用,这里使用一个ContentProvider获取数据,所以使用CursorLoader返回数据 ?...和ContentResolver发出通知,接着ContentProvider通知Cursor的观察者数据发生了变化,然后Cursor通知CursorLoader的观察者数据发生了变化,CursorLoader...的自动数据刷新功能了;可以发现,所谓的CurSorLoader自动刷新也是对文章开头说的观察者模式,所以不再过多说明。
ListView listView; // 使用SimpleCursorAdapter来填充数据 private SimpleCursorAdapter mAdapter; // 使用CursorLoader...来获取数据 private CursorLoader loader; @Override protected void onCreate(Bundle savedInstanceState...Loader onCreateLoader(int id, Bundle args) { // 查询音乐数据库 获取音乐数据 并排序 loader = new CursorLoader
我们通常会使用 CursorLoader,但也可以实现自己的子类。...但是,为了初始化加载器以及实现一个 Loader 类(如 CursorLoader),我们需要引用 LoaderManager。...在此方法中,我们可以创建加载器,通过这个方法将返回 CursorLoader,但我们也可以实现自己的 Loader 子类。...在下面的示例中,onCreateLoader() 方法创建了 CursorLoader。我们必须使用它的构造方法来构建 CursorLoader。...例如,如果数据是来自 CursorLoader 的一个游标,则我们不应手动对其调用 close()。
例如,CursorLoader 会自动注册 ContentObserver,以在数据变更时触发重新加载。...CursorLoader - AsyncTaskLoader 的具体子类,用于异步加载 ContentProvider 的数据。该类会查询 ContentResolver 并返回 Cursor。...@NonNull T owner) { return new LoaderManagerImpl(owner, owner.getViewModelStore());} 一个CursorLoader...(可选)一种数据源,例如一个Conterprovider(当使用CursorLoader)。 (可选)一种显示loader加载数据的方式,例如SimpleCursorAdapter。 四....;public class LoaderCreator { public static final int ALL_BOOK_FILE = 1; public static CursorLoader
最常见的方式是与一个CursorLoader一起使用,然而应用是可以随便写它们自己的装载器以加载其它类型的数据。每个activity或fragment只有一个LoaderManager。...你可以使用典型的CursorLoader,但是你也可以实现你自己的子类。一旦装载器被激活,它们将监视它们的数据源并且在数据改变时发送新的结果。...CursorLoader AsyncTaskLoader的子类,它查询ContentResolver然后返回一个Cursor。... 装载器,一般指的是CursorLoader,我们希望在它停止后依然保持数据.这使得应用可以在activity或fragment的 onStop() 和onStart() 之间保持数据,所以当用户回到一个应用时...= '' ))"; return new CursorLoader(getActivity(), baseUri, CONTACTS_SUMMARY_PROJECTION
例如,CursorLoader 会自动注册 ContentObserver,以在数据变更时触发重新加载。...CursorLoader - AsyncTaskLoader 的具体子类,用于异步加载 ContentProvider 的数据。该类会查询 ContentResolver 并返回 Cursor。...@NonNull T owner) { return new LoaderManagerImpl(owner, owner.getViewModelStore()); } 一个CursorLoader...(可选)一种数据源,例如一个Conterprovider(当使用CursorLoader)。 (可选)一种显示loader加载数据的方式,例如SimpleCursorAdapter。 四....; public class LoaderCreator { public static final int ALL_BOOK_FILE = 1; public static CursorLoader
: Loader<Cursor { return CursorLoader(this, Phone.CONTENT_URI, PHONE_PROJECTION, null,...swapCursor(cursor) } onCreateLoader创建了一个CursorLoader,该Loader回执行ContentProvider的操作,然后返回一个cursor; onLoaderReset...时,将Adapter中的cursor置null; onLoadFinished时,由于CursorLoader查询完数据,会返回新的cursor,我们使用新的Cursor去替换之前Adapter中的cursor
android.app.LoaderManager; import android.app.LoaderManager.LoaderCallbacks; import android.content.CursorLoader...content://com.example.loadermanagertest2." + "PersonContentProvider/person"); CursorLoader...loader = new CursorLoader(getActivity(), uri, null, null, null, null); return
getFilePathByUri_API11to18(Uri contentUri) { String[] projection = {MediaStore.Images.Media.DATA}; String result = null; CursorLoader...cursorLoader = new CursorLoader(context, contentUri, projection, null, null, null); Cursor cursor =...cursorLoader.loadInBackground(); if (cursor !
Loader 从数据源获取数据,并对数据进行加载,为抽象类,需要自己实现子类 或使用官方已经实现的两个子类 AsyncTaskLoader(继承此类的时候会遇到一个坑,见下面的分析) 处理异步获取数据 CursorLoader...image.png 突然想到好像 CursorLoader 没有这个问题,那么看看它是不是有调用 forceLoad(),找了下,发现还果然有!...public class CursorLoader extends AsyncTaskLoader<Cursor { ...
image.setImageBitmap(bitmap); String[] proj = {MediaStore.Images.Media.DATA}; CursorLoader...loader = new CursorLoader(this, uri, proj, null, null, null); Cursor cursor = loader.loadInBackground
常用的有CursorLoader, 用来加载数据库数据。 // Prepare the loader....mCurFilter)); } else { baseUri = Contacts.CONTENT_URI; } // Now create and return a CursorLoader...= '' ))"; return new CursorLoader(getActivity(), baseUri, CONTACTS_SUMMARY_PROJECTION
常用的有CursorLoader, 用来加载数据库数据. // Prepare the loader....mCurFilter)); } else { baseUri = Contacts.CONTENT_URI; } // Now create and return a CursorLoader...= '' ))"; return new CursorLoader(getActivity(), baseUri, CONTACTS_SUMMARY_PROJECTION
Loader ,特别是 CursorLoader,的常见用法是观察数据库的内容并保持数据与 UI 同步。...使用 CursorLoader 后,如果数据库其中的一个值发生改变,Loader 就会自动触发数据重新加载并且更新 UI。 ?...你可以使用 Room 来代替 CursorLoader 的功能。 创建仓库类来支持一个可伸缩的加载、缓存和同步数据的架构。 想要更多 ViewModel 相关的干货?
android.app.LoaderManager; import android.content.ContentResolver; import android.content.Context; import android.content.CursorLoader...onCreateLoader(int id, Bundle args) { //创建一个Loader if(id == LOADER_ID){ //如果是我们的ID则进行初始化 return new CursorLoader
Loader ,特别是 CursorLoader,的常见用法是观察数据库的内容并保持数据与 UI 同步。...使用 CursorLoader 后,如果数据库其中的一个值发生改变,Loader 就会自动触发数据重新加载并且更新 UI。...你可以使用 Room 来代替 CursorLoader 的功能。 创建仓库类来支持一个可伸缩的加载、缓存和同步数据的架构。 想要更多 ViewModel 相关的干货?
The library also provides concrete implementations of this class, including CursorLoader and AsyncTaskLoader
As an alternative, use LoaderManager with a CursorLoader. Constructor the enables auto-requery....作为替代,可以使用LoaderManager用CursorLoader 这里说应用程序的UI线程可能会导致异常,应该是当数据量过大的时候,查询时间需要很久,超过6秒,那么就会出现anr异常把,我猜是这种
.) // Consider using CursorLoader to perform the query.
领取专属 10元无门槛券
手把手带您无忧上云