【问题标题】:Android Async Task executionAndroid 异步任务执行
【发布时间】: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


【解决方案1】:

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

但它不一定能解释约束错误。它可能对架构有更多帮助。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-06-12
    • 2017-08-21
    • 1970-01-01
    • 1970-01-01
    • 2018-08-18
    • 2016-10-23
    • 1970-01-01
    相关资源
    最近更新 更多