没有内容提供的CursorLoader使用

没有内容提供的CursorLoader使用

AndroidSDK文档显示startManagingCursor()方法被实践:

不推荐这种方法。与LoaderManager一起使用新的CursorLoader类;这也可以通过Android兼容性包在旧平台上使用。此方法允许活动根据活动的生命周期管理给定游标的生命周期。也就是说,当活动停止时,它将自动调用给定游标上的deactivate(),当它稍后重新启动时,它将为您调用requery()。当活动被销毁时,所有托管游标都将自动关闭。如果您的目标是蜂窝或以后,考虑使用LoaderManager代替,可以通过getLoaderManager()

所以我想用CursorLoader..但是我如何使用它与自定义CursorAdapter没有ContentProvider的构造函数中需要URI时,CursorLoader?


不负相思意
浏览 551回答 3
3回答

慕神8447489

我写了一个简易CursorLoader它不需要内容提供者:import&nbsp;android.content.Context;import&nbsp;android.database.Cursor;import&nbsp;android.support.v4.content.AsyncTaskLoader;/** &nbsp;*&nbsp;Used&nbsp;to&nbsp;write&nbsp;apps&nbsp;that&nbsp;run&nbsp;on&nbsp;platforms&nbsp;prior&nbsp;to&nbsp;Android&nbsp;3.0.&nbsp;When&nbsp;running &nbsp;*&nbsp;on&nbsp;Android&nbsp;3.0&nbsp;or&nbsp;above,&nbsp;this&nbsp;implementation&nbsp;is&nbsp;still&nbsp;used;&nbsp;it&nbsp;does&nbsp;not&nbsp;try &nbsp;*&nbsp;to&nbsp;switch&nbsp;to&nbsp;the&nbsp;framework's&nbsp;implementation.&nbsp;See&nbsp;the&nbsp;framework&nbsp;SDK &nbsp;*&nbsp;documentation&nbsp;for&nbsp;a&nbsp;class&nbsp;overview. &nbsp;* &nbsp;*&nbsp;This&nbsp;was&nbsp;based&nbsp;on&nbsp;the&nbsp;CursorLoader&nbsp;class &nbsp;*/public&nbsp;abstract&nbsp;class&nbsp;SimpleCursorLoader&nbsp;extends&nbsp;AsyncTaskLoader<Cursor>&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;private&nbsp;Cursor&nbsp;mCursor; &nbsp;&nbsp;&nbsp;&nbsp;public&nbsp;SimpleCursorLoader(Context&nbsp;context)&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;super(context); &nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;&nbsp;&nbsp;/*&nbsp;Runs&nbsp;on&nbsp;a&nbsp;worker&nbsp;thread&nbsp;*/ &nbsp;&nbsp;&nbsp;&nbsp;@Override &nbsp;&nbsp;&nbsp;&nbsp;public&nbsp;abstract&nbsp;Cursor&nbsp;loadInBackground(); &nbsp;&nbsp;&nbsp;&nbsp;/*&nbsp;Runs&nbsp;on&nbsp;the&nbsp;UI&nbsp;thread&nbsp;*/ &nbsp;&nbsp;&nbsp;&nbsp;@Override &nbsp;&nbsp;&nbsp;&nbsp;public&nbsp;void&nbsp;deliverResult(Cursor&nbsp;cursor)&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(isReset())&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;An&nbsp;async&nbsp;query&nbsp;came&nbsp;in&nbsp;while&nbsp;the&nbsp;loader&nbsp;is&nbsp;stopped &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(cursor&nbsp;!=&nbsp;null)&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;cursor.close(); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Cursor&nbsp;oldCursor&nbsp;=&nbsp;mCursor; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;mCursor&nbsp;=&nbsp;cursor; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(isStarted())&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;super.deliverResult(cursor); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(oldCursor&nbsp;!=&nbsp;null&nbsp;&&&nbsp;oldCursor&nbsp;!=&nbsp;cursor&nbsp;&&&nbsp;!oldCursor.isClosed())&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;oldCursor.close(); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;&nbsp;&nbsp;/** &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;Starts&nbsp;an&nbsp;asynchronous&nbsp;load&nbsp;of&nbsp;the&nbsp;contacts&nbsp;list&nbsp;data.&nbsp;When&nbsp;the&nbsp;result&nbsp;is&nbsp;ready&nbsp;the&nbsp;callbacks &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;will&nbsp;be&nbsp;called&nbsp;on&nbsp;the&nbsp;UI&nbsp;thread.&nbsp;If&nbsp;a&nbsp;previous&nbsp;load&nbsp;has&nbsp;been&nbsp;completed&nbsp;and&nbsp;is&nbsp;still&nbsp;valid &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;the&nbsp;result&nbsp;may&nbsp;be&nbsp;passed&nbsp;to&nbsp;the&nbsp;callbacks&nbsp;immediately. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;<p/> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;Must&nbsp;be&nbsp;called&nbsp;from&nbsp;the&nbsp;UI&nbsp;thread &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*/ &nbsp;&nbsp;&nbsp;&nbsp;@Override &nbsp;&nbsp;&nbsp;&nbsp;protected&nbsp;void&nbsp;onStartLoading()&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(mCursor&nbsp;!=&nbsp;null)&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;deliverResult(mCursor); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(takeContentChanged()&nbsp;||&nbsp;mCursor&nbsp;==&nbsp;null)&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;forceLoad(); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;&nbsp;&nbsp;/** &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;Must&nbsp;be&nbsp;called&nbsp;from&nbsp;the&nbsp;UI&nbsp;thread &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*/ &nbsp;&nbsp;&nbsp;&nbsp;@Override &nbsp;&nbsp;&nbsp;&nbsp;protected&nbsp;void&nbsp;onStopLoading()&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;Attempt&nbsp;to&nbsp;cancel&nbsp;the&nbsp;current&nbsp;load&nbsp;task&nbsp;if&nbsp;possible. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;cancelLoad(); &nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;&nbsp;&nbsp;@Override &nbsp;&nbsp;&nbsp;&nbsp;public&nbsp;void&nbsp;onCanceled(Cursor&nbsp;cursor)&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(cursor&nbsp;!=&nbsp;null&nbsp;&&&nbsp;!cursor.isClosed())&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;cursor.close(); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;&nbsp;&nbsp;@Override &nbsp;&nbsp;&nbsp;&nbsp;protected&nbsp;void&nbsp;onReset()&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;super.onReset(); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;Ensure&nbsp;the&nbsp;loader&nbsp;is&nbsp;stopped &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;onStopLoading(); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(mCursor&nbsp;!=&nbsp;null&nbsp;&&&nbsp;!mCursor.isClosed())&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;mCursor.close(); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;mCursor&nbsp;=&nbsp;null; &nbsp;&nbsp;&nbsp;&nbsp;}}它只需要AsyncTaskLoader班级,等级。要么是Android3.0或更高版本的版本,要么是兼容包附带的版本。我也写ListLoader与LoadManager,并用于检索泛型java.util.List收藏

