我一直在寻找答案,但没有结果。
我的应用程序正在使用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]);
}*/
}
答案 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);
}
});