AsyncTask-未选中的执行调用(参数...)

时间:2018-11-26 10:04:50

标签: java android android-asynctask

我一直在寻找答案,但没有结果。

我的应用程序正在使用cameraCaptureSessions.setRepeatingRequest并保存/刷新到TextureView privateTextureView中。

我想从TextureView中拍照->使用AsyncTask应用滤镜->将其保存到ImageView。但是收到警告 “未选中的以原始类型AsyncTask成员的身份执行(Params ...)的调用”

应用程序单击按钮(执行AsyncTask)。我在哪里错了?

protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        .
        .
        .
        privateTextureView = (TextureView)findViewById(R.id.textureView);
        privateTextureView.setSurfaceTextureListener(textureListener);

        myTask = new ApplyFilterTask();

        privateBtnGetCapture.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                pictureBitmap = privateTextureView.getBitmap();

                //Start MyTask
                myTask.execute(pictureBitmap);
            }
        });
    }

protected class ApplyFilterTask extends AsyncTask<Bitmap, Bitmap, Bitmap> {
        @Override
        protected void onPreExecute() {
            int color = Color.parseColor("#ffa500");
            privateImageView.setColorFilter(color);
        }

        @Override
        protected Bitmap doInBackground(Bitmap... bitmaps) {
            Bitmap bmp = bitmaps[0];
            try {
                ImageFilters filter = new ImageFilters();
                bmp = filter.applyContrastEffect(bmp, 5);
                publishProgress(bmp);
            } catch (Exception e) {
                //System.out.println("Error!!!! " + e);
            }
            return bmp;
        }

        @Override
        protected void onProgressUpdate(Bitmap... bm) {
            System.out.println("TestProgress");
            privateImageView.setImageBitmap(bm[0]);
        }
        /*
        protected void onPostExecute(Bitmap... bm) {
            System.out.println("TestExecude");
            privateImageView.setImageBitmap(bm[0]);
        }*/
    }

2 个答案:

答案 0 :(得分:0)

您提到的应用程序故障似乎是由于同一AsyncTask的多次使用所致。 Asynctask只能使用一次。如official documentation中所述:

  

该任务只能执行一次(如果尝试第二次执行,则会引发异常。)

您的代码创建了一个myTask对象,每次在OnClick事件侦听器中都会使用该对象。每次实例化一个新的AsyncTask以避免应用程序失败,如下所示。

    privateBtnGetCapture.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            pictureBitmap = privateTextureView.getBitmap();
            AsyncTask<Bitmap, Bitmap, Bitmap> myTask = new ApplyFilterTask();
            //Start MyTask
            myTask.execute(pictureBitmap);
        }
    });

但是,IDE提到的警告是一个独立的问题,与声明myTask有关。您似乎已将myTask声明为AsyncTask,而不是AsyncTask<Bitmap, Bitmap, Bitmap>ApplyFilterTask。更改声明,警告将消失。

答案 1 :(得分:0)

您不必每次都使用ApplyFilterTask的唯一实例,而是可以每次单击privateBtnGetCapture来创建新实例,并且可以通过以下方式轻松完成:

 privateBtnGetCapture.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                pictureBitmap = privateTextureView.getBitmap();

                //apply the filter this way
                new ApplyFilterTask().execute(pictureBitmap);
            }
        });