我花了几个小时寻找答案,但没有结果。

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

我想从TextureView拍照 -> 使用AsyncTask应用过滤器 -> 将其保存到ImageView。但是收到警告 “作为原始类型 AsyncTask 的成员未经检查地调用execute(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]); 
        }*/ 
    } 

请您参考如下方法:

您提到的应用程序失败似乎是由于多次使用同一个 AsyncTask 。安Asynctask只能使用一次。正如 official documentation 中提到的:

The task can be executed only once (an exception will be thrown if a second execution is attempted.)

您的代码创建一个 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 。更改声明,警告就会消失。


评论关闭
IT干货网

微信公众号号:IT虾米 (左侧二维码扫一扫)欢迎添加!