Android异步任务执行

时间:2014-03-11 09:52:34

标签: android sqlite android-asynctask

在android异步任务中,所有代码是按顺序执行的,还是有一些优化?我问,因为我经历了一批奇怪的行为,批量的ContentProviderOperations在asynct任务中执行。我要求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);
                }

谢谢

1 个答案:

答案 0 :(得分:0)

从上面的代码中,似乎批处理操作最终没有执行。你需要getContentResolver()。applyBatch(...)来在浴室中运行它。否则,所有删除都将在单个事务中独立执行,而不是单个事务。

但它可能不一定解释约束错误。它可能对模式有所帮助。