我需要在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);
我怎么能实现这个目标?
答案 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();