谷歌不建议在Android 11中使用Android AsyncTask API,而建议使用java.util.concurrent.您可以查看提交here

 *
 * @deprecated Use the standard <code>java.util.concurrent</code> or
 *   <a href="https://developer.android.com/topic/libraries/architecture/coroutines">
 *   Kotlin concurrency utilities</a> instead.
 */
@Deprecated
public abstract class AsyncTask<Params, Progress, Result> {

如果你在Android中使用异步任务维护一个较旧的代码库,那么你将来可能不得不对其进行更改.我的问题是,用java.util.concurrent替换下面显示的代码段应该是什么.它是一个活动的静态内部类.我正在寻找能与minSdkVersion 16一起工作的东西

private static class LongRunningTask extends AsyncTask<String, Void, MyPojo> {
        private static final String TAG = MyActivity.LongRunningTask.class.getSimpleName();
        private WeakReference<MyActivity> activityReference;

        LongRunningTask(MyActivity context) {
            activityReference = new WeakReference<>(context);
        }

        @Override
        protected MyPojo doInBackground(String... params) {
            // Some long running task
            
        }

        @Override
        protected void onPostExecute(MyPojo data) {

            MyActivity activity = activityReference.get();
            activity.progressBar.setVisibility(View.GONE);
            populateData(activity, data) ;
        }     


    }

推荐答案

private WeakReference<MyActivity> activityReference;

很好,它被弃用了,because the WeakReference<Context> was always a hack, and not a proper solution.

现在,人们将有机会清理他们的代码.


AsyncTask<String, Void, MyPojo> 

根据此代码,实际上不需要Progress,有String个输入+MyPojo个输出.

这实际上很容易实现,无需任何异步任务.

public class TaskRunner {
    private final Executor executor = Executors.newSingleThreadExecutor(); // change according to your requirements
    private final Handler handler = new Handler(Looper.getMainLooper());

    public interface Callback<R> {
        void onComplete(R result);
    }

    public <R> void executeAsync(Callable<R> callable, Callback<R> callback) {
        executor.execute(() -> {
            final R result = callable.call();
            handler.post(() -> {
                callback.onComplete(result);
            });
        });
    }
}

如何传递字符串?就像这样:

class LongRunningTask implements Callable<MyPojo> {
    private final String input;

    public LongRunningTask(String input) {
        this.input = input;
    }

    @Override
    public MyPojo call() {
        // Some long running task
        return myPojo;
    }
}

// in ViewModel
taskRunner.executeAsync(new LongRunningTask(input), (data) -> {
    // MyActivity activity = activityReference.get();
    // activity.progressBar.setVisibility(View.GONE);
    // populateData(activity, data) ;

    loadingLiveData.setValue(false);
    dataLiveData.setValue(data);
});

// in Activity
@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    setContentView(R.layout.main_activity);

    viewModel = ViewModelProviders.of(this).get(MyViewModel.class);
    viewModel.loadingLiveData.observe(this, (loading) -> {
        if(loading) {
            progressBar.setVisibility(View.VISIBLE);
        } else {
            progressBar.setVisibility(View.GONE);
        }
    });

    viewModel.dataLiveData.observe(this, (data) -> {
        populateData(data);
    }); 
}

此示例使用了一个单线程池,该池适用于DB写入(或序列化网络请求),但如果您需要用于DB读取或多个请求,则可以考虑以下执行器配置:

private static final Executor THREAD_POOL_EXECUTOR =
        new ThreadPoolExecutor(5, 128, 1,
                TimeUnit.SECONDS, new LinkedBlockingQueue<Runnable>());

Android相关问答推荐

是否可以识别Firebase身份验证流程期间使用同一用户/设备的服务器端?

如果我将日期存储为字符串yyyy-mm--dd,如何通过对Room数据库中的日期字段进行比较来进行更复杂的查询?

Android模拟器:无法安装ShellCommandUnresponsiveResponse和UtpResponse异常

如何使用Jetpack Compose使水平pager 显示离屏页面?

Kotlin Gzip字符串未按预期工作

Android从已连接的设备获得GATT

我无法在底部导航栏中正确导航-Android底部导航视图

Kotlin为多个控件设置一个侦听器

Android 14预测性背部手势-闪烁的白色背景色

从包含的(复合)模块导入 Kotlin 类时,Android 应用程序模块的 build.gradle.kts 未解决的引用错误

Android AGP 8 + Gradle 8 + Kotlin 1.8 导致 Kapt 出错

如何知道我的应用程序的新版本是否显示广告?

Jetpack Compose 中带有权重的行和 AnimatedVisibility 会 destruct UI

Android Studio XML 文本在 ConstraintLayout 中不居中

使用 Dagger Hilt 获取接口的所有实例

如何在 Jetpack Compose 中设置行宽等于 TextField 的宽度?

如何在 Jetpack Compose 中的 VisualTransformation 之后将光标保持在文本字段的末尾

react 从输入中找到路径'lib/arm64-v8a/libfbjni.so'的本机2个文件

如何使用 ConstraintLayout 链接两个文本

Unity:Android 上随机接近零的 FPS 下降(提供了很多线索)