我的Android应用程序中将会有大约10个甚至更多的http发布请求大部分都是非常短时间。
据我了解,我无法在UI线程上执行任何网络操作。
解决方法是使用AsyncTask或使用Thread。
如果我将使用AsyncTask,我将不得不为该请求创建一个自定义类。
如果我将使用Thread,则不必为网络操作实现新类。
所以,我的问题是,我何时应该使用Thread,何时应该使用AsyncTask选项? 它是为短时间请求创建线程的正确方法,并创建一个在更长寿命的网络操作上扩展AsyncTask的类吗?
答案 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,我将不必为网络操作实现新类。
AsyncTask
和Thread
都需要您声明一个新类:
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();
如果您需要从后台任务中获取结果,那么您也可以使用Callable
和ExecutorService
类来代替:
AsyncTask
也支持get()
。