一旦按下主页或菜单按钮,AsyncTask就会停止执行

时间:2017-10-24 09:08:26

标签: android android-asynctask

我有一个要求,当点击捕获按钮时,我必须存储Android相机的最后10个预览帧。我能够将10帧放入缓冲区,当单击捕获按钮时,我将克隆此缓冲区并通过AsyncTask将帧保存到文件系统。 一切都很好,但问题在于活动生命周期。当我在AsyncTask仍在执行时按home或菜单按钮时,我的AsyncTask停止,我只能在文件系统中看到3到5帧。我已经尝试了许多替代方法,比如在Thread,ExecutorService甚至是Intent Service中执行它。使用该服务的问题是我的缓冲区包含超过10mb的数据,活动服务通信的限制是500kb到1mb(我想,因为我在尝试时得到了一个例外)。以下是我的代码,非常感谢任何帮助。

private class PreviewFramesProcessor extends AsyncTask<List<byte[]>, Void, Void> {

        @Override
        protected void onPreExecute() {
            dialog.setIndeterminate(true);
            dialog.setCanceledOnTouchOutside(false);
            dialog.setCancelable(false);
            dialog.setMessage("Processing...");
            dialog.show();
        }

        @Override
        protected Void doInBackground(List<byte[]>...temp) {
            /*String folder = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES).getAbsolutePath();
            panImagesFolder = new File(folder + File.separator + getUniqueFolderName());*/
            panImagesFolder.mkdirs();
            List<byte[]> byteArrayList = temp[0];
            for(int i = byteArrayList.size() - 1; i >= 0 ; i--) {
                File pictureFile = getUniqueMediaFileUri(panImagesFolder, i);
                try {
                    byte[] tempArray = convertYuvToJpeg(byteArrayList.get(i), mCameraDevice);
                    FileOutputStream fos = new FileOutputStream(pictureFile);
                    fos.write(tempArray);
                    fos.close();
                    galleryAddPic(pictureFile);
                    byteArrayList.remove(i);
                } catch(Exception e) {
                    Log.e("Nagendra", "Exception in processByteArrayBuffer(): " + e.getMessage());
                }
            }
            return null;
        }

        @Override
        protected void onPostExecute(Void result) {
            isPictureTaken = false;
            dialog.hide();
        }

        @Override
        protected void onProgressUpdate(Void... values) {

        }
    }

1 个答案:

答案 0 :(得分:0)

我认为你的活动正在被破坏,检查在开发者设置中是否启用了活动。