Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/213.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android:AsyncTask或带ExecutorService的普通Java线程_Java_Android_Multithreading - Fatal编程技术网

Android:AsyncTask或带ExecutorService的普通Java线程

Android:AsyncTask或带ExecutorService的普通Java线程,java,android,multithreading,Java,Android,Multithreading,我的应用程序使用服务做一些后台工作。我在服务中使用额外的线程来进行一些计算。为此,我每5到10秒创建两个线程,它们运行5到10秒。但我不知道应该使用哪种线程模型: 异步任务: 优点: 易于使用 特定于android的 简单的用户界面交互 缺点: 因为我必须使用API级别10,所以没有带有固定线程池的ExecutorService来执行异步任务 普通Java线程: 优点: 带有固定线程池的ExecutorService 缺点: 不太容易处理,例如UI交互 哪种型号更适合使用?特别是

我的应用程序使用
服务
做一些后台工作。我在服务中使用额外的线程来进行一些计算。为此,我每5到10秒创建两个线程,它们运行5到10秒。但我不知道应该使用哪种线程模型:

  • 异步任务:

    优点:

    • 易于使用
    • 特定于android的
    • 简单的用户界面交互
    缺点:

    • 因为我必须使用API级别10,所以没有带有固定线程池的
      ExecutorService
      来执行异步任务
  • 普通Java线程:

    优点:

    • 带有固定线程池的ExecutorService
    缺点:

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

  • 哪种型号更适合使用?特别是在性能方面。当我使用AsyncTasks时是否会有很大的开销,ExecutorService在创建新的AsyncTasks时是否比Android更快地重用线程?

    如果您查看
    AsyncTask
    的实现,您会看到它使用自己的线程池使用“普通Java线程”

    当我使用AsyncTasks时是否会有很大的开销,ExecutorService在重用线程方面是否比Android创建新的AsyncTasks更快


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

    我用的是针;一个开源、简单且功能强大的Android多线程库。有了它,你可以说:

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

    Needle.onBackgroundThread().execute(新的UiRelatedTask()){
    @凌驾
    受保护整数doWork(){
    int结果=1+2;
    返回结果;
    }
    @凌驾
    受保护的void-thenDoUiRelatedWork(整数结果){
    mSomeTextView.setText(“结果:+result”);
    }
    });
    
    专业人士

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

    • 额外库依赖项

    在GitHub上查看它:

    没错,谢谢!这看起来很有希望。我将在我的下一个项目中试一试。
    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);
        }
    });