【发布时间】:2014-03-11 09:52:33
【问题描述】:
在android async任务中,所有的代码是顺序执行的,还是有一些优化?我问是因为我在异步任务中执行一批 ContentProviderOperations 时遇到了奇怪的行为。我要求 doInBackground 方法,因为其他两个是在 ui 线程上执行的。
编辑:奇怪的行为如下:我有三个表,一个有它的主键作为外键,另外两个,另外两个相互独立。因此,当我想删除某些内容时,我首先删除独立表的行以删除第一个表中的外键约束,这样我也可以从那里删除它。要以相反的方式插入,首先我在第一个表中创建行,以创建其他两个可以引用的主键,然后在其他两个中创建行。
所有这些都放入了一批内容提供者操作中,但我得到了一个约束失败的响应。
EDIT2:所有这些都在单个线程中,在单个 AsyncTask 的 doInBackground 中,这里是代码(问题是与其他两个具有 fk 的代码:
for (ActionSyncModel ac : res.actions_table) {
Uri deleteUri = ActionContract.Action.CONTENT_URI
.buildUpon()
.appendPath(Integer.toString(ac.oldId)).build();
String temp = deleteUri.toString();
Log.i("action delete ->>>> ", temp);
batch.add(ContentProviderOperation.newDelete(deleteUri)
.build());
getContentResolver().delete(deleteUri, null, null);
}
for (JournalAttachmentSyncModel js : res.attach_table) {
Uri deleteUri = JournalAttachmentContract.JournalAttachment.CONTENT_URI
.buildUpon()
.appendPath(Integer.toString(js.oldId)).build();
String temp = deleteUri.toString();
Log.i("attach delete ->>>>", temp);
batch.add(ContentProviderOperation.newDelete(deleteUri)
.build());
getContentResolver().delete(deleteUri, null, null);
}
for (ProblemSyncModel pro : res.problems_table) {
Uri deleteUri = ProblemContract.Problem.CONTENT_URI
.buildUpon()
.appendPath(Integer.toString(pro.oldId))
.build();
String temp = deleteUri.toString();
Log.i("problem delete->>>>", temp);
batch.add(ContentProviderOperation.newDelete(deleteUri)
.build());
getContentResolver().delete(deleteUri, null, null);
}
谢谢
【问题讨论】:
-
谷歌这个,会有更多帮助。或者请在您的代码中指定什么是奇怪的行为 - 您尝试过的代码是什么。可以更详细地描述预期和正在发生的事情
-
据我所知 - 不是。 doInBackround 中没有优化。它只是在后台线程中执行您的代码。我认为您的 doInBackground 方法有误。或者您同时执行其他操作。
-
多个AsyncTask如果不在线程池执行器服务上运行,默认按顺序运行。
-
我问的不是多个任务,而是单个任务中的代码。
标签: android sqlite android-asynctask