2011-02-28 181 views
3

我想从相机表面预览中捕获帧缓冲区,并将这些缓冲区发送到另一个函数,以便在Web上某处处理/张贴。如何正确使用AsyncTask

Android开发人员指南给出了这样的例子: 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(换句话说,是循环会坐在那里等待每个文件同步下载),而整个任务在后台工作,或者这是否会为每个传递的URL启动多个线程?

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

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

回答

3

这是一个循环的数据。

你也可以做后者。

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

+0

这些帧将被分开 - 处理将其简单地转换为ARGB位图 - 我希望这个间距可以减少遇到这个问题的机会。在下一个开始之前,每个线程都可能完成[至少处理,如果没有上传]。 – 2011-02-28 08:47:18

4

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