【问题标题】:How to sync app with multiple AsyncTask如何将应用程序与多个 AsyncTask 同步
【发布时间】:2014-05-16 14:43:16
【问题描述】:

我需要同步我的应用程序(Sqlite 到 MySQL 并上传图片)

基本上,我每个表都有一个 AsyncTask 类,还有一个要上传的类。 1 个表格的每一行可能包含几张要上传的图片。

问题是我找不到控制同步状态的方法。 据我所知,有几种方法可以做到这一点,但没有一个对我有好处:

1.我可以把所有的AsyncTask放在一个类中,这样每个进程一个接一个,只有一个线程。

GOOD :很容易知道进程何时结束(进入 postExecute 时),所以我可以很容易地知道某个进程是否失败(检查全局变量)。

不好:这比较慢,而且将我所有的代码放在一个文件中有点不好,特别是如果我的项目中有很多表(而且会这样)

2.几个AsyncTask 好:这种方法更好、更快且易于维护。 BAD:例如,如果我有 10 个线程,我无法知道所有进程何时结束(检查进程中是否有错误。

【问题讨论】:

  • 对于几个 AsyncTask,你总是可以简单地为每个任务发送一个回调接口,将状态发送回主线程,成功、进度、失败。那,或者发送广播,可能是一个相对简单的解决方案。

标签: android mysql multithreading sqlite android-asynctask


【解决方案1】:

您可以对所有任务使用getStatus() 方法来查看它们的状态。

在您的 AsyncTask 类中:

@Override
public void onPostExecute(Object result) {
    if (isSyncFinished()) {
        //Do whatever
    }
}    

在您的 Activity 类中:

ArrayList<AsyncTask> tasks;

private Boolean isSyncFinished() {
    for (AsyncTask task : tasks) {
        if (task.getStatus() == AsyncTask.Status.RUNNING)
            return false;
    }

    return true;
}

【讨论】:

    【解决方案2】:

    以下是我将要做什么的大纲:

    public class SyncDatabase {
    
        public static final int RESULTCODE_SUCCESS = 1;
        public static final int RESULTCODE_FAIL_IO_FAILURE = 2;
        public static final int RESULTCODE_FAIL_NO_CONNECTION = 3;
    
        private interface SyncStatusCallback {
            public void success(String table);
            public void failed(String table, int resultCode);
        }
    
        private Context context;
    
        public SyncDatabase(Context context) {
            // application context to not rely on a single activity
            context = context.getApplicationContext();
        }
    
        public void sync() {
            StandardSyncStatusCallback syncCallback = new StandardSyncStatusCallback();
            new SyncTable1(syncCallback).execute();
            new SyncTable2(syncCallback).execute();
            new SyncTable3(syncCallback).execute();
            ...
        }
    
        private class StandardSyncStatusCallback implements SyncStatusCallback {
    
            @Override
            public void success(String table) {
                Intent intent = new Intent("DATABASE_SYNC_SUCCESS");
                intent.putExtra("table", table);
                context.sendBroadcast(intent);
            }
    
            @Override
            public void failed(String table, int resultCode) {
                Intent intent = new Intent("DATABASE_SYNC_FAILED");
                intent.putExtra("table", table);
                intent.putExtra("resultCode", resultCode);
                context.sendBroadcast(intent);
            }
    
        }
    
    
        private class SyncTable1 extends AsyncTask<Void, Void, Integer> {
    
            private final String tableName = "table1";
    
            private final SyncStatusCallback syncStatusCallback;
    
            public SyncTable1(SyncStatusCallback syncStatusCallback) {
                this.syncStatusCallback = syncStatusCallback;
            }
    
            @Override
            protected void onPreExecute() {
    
            }
    
            // The code to be executed in a background thread.
            @Override
            protected Integer doInBackground(Void... p) {
                // perform sync and return resultCode
                return 1;
            }
    
            // after executing the code in the thread
            @Override
            protected void onPostExecute(Integer resultCode) {
                if (resultCode == 1) {
                    syncStatusCallback.success(tableName);
                } else {
                    syncStatusCallback.failed(tableName, resultCode);
                }
            }
        }
    }
    

    发送广播的原因是它是Activity独立的。因此,如果当前显示的活动对同步过程的状态感兴趣,它只需要为两个广播注册接收器。

    否则同步将在后台静默继续。

    当然,需要进行很多更改才能使其与您的情况相匹配,但我希望它能够显示总体思路。

    【讨论】:

      猜你喜欢
      • 2019-09-14
      • 2019-03-23
      • 2015-02-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多