lis*_*lis 0 android locking android-asynctask android-sqlite
我有片段,我在每个片段中缓存数据.我通过从服务器下载doInBackground方法将数据缓存在AsyncTask中,并将其保存在onPostExecute中保存到我的数据库中.所以我总是在onPostExecution中打开数据库连接.如果我滚动"快速"扔掉片段,我认为AsyncTasks通过了预览实例,并且android.database.sqlite.SQLiteOpenHelper.getDatabaseLocked(SQLiteOpenHelper.java:224)在行中会有一个,我在那里打开连接(获取dbHelper.getWritableDatabase())
我认为有两种方法可以解决这个问题:
onPostExecution方法必须等到预览AsyncTask(onPostExecution)完成
有一种方法可以为AsyncTask的所有实例使用相同的数据库连接,而无需相互锁定它们
它是否正确?有人有点想法,怎么做?
我建议你使用Loader而不是AsyncTask在后台加载你的数据.否则,您必须管理游标,与UI线程正确同步,并确保在后台线程上发生所有查询.此外,非常不鼓励使用现已弃用的startManagingCursor和managedQuery方法; 他们放慢了你的应用程序的速度,并且可以让它戛然而止.
Android 3.0引入了Loader和LoaderManager类来帮助简化流程.这两个类都可以在Android支持库中使用,它支持所有Android平台返回到Android 1.6.
加载器确保所有游标操作都异步完成,从而消除了阻止UI线程的可能性.此外,当由LoaderManager管理时,Loaders在活动实例上保留其现有的游标数据(例如,当由于屏幕旋转而重新启动时),从而将游标保存在不必要的,可能昂贵的重新查询中.作为额外的好处,Loaders足够智能,可以监控底层数据源的更新,并在数据更改时自动重新查询.
看看这个博客,了解有关装载机的更多信息 http://www.androiddesignpatterns.com/2012/07/understanding-loadermanager.html
或访问Android开发人员的官方文档:http: //developer.android.com/guide/components/loaders.html
| 归档时间: |
|
| 查看次数: |
1396 次 |
| 最近记录: |