Android AsyncTask锁定数据库

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的所有实例使用相同的数据库连接,而无需相互锁定它们

它是否正确?有人有点想法,怎么做?

Jua*_*vas 5

我建议你使用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