如何正确使用AsyncTask

时间:2011-02-28 08:36:13

标签: android multithreading android-asynctask

我想从相机表面预览中捕获帧缓冲区,并将这些缓冲区发送到另一个要在Web上某处处理/发布的函数。

Android Dev指南提供了这个示例: http://developer.android.com/reference/android/os/AsyncTask.html

 private class DownloadFilesTask extends AsyncTask<URL, Integer, Long> {
     protected Long doInBackground(URL... urls) {
         int count = urls.length;
         long totalSize = 0;
         for (int i = 0; i < count; i++) {
             totalSize += Downloader.downloadFile(urls[i]);
             publishProgress((int) ((i / (float) count) * 100));
         }
         return totalSize;
     }

     protected void onProgressUpdate(Integer... progress) {
         setProgressPercent(progress[0]);
     }

     protected void onPostExecute(Long result) {
         showDialog("Downloaded " + result + " bytes");
     }
}

以下是执行方式:

new DownloadFilesTask().execute(url1, url2, url3);

这个整个操作是一个大的AsyncTask(换句话说,就是那个循环会坐在那里等待每个文件同步下载),而整个任务在后台工作,或者这将启动多个线程传递的每个网址?

与我的项目相关,我想在每次捕获帧缓冲区时简单地创建一个全新的AsyncTask是否合理?有点像:

//for each frame buffer i want to process:
    new FrameProcessorTask().execute(byte[]);

2 个答案:

答案 0 :(得分:4)

它将是一个单独的线程,取自托管线程池。参数省略号只是doInBackground方法的输入。从示例中可以看出,那里没有生成任何线程。如果要为每个URL使用一个线程,则必须为每个线程创建一个新的AsyncTask

答案 1 :(得分:3)

这是一个循环数据的线程。

你也可以做后者。

使用第二个选项,您需要考虑堆大小,因为手机只有有限的内存和许多并行线程,所有在大缓冲区中下载都可能会超出可用内存。