Android: AsyncTask or normal Java threads with ExecutorService [已关闭]

2022-09-04 21:13:27

我的应用程序使用 a 来执行一些后台操作。我正在使用服务中的其他线程来执行一些计算。为此,我每 5 到 10 秒创建两个线程,它们运行 5 到 10 秒。但我不知道我应该使用哪种线程模型:Service

  1. 异步任务:

    优点:

    • 简单易用
    • 安卓专用
    • 简单的用户界面交互

    缺点:

    • 由于我必须使用API级别10,因此没有固定线程池来执行异步任务ExecutorService
  2. 普通 Java 线程:

    优点:

    • 具有固定线程池的执行器服务

    缺点:

    • 不那么容易处理,例如UI交互

使用哪种模型更好?特别是在性能方面。当我使用AsyncTasks时,是否有沉重的开销,并且在创建新的AsyncTasks方面,ExecutorService在重用线程方面是否比Android更快?


答案 1

如果你看一下 的实现,你会看到它使用自己的线程池,使用“普通的Java线程”。AsyncTask

当我使用AsyncTasks时,是否有沉重的开销,并且在创建新的AsyncTasks方面,ExecutorService在重用线程方面是否比Android更快?

两者之间应该没有实质性的区别。


答案 2

我正在使用针;一个开源,简单而强大的Android多线程库。有了它,你可以说这样的话:

Needle.onMainThread().execute(new Runnable() {
    @Override
    public void run() {
        // e.g. change one of the views
    }
});

Needle.onBackgroundThread().execute(new UiRelatedTask<Integer>() {
    @Override
    protected Integer doWork() {
        int result = 1+2;
        return result;
    }

    @Override
    protected void thenDoUiRelatedWork(Integer result) {
        mSomeTextView.setText("result: " + result);
    }
});

优点

  • 非常简单的接口
  • 固定线程池大小
  • 可自定义的线程池大小
  • 支持UI交互(“在UI线程上工作,然后使用结果”)
  • 安卓 1.5+
  • 在所有平台版本上的行为都相同

缺点

  • 额外的库依赖项

在GitHub上查看:https://github.com/ZsoltSafrany/needle


推荐