【问题标题】:How to properly use AsyncTask如何正确使用 AsyncTask
【发布时间】:2011-04-30 20:51:47
【问题描述】:

我想从相机表面预览中捕获帧缓冲区并将这些缓冲区发送到另一个函数以在网络上的某个位置进行处理/发布。

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[]);

【问题讨论】:

    标签: android multithreading android-asynctask


    【解决方案1】:

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

    【讨论】:

      【解决方案2】:

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

      后者也可以。

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

      【讨论】:

      • 帧将被隔开——处理只是将其转换为 ARGB 位图——我希望这个间距会减少遇到这个问题的机会。每个线程可能会在下一个线程开始之前完成[至少处理,如果不上传]。
      猜你喜欢
      • 2021-02-15
      • 2013-06-17
      • 1970-01-01
      • 2019-05-03
      • 1970-01-01
      • 2012-12-24
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多