这是我的任务类:
public interface TaskCallback {
void onTaskCompleted(Boolean result);
void onTaskFailed(Exception e);
}
public class AsyncTaskExample {
private final Executor executor = Executors.newSingleThreadExecutor();
public void executeAsyncTask(TaskCallback callback) {
FutureTask<Boolean> taskSyncFiles = new FutureTask<>(() -> {
// task
return true;
});
executor.execute(taskSyncFiles);
executor.execute(() -> {
try {
Boolean result = taskSyncFiles.get();
callback.onTaskCompleted(result);
} catch (InterruptedException | ExecutionException e) {
callback.onTaskFailed(e);
}
});
}
}
我想从另一个方法(Android 中的 Activity)调用异步任务并将回调捕获为 lambda,如下所示:
myTask.executeAsyncTask(result -> {
System.out.println("Task completed with result: " + result);
}, e -> {
e.printStackTrace();
});
但无法让它工作。我怎样才能正确地做到这一点?
使用 2 个单独的 lambda 不会为您提供
TaskCallback
的实例。您有 2 个简单的解决方法。首先,您可以消除对 TaskCallback 的需求并传入两个 Consumer 并处理每个消费者:
public void executeAsyncTask(Consumer<Boolean> onTaskCompleted, Consumer<Exception> onTaskFailed) {
...
executor.execute(() -> {
try {
Boolean result = taskSyncFiles.get();
onTaskCompleted.accept(result);
} catch (InterruptedException | ExecutionException e) {
onTaskFailed.accept(e);
}
});
或者为
TaskCallback
定义一个包装类并使用 lambda 构造一个包装类:
myTask.executeAsyncTask(new MyTaskCallback(result -> {
System.out.println("Task completed with result: " + result);
}, e -> {
e.printStackTrace();
}));
Java记录中的简单定义,您可以调整为适合与Android Java一起使用的类似定义的类:
record MyTaskCallback(Consumer<Boolean> onTaskCompleted, Consumer<Exception> onTaskFailed) implements TaskCallback {
public void onTaskCompleted(Boolean result) {
onTaskCompleted.accept(result);
}
public void onTaskFailed(Exception e) {
onTaskFailed.accept(e);
}
}