Android 4+应用程序应该能够执行长时间运行的操作。例如,这可能是将100万个文件从A复制到B。若要不阻止UI,请使用AsyncTask在后台运行此操作。
假设操作在过程中间需要一些用户反馈才能继续其工作。“文件XY已经存在。重写、Irgnore还是重命名?”
所以我遇到了这样的解决方案:
我不喜欢这些解决办法。在第一种情况下,用户被要求提供反馈,即使根本没有冲突。如果必须按特定顺序处理步骤,则不可能有第二个解决方案。第三种解决方案将导致非常难以阅读/理解/维护的代码。
一个很好的解决办法是:
在Objectiv/iOS或C#中使用GCD,这不是什么大问题。但是如何在Android上使用AsyncTask来实现这一点呢?
发布于 2014-07-02 13:29:15
与此同时,我想,我找到了一个答案here:只需在doInBackground(...)中运行myActivity.runOnUiThread(...)并等待它。听起来不错,但不管用。AsyncTask/后台线程不等待Runnable完成:
private void copyFiles() {
CopyTask copyTask = new CopyTask (this);
copyTask.execute();
}
private class CopyTask extends CustomAsyncTask<Void, Void, Void> {
private doCopy;
@Override
protected Boolean doInBackground(Void... params) {
// Custom code, e.g. copy files from A to B and check for conflict
for (File file : allFiles) {
doCopy = true;
if (isConflict(file)) {
// Stop current thread and ask for user feedback on UI Thread
Runnable uiRunnable = new Runnable() {
public void run() {
// Pos 1. --> Execute custom code, e.g. use AlertDialog to ask user if file should be replaced...
doCopy = false;
synchronized (this) {
this.notify();
}
}
});
synchronized(uiRunnable) {
// Execute code on UI thread
activity.runOnUiThread(uiRunnable);
// Wait until runnable finished
try {
uiRunnable.wait();
}
catch (InterruptedException e ) {
e.printStackTrace();
}
}
}
// Pos 2. --> Continue work
if (doCopy)
copyFromAToB(File);
}
return null;
}
}我希望,当检测到冲突时,将执行Runnable并执行Pos 1 (用于解决冲突的Runnable内部代码),并执行BEVOR Pos 2。事实并非如此。Runnable被正确地执行,但是AsyncTask没有等待它完成。doInBackground的执行将不间断地继续进行。doInBackground和Runnable似乎是并行执行的(因为它们是在不同的线程上执行的),但为什么doInBackground不等待呢?
https://stackoverflow.com/questions/24528197
复制相似问题