【发布时间】:2021-04-26 14:02:00
【问题描述】:
我试图在不使用 Kotlin Coroutines 或其他库的情况下替换已弃用的 AsyncTask,所以我有
MyTask 具有以下结构的对象
public abstract class MyTask<R> implements MyCallable<R> {
@Override
public void setUiForLoading() {
//runs on ui
}
@Override
public void setDataAfterLoading(R result) {
//runs on ui
}
@Override
public R call() throws Exception {
//runs in background
return null;
}
}
MyCallable只是一个简单的界面
public interface MyCallable<R> extends Callable<R>{
void setDataAfterLoading(R result);
void setUiForLoading();
}
并使用这个MyTaskRunner 来执行它们
public class MyTaskRunner {
private final Handler handler = new Handler(Looper.getMainLooper());
private final Executor executor = Executors.newCachedThreadPool();
public <R> void executeAsync(MyCallable<R> callable) {
try {
callable.setUiForLoading();
executor.execute(new RunnableTask<R>(handler, callable));
} catch (Exception e) {
}
}
public static class RunnableTask<R> implements Runnable{
private final Handler handler;
private final MyCallable<R> callable;
public RunnableTask(Handler handler, MyCallable<R> callable) {
this.handler = handler;
this.callable = callable;
}
@Override
public void run() {
try {
final R result = callable.call();
handler.post(new RunnableTaskForHandler(callable, result));
} catch (Exception e) {
}
}
}
public static class RunnableTaskForHandler<R> implements Runnable{
private MyCallable<R> callable;
private R result;
public RunnableTaskForHandler(MyCallable<R> callable, R result) {
this.callable = callable;
this.result = result;
}
@Override
public void run() {
callable.setDataAfterLoading(result);
}
}
}
它有效,但我不知道如何正确复制AsyncTask 的publishProgress() 和onProgressUpdate() 的行为,以显示实际进度而不是不确定
【问题讨论】:
-
我用
Thread替换了Asynctask,但进度不确定 -
publishProgress只是一种在 mainThread 上发布Runnable的方法。您可以使用类似的方法并在主线程处理程序上发布。即使使用AsyncTask,您也必须计算进度。查看AsyncTask源代码doInBackground。 -
@ADM 我知道这只是一个在 mainThread 上发布的方法,但我还不清楚在调用运行期间如何执行此操作,因为其中的代码块位于后台线程和 onUpade应该在返回的主线程中运行,例如在 publishProgress(56) 中传递的 int 不会阻塞主线程。如果你能发布一个样本会很有帮助。尝试使 AsyncTask 代码实现本身适应我的代码看起来过于复杂。
标签: java android callback android-asynctask java.util.concurrent