1

我的 Android 应用程序中将有大约 10 个甚至更多的 http post 请求,其中大多数都是很短的时间。

据我了解,我无法在我的 UI 线程上执行任何网络操作。

解决方案是使用 AsyncTask 或使用 Thread。

如果我将使用 AsyncTask,我将不得不为该请求创建一个自定义类。

如果我将使用 Thread,我将不必为网络操作实现一个新类。

所以,我的问题是,什么时候应该使用 Thread 以及什么时候应该使用 AsyncTask 选项?为短时间请求创建一个线程并创建一个在较长寿命的网络操作上扩展 AsyncTask 的类是正确的方法吗?

4

2 回答 2

1

即使您使用Thread.start(),您仍然需要创建 的子类Runnable(或 的子类Thread)来完成工作。您正在以任何一种方式创建新类 - 也许唯一的区别是您创建匿名类与顶级命名班级。

您不应该根据是否需要创建一个新类来决定,因为成本很小 - 您创建一个新文件,它具有不同的结构等。这是一个简单的一次性成本。

在我看来,决定应该基于您是否想要AsyncTask提供的所有额外逻辑和功能。

于 2012-09-26T19:14:58.453 回答
1

什么时候应该使用 Thread 以及什么时候应该使用 AsyncTask 选项?

根据以下文档AsyncTask

AsyncTask 被设计为围绕 Thread 和 Handler 的辅助类,并不构成通用线程框架。AsyncTasks 最好用于短时间的操作(最多几秒钟)。如果您需要保持线程长时间运行,强烈建议您使用 java.util.concurrent 包提供的各种 API,例如Executor、ThreadPoolExecutor 和 FutureTask。

所以听起来如果你有一个长时间运行的任务,你应该分叉你自己的Thread或使用ExecutorService. 如果你只是在做一个简短的后台任务,AsyncTask那是要走的路。

为短时间请求创建一个线程并创建一个在较长寿命的网络操作上扩展 AsyncTask 的类是正确的方法吗?

不,根据上面的文档,你把它弄反了。

如果我将使用 Thread,我将不必为网络操作实现一个新类。

你需要声明一个新类AsyncTaskThread

 private class DownloadFilesTask extends AsyncTask<URL, Integer, Long> {
    protected Long doInBackground(URL... urls) {
       ...
    }
 }
 ...
 // to start it
 new DownloadFilesTask().execute(url1, url2, url3);

以下是如何使用线程:

 private class DownloadFilesTask implements Runnable {
      // if you need to pass in args via the constructor
      public DownloadFilesTask(URL... urls) {
          ...
      }
      public void run() {
          // do stuff in the background
      }
 }
 ...
 // to start it
 new Thread(new DownloadFilesTask(url1, url2, url3)).start();

如果您需要从后台任务中获取结果,那么您也可以使用 aCallableExecutorService类来代替:

如何让 Callable 等到执行?

AsyncTask也支持get()

于 2012-09-27T16:17:55.467 回答