我的Android应用程序中有多个http请求。穿线

时间:2012-09-26 19:09:28

标签: java android multithreading android-asynctask

我的Android应用程序中将会有大约10个甚至更多的http发布请求大部分都是非常短时间。

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

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

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

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

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

2 个答案:

答案 0 :(得分:1)

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

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

在我看来,决定应该基于您是否需要所有the extra logic and functionality that AsyncTask优惠。

答案 1 :(得分:1)

  

何时应该使用Thread以及何时应该使用AsyncTask选项?

根据documentation for AsyncTask

  

AsyncTask旨在成为Thread和Handler的辅助类,并不构成通用的线程框架。理想情况下,AsyncTasks应该用于短操作(最多几秒钟。)如果需要保持线程长时间运行,强烈建议您使用java.util.concurrent pacakge提供的各种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();

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

  

How to make Callable wait till execution?

AsyncTask也支持get()