我需要在Android中运行几个AsyncTask,但只有在任务终止之前

时间:2015-04-15 18:22:59

标签: android android-asynctask

我需要在Android中运行几次相同的AsyncTask(传递一个不同的文件参数从FTP服务器下载),但是我需要一个接一个,而不是并行,我想要只做一次,做一个另一个已被终止/完成。

到目前为止,我有这段代码,但它没有正常工作,上一个任务永远不会结束:

    private class FtpTask extends AsyncTask<String, Void, Integer> {
        private String msg = "";
        private String bean = "";

        public FtpTask(String msg, String bean) {
            this.msg = msg;
            this.bean = bean;
        }

        protected void onPreExecute() {
            showProgress(true, "Syncronizing", "Processing " + msg + ", wait...");
        }

        @Override
        protected Integer doInBackground(String... params) {
            if (bean.trim().equals("")) {
                bean = params[0];
            }
            String file = Util.getMapFiles().get(bean);
            int total = 0;
            try {
                FtpServerUtil ftp = new FtpServerUtil();
                ArrayList<String> fileRows = ftp.lerArquivo(file);
                total = insertRecords(bean, fileRows);
            } catch (IOException e) {
                Log.e(Const.TAG, "Lendo arquivo no FTP", e);
            }
            if (total > 0) {
                Util.setSharedPrefValue("data_sinc_" + bean.toLowerCase(), Util.dateTimeToStringBR(null), context);
            }
            return total;
        }

        protected void onPostExecute(Integer total) {
            showProgress(false, null, null);
            String msg = "";
            if (total > 0) {
                msg = total + " records [" + bean + "] sincronized";
            } else {
                msg = "No records...";
            }
            Util.showToast(msg, activity);
        }
    }
...
@TargetApi(Build.VERSION_CODES.HONEYCOMB)
    private void StartAsyncTaskInParallel(FtpTask task) {
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) {
            task.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR);
        } else {
            task.execute();
        }
    }

..
FtpTask ftpTask1 = new FtpTask("Clientes","Cliente");
FtpTask ftpTask2 = new FtpTask("Médicos","Medico");
StartAsyncTaskInParallel(ftpTask1);
StartAsyncTaskInParallel(ftpTask2);

我怎么能实现这个目标?

1 个答案:

答案 0 :(得分:0)

您需要在之前的AsyncTask onPostExecute中启动下一个AsyncTask:

  • 在ftpTask1的onPostExecute中调用ftpTask2

  • 在ftpTask2的onPostExecute中调用ftpTask3

  • 在ftpTask3的onPostExecute中调用ftpTask4

...

要实现此目的,您可以使用Java Queue维护剩余的AsyncTask列表。

示例代码:

private class FtpTask extends AsyncTask<String, Void, Integer> {
    // ...
    private Queue<FtpTask> queue;

    public FtpTask(String msg, String bean, Queue<FtpTask> queue) {
        // ...
        this.queue = queue;
    }

    protected void onPreExecute() {

    }

    @Override
    protected Integer doInBackground(String... params) {
        // ...
    }

    protected void onPostExecute(Integer total) {
        // ...
        FtpTask nextTask = this.queue.poll();
        if (nextTask != null) {
            nextTask.execute();
        }
    }
}

使用:

Queue<FtpTask> queue = new LinkedList<>();

queue.add ( asyncTask1);
queue.add ( asyncTask2);
queue.add ( asyncTask3);
queue.add ( asyncTask4);

FtpTask firstAsync = queue.poll();
firstAsync.execute();