什么时候应该使用 Thread 以及什么时候应该使用 AsyncTask 选项?
根据以下文档AsyncTask
:
AsyncTask 被设计为围绕 Thread 和 Handler 的辅助类,并不构成通用线程框架。AsyncTasks 最好用于短时间的操作(最多几秒钟)。如果您需要保持线程长时间运行,强烈建议您使用 java.util.concurrent 包提供的各种 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();
如果您需要从后台任务中获取结果,那么您也可以使用 aCallable
和ExecutorService
类来代替:
如何让 Callable 等到执行?
AsyncTask
也支持get()
。