函数式编程

编写使用数据库类而不是内容提供者的自己的加载程序。最简单的方法就是获取CursorLoader从兼容性库初始化,并将提供程序查询替换为对您自己的db助手类的查询。

犯罪嫌疑人X

第三种选择是简单地覆盖loadInBackground:public&nbsp;class&nbsp;CustomCursorLoader&nbsp;extends&nbsp;CursorLoader&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;private&nbsp;final&nbsp;ForceLoadContentObserver&nbsp;mObserver&nbsp;=&nbsp;new&nbsp;ForceLoadContentObserver(); &nbsp;&nbsp;&nbsp;&nbsp;@Override &nbsp;&nbsp;&nbsp;&nbsp;public&nbsp;Cursor&nbsp;loadInBackground()&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Cursor&nbsp;cursor&nbsp;=&nbsp;...&nbsp;//&nbsp;get&nbsp;your&nbsp;cursor&nbsp;from&nbsp;wherever&nbsp;you&nbsp;like &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(cursor&nbsp;!=&nbsp;null)&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;Ensure&nbsp;the&nbsp;cursor&nbsp;window&nbsp;is&nbsp;filled &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;cursor.getCount(); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;cursor.registerContentObserver(mObserver); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;cursor; &nbsp;&nbsp;&nbsp;&nbsp;}};这还将处理当数据库更改时重新查询您的游标。请注意:你必须定义另一个观察者,因为谷歌在其无限智慧中决定将他们的包私有化。如果将类放入与原始包(或compat包)相同的包中,则实际上可以使用原始观察者。观察者是一个非常轻量级的对象,在其他任何地方都不使用,所以这并没有多大区别。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Android