Android AsyncTask应用程序仍在缓慢运行
我有一个在位图上放置效果的应用程序。当用户滑动滑块时,efect的失真程度增加/减少,然后重新绘制位图。我的自定义视图类称为TouchView,该类获取位图并从处理图像的Filters类调用一个方法。我在实现asyncTask方面得到了帮助,以加快处理速度,但没有任何效果。异步任务是否正确执行。谢谢你,马特Android AsyncTask应用程序仍在缓慢运行,android,image-processing,android-asynctask,Android,Image Processing,Android Asynctask,我有一个在位图上放置效果的应用程序。当用户滑动滑块时,efect的失真程度增加/减少,然后重新绘制位图。我的自定义视图类称为TouchView,该类获取位图并从处理图像的Filters类调用一个方法。我在实现asyncTask方面得到了帮助,以加快处理速度,但没有任何效果。异步任务是否正确执行。谢谢你,马特 public class TouchView extends View{ private File tempFile; private byte[] imageArray
public class TouchView extends View{
private File tempFile;
private byte[] imageArray;
private Bitmap bgr;
private Bitmap bm;
private Bitmap bgr2 = null;;
private Paint pTouch;
private int centreX = 1;
private int centreY = 1;
private int radius = 50;
private int Progress = 1;
private static final String TAG = "*********TouchView";
private Filters f = null;
private boolean AsyncRunning = false;
public TouchView(Context context) {
super(context);
// TouchView(context, null);
}
public TouchView(Context context, AttributeSet attr) {
super(context,attr);
//.....code that gets the bitmap from camera and sdcard
bm = BitmapFactory.decodeByteArray(imageArray, 0, imageArray.length, bfo);
bgr = Bitmap.createBitmap(bm.getWidth(), bm.getHeight(), bm.getConfig());
bgr = bm.copy(bm.getConfig(), true);
bgr2 = Bitmap.createBitmap(bm.getWidth(), bm.getHeight(), bm.getConfig());
// instantiate the image processing class
f = new Filters();
}// end of touchView constructor
public void findCirclePixels(){
//set level of distortion
float prog = (float)Progress/150000;
// call processing method on bitmap
bgr2 = f.barrel(bgr,prog);
}// end of changePixel()
}//end of onTouchEvent
public void initSlider(final HorizontalSlider slider)
{
Log.e(TAG, "******setting up slider*********** ");
slider.setOnProgressChangeListener(changeListener);
}
private OnProgressChangeListener changeListener = new OnProgressChangeListener() {
@Override
public void onProgressChanged(View v, int progress) {
// TODO Auto-generated method stub
setProgress(progress);
Log.e(TAG, "***********progress = "+Progress);
}
};
private class MyTask extends AsyncTask<Void, Void, Void> {
protected void onPreExecute() {
}
@Override
protected Void doInBackground(Void... params) {
TouchView.this.findCirclePixels();
return null;
}
protected void onPostExecute(Void result) {
TouchView.this.invalidate();
}
}
@Override
public void onDraw(Canvas canvas){
super.onDraw(canvas);
canvas.drawBitmap(bgr2, 0, 0, null);
}//end of onDraw
protected void setProgress(int progress2) {
this.Progress = progress2;
new MyTask().execute();
}
}
公共类TouchView扩展视图{
私有文件tempFile;
专用字节[]图像数组;
私有位图bgr;
私有位图bm;
私有位图bgr2=null;;
私人涂料公司;
私有int centreX=1;
私有int中心=1;
私有整数半径=50;
私人int进度=1;
私有静态最终字符串标记=“*********触摸视图”;
专用过滤器f=null;
私有布尔AsyncRunning=false;
公共触摸视图(上下文){
超级(上下文);
//TouchView(上下文,空);
}
公共触摸视图(上下文、属性集属性){
超级(上下文,attr);
//..…从相机和SD卡获取位图的代码
bm=BitmapFactory.decodeByteArray(imageArray,0,imageArray.length,bfo);
bgr=Bitmap.createBitmap(bm.getWidth()、bm.getHeight()、bm.getConfig());
bgr=bm.copy(bm.getConfig(),true);
bgr2=Bitmap.createBitmap(bm.getWidth()、bm.getHeight()、bm.getConfig());
//实例化图像处理类
f=新过滤器();
}//touchView构造函数结束
public void findCirclePixels(){
//设定失真度
浮动进度=(浮动)进度/150000;
//位图的调用处理方法
bgr2=枪管(bgr,prog);
}//changePixel()的结尾
}//喷口末端
public void initSlider(最终水平滑块)
{
Log.e(标记“*******设置滑块**********”);
slider.setOnProgressChangeListener(changeListener);
}
私有OnProgressChangeListener changeListener=新OnProgressChangeListener(){
@凌驾
公共void onProgressChanged(视图v,int progress){
//TODO自动生成的方法存根
设定进度(进度);
Log.e(标签,“************进度=“+进度”);
}
};
私有类MyTask扩展了AsyncTask{
受保护的void onPreExecute(){
}
@凌驾
受保护的Void doInBackground(Void…参数){
TouchView.this.findCirclePixels();
返回null;
}
受保护的void onPostExecute(void结果){
TouchView.this.invalidate();
}
}
@凌驾
公共空白onDraw(画布){
super.onDraw(帆布);
drawBitmap(bgr2,0,0,null);
}//昂德劳的尽头
受保护的void setProgress(int progress2){
这个。进步=进步2;
新建MyTask().execute();
}
}
[更新]
这就是我现在拥有的。不幸的是,应用程序现在运行较慢。你还有什么想法我可以试试吗
public class TouchView extends View{
private File tempFile;
private byte[] imageArray;
private Bitmap bgr;
private Bitmap bm;
private Bitmap bgr2 = null;;
private Paint pTouch;
private int centreX = 1;
private int centreY = 1;
private int radius = 50;
private int Progress = 1;
private static final String TAG = "*********TouchView";
private Filters f = null;
private boolean AsyncRunning = false;
private MyTask mt = null;
public TouchView(Context context) {
super(context);
// TouchView(context, null);
}
public TouchView(Context context, AttributeSet attr) {
super(context,attr);
tempFile = new File(Environment.getExternalStorageDirectory().
getAbsolutePath() + "/"+"image.jpg");
imageArray = new byte[(int)tempFile.length()];
try{
InputStream is = new FileInputStream(tempFile);
BufferedInputStream bis = new BufferedInputStream(is);
DataInputStream dis = new DataInputStream(bis);
int i = 0;
while (dis.available() > 0) {
imageArray[i] = dis.readByte();
i++;
}
dis.close();
} catch (Exception e) {
e.printStackTrace();
}
BitmapFactory.Options bfo = new BitmapFactory.Options();
bfo.inSampleSize = 1;
bm = BitmapFactory.decodeByteArray(imageArray, 0, imageArray.length, bfo);
bgr = Bitmap.createBitmap(bm.getWidth(), bm.getHeight(), bm.getConfig());
bgr = bm.copy(bm.getConfig(), true);
bgr2 = Bitmap.createBitmap(bm.getWidth(), bm.getHeight(), bm.getConfig());
f = new Filters();
}// end of touchView constructor
public void findCirclePixels(){
float prog = (float)Progress/150000;
bgr2 = f.barrel(bgr,prog);
}// end of changePixel()
public void initSlider(final HorizontalSlider slider)
{
Log.e(TAG, "******setting up slider*********** ");
slider.setOnProgressChangeListener(changeListener);
}
private OnProgressChangeListener changeListener = new OnProgressChangeListener() {
@Override
public void onProgressChanged(View v, int progress) {
// TODO Auto-generated method stub
setProgress(progress);
Log.e(TAG, "***********progress = "+Progress);
}
};
private class MyTask extends AsyncTask<Void, Void, Void> {
protected void onPreExecute() {
}
@Override
protected Void doInBackground(Void... params) {
TouchView.this.findCirclePixels();
return null;
}
protected void onPostExecute(Void result) {
while(!isCancelled()){
TouchView.this.invalidate();
}
mt.cancel(true);
}
}
@Override
public void onDraw(Canvas canvas){
super.onDraw(canvas);
canvas.drawBitmap(bgr2, 0, 0, null);
canvas.drawCircle(centreX, centreY, radius,pTouch);
}//end of onDraw
protected void setProgress(int progress2) {
this.Progress = progress2;
mt = new MyTask();
mt.execute();
AsyncRunning = true;
}
}
公共类TouchView扩展视图{
私有文件tempFile;
专用字节[]图像数组;
私有位图bgr;
私有位图bm;
私有位图bgr2=null;;
私人涂料公司;
私有int centreX=1;
私有int中心=1;
私有整数半径=50;
私人int进度=1;
私有静态最终字符串标记=“*********触摸视图”;
专用过滤器f=null;
私有布尔AsyncRunning=false;
私有MyTask mt=null;
公共触摸视图(上下文){
超级(上下文);
//TouchView(上下文,空);
}
公共触摸视图(上下文、属性集属性){
超级(上下文,attr);
tempFile=新文件(Environment.getExternalStorageDirectory()。
getAbsolutePath()+“/”+“image.jpg”);
imageArray=新字节[(int)tempFile.length()];
试一试{
InputStream is=新文件InputStream(tempFile);
BufferedInputStream bis=新的BufferedInputStream(is);
DataInputStream dis=新的DataInputStream(bis);
int i=0;
而(dis.available()>0){
imageArray[i]=dis.readByte();
i++;
}
dis.close();
}捕获(例外e){
e、 printStackTrace();
}
BitmapFactory.Options bfo=新的BitmapFactory.Options();
bfo.inSampleSize=1;
bm=BitmapFactory.decodeByteArray(imageArray,0,imageArray.length,bfo);
bgr=Bitmap.createBitmap(bm.getWidth()、bm.getHeight()、bm.getConfig());
bgr=bm.copy(bm.getConfig(),true);
bgr2=Bitmap.createBitmap(bm.getWidth()、bm.getHeight()、bm.getConfig());
f=新过滤器();
}//touchView构造函数结束
public void findCirclePixels(){
浮动进度=(浮动)进度/150000;
bgr2=枪管(bgr,prog);
}//changePixel()的结尾
public void initSlider(最终水平滑块)
{
Log.e(标记“*******设置滑块**********”);
slider.setOnProgressChangeListener(changeListener);
}
私有OnProgressChangeListener changeListener=新OnProgressChangeListener(){
@凌驾
公共void onProgressChanged(视图v,int progress){
//TODO自动生成的方法存根
设定进度(进度);
Log.e(标签,“************进度=“+进度”);
}
};
私有类MyTask扩展了AsyncTask{
受保护的void onPreExecute(){
}
@凌驾
受保护的Void doInBackground(Void…参数){
TouchView.this.findCirclePixels();
返回null;
}
受保护的void onPostExecute(void结果){
而!
import android.content.Context;
import android.util.AttributeSet;
import android.view.MotionEvent;
import android.view.View;
import android.widget.ProgressBar;
public class HorizontalSlider extends ProgressBar {
private OnProgressChangeListener listener;
private static int padding = 2;
public interface OnProgressChangeListener {
void onProgressChanged(View v, int progress);
}
/*
public HorizontalSlider(Context context, AttributeSet attrs,
Map inflateParams, int defStyle) {
super(context, attrs, inflateParams, defStyle);
}
public HorizontalSlider(Context context, AttributeSet attrs,
Map inflateParams) {
super(context, attrs, inflateParams, android.R.attr.progressBarStyleHorizontal);
}*/
public HorizontalSlider(Context context) {
super(context);
}
public HorizontalSlider(Context context, AttributeSet attrs) {
super(context, attrs);
// TODO Auto-generated constructor stub
}
public void setOnProgressChangeListener(OnProgressChangeListener l) {
listener = l;
}
@Override
public boolean onTouchEvent(MotionEvent event) {
int action = event.getAction();
if (action == MotionEvent.ACTION_DOWN
|| action == MotionEvent.ACTION_MOVE) {
float x_mouse = event.getX() - padding;
float width = getWidth() - 2*padding;
int progress = Math.round((float) getMax() * (x_mouse / width));
if (progress < 0)
progress = 0;
this.setProgress(progress);
if (listener != null)
listener.onProgressChanged(this, progress);
}
return true;
}
}
import java.io.BufferedInputStream;
import java.io.DataInputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.InputStream;
import com.tecmark.HorizontalSlider.OnProgressChangeListener;
import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.graphics.PorterDuffXfermode;
import android.graphics.PorterDuff.Mode;
import android.os.AsyncTask;
import android.os.Environment;
import android.util.AttributeSet;
import android.util.Log;
import android.view.MotionEvent;
import android.view.View;
public class TouchView extends View{
private File tempFile;
private byte[] imageArray;
private Bitmap bgr;
private Bitmap bm;
private Bitmap bgr2 = null;;
private Paint pTouch;
private int centreX = 1;
private int centreY = 1;
private int radius = 50;
private int Progress = 1;
private static final String TAG = "*********TouchView";
private Filters f = null;
private boolean AsyncRunning = false;
private MyTask mt = null;
public TouchView(Context context) {
super(context);
// TouchView(context, null);
}
public TouchView(Context context, AttributeSet attr) {
super(context,attr);
tempFile = new File(Environment.getExternalStorageDirectory().
getAbsolutePath() + "/"+"image.jpg");
imageArray = new byte[(int)tempFile.length()];
try{
InputStream is = new FileInputStream(tempFile);
BufferedInputStream bis = new BufferedInputStream(is);
DataInputStream dis = new DataInputStream(bis);
int i = 0;
while (dis.available() > 0) {
imageArray[i] = dis.readByte();
i++;
}
dis.close();
} catch (Exception e) {
e.printStackTrace();
}
BitmapFactory.Options bfo = new BitmapFactory.Options();
bfo.inSampleSize = 1;
bm = BitmapFactory.decodeByteArray(imageArray, 0, imageArray.length, bfo);
bgr = Bitmap.createBitmap(bm.getWidth(), bm.getHeight(), bm.getConfig());
bgr = bm.copy(bm.getConfig(), true);
bgr2 = Bitmap.createBitmap(bm.getWidth(), bm.getHeight(), bm.getConfig());
f = new Filters();
pTouch = new Paint(Paint.ANTI_ALIAS_FLAG);
pTouch.setXfermode(new PorterDuffXfermode(Mode.SRC_OUT));
pTouch.setColor(Color.TRANSPARENT);
pTouch.setStyle(Paint.Style.STROKE);
}// end of touchView constructor
public void findCirclePixels(){
float prog = (float)Progress/150000;
bgr2 = f.barrel(bgr,prog);
}// end of changePixel()
public void initSlider(final HorizontalSlider slider)
{
// Log.e(TAG, "******setting up slider*********** ");
slider.setOnProgressChangeListener(changeListener);
}
private OnProgressChangeListener changeListener = new OnProgressChangeListener() {
@Override
public void onProgressChanged(View v, int progress) {
// TODO Auto-generated method stub
setProgress(progress);
//TouchView.this.Progress = progress;
if (mt != null) {
mt.cancel(true);
}
mt = new MyTask();
mt.execute();
}
};
private class MyTask extends AsyncTask<Void, Void, Void> {
protected void onPreExecute() {
// Log.e(TAG, "***********in PREEXECUTE");
}
@Override
protected Void doInBackground(Void... params) {
// Log.e(TAG, "***********in DOINBACKGROUND");
if(!mt.isCancelled()){
// Log.e(TAG, "***********in doInBackgroud about to call fcp()");
// Log.e(TAG, "***********in doinbackground asyncStatus = "+mt.getStatus());
TouchView.this.findCirclePixels();
Log.e(TAG, "***********in doinbackground fcp() called!!!!");
}
return null;
}
protected void onPostExecute(Void result) {
// Log.e(TAG, "***********in POSTEXECUTE");
if(!isCancelled()){
// Log.e(TAG, "***********in postExecute task not canclled and about to invalidate");
// Log.e(TAG, "***********in postexecute asyncStatus = "+mt.getStatus());
TouchView.this.invalidate();
// Log.e(TAG, "***********in postexecute invalidate() called!!!!");
// Log.e(TAG, "***********in postexecute asyncStatus = "+mt.getStatus());
}
}
}// end of mytask
@Override
public void onDraw(Canvas canvas){
super.onDraw(canvas);
canvas.drawBitmap(bgr2, 0, 0, null);
canvas.drawCircle(centreX, centreY, radius,pTouch);
}//end of onDraw
protected void setProgress(int progress2) {
//Log.e(TAG, "***********in SETPROGRESS");
this.Progress = progress2;
//Log.e(TAG, "***********in setprogress progress = "+Progress);
//Log.e(TAG, "***********in setProgress about to create mytask ");
mt = new MyTask();
//Log.e(TAG, "***********in setprogress about to execute mytask");
//Log.e(TAG, "***********in setprogress asyncStatus = "+mt.getStatus());
mt.execute();
// Log.e(TAG, "***********in setprogress asyncStatus = "+mt.getStatus());
// Log.e(TAG, "***********in setprogress mytask executed!!!!! ");
}
}
@Override
public boolean onTouchEvent(MotionEvent event) {
int action = event.getAction();
if (action == MotionEvent.ACTION_UP
/*|| action == MotionEvent.ACTION_MOVE*/) {
float x_mouse = event.getX() - padding;
float width = getWidth() - 2*padding;
int progress = Math.round((float) getMax() * (x_mouse / width));
if (progress < 0)
progress = 0;
this.setProgress(progress);
if (listener != null)
listener.onProgressChanged(this, progress);
}
return true;
}
}
public class TouchView extends View{
private File tempFile;
private byte[] imageArray;
private Bitmap bgr;
private Bitmap bm;
private Bitmap bgr2 = null;;
private Paint pTouch;
private int centreX = 1;
private int centreY = 1;
private int radius = 50;
private int Progress = 1;
private static final String TAG = "*********TouchView";
private Filters f = null;
private MyTask mt = null;
public TouchView(Context context) {
super(context);
}
public TouchView(Context context, AttributeSet attr) {
super(context,attr);
tempFile = new File(Environment.getExternalStorageDirectory().
getAbsolutePath() + "/"+"image.jpg");
imageArray = new byte[(int) tempFile.length()];
try{
InputStream is = new FileInputStream(tempFile);
BufferedInputStream bis = new BufferedInputStream(is);
DataInputStream dis = new DataInputStream(bis);
int i = 0;
while (dis.available() > 0) {
imageArray[i] = dis.readByte();
i++;
}
dis.close();
} catch (Exception e) {
e.printStackTrace();
}
BitmapFactory.Options bfo = new BitmapFactory.Options();
bfo.inSampleSize = 1;
bm = BitmapFactory.decodeByteArray(imageArray, 0, imageArray.length, bfo);
bgr = Bitmap.createBitmap(bm.getWidth(), bm.getHeight(), bm.getConfig());
bgr = bm.copy(bm.getConfig(), true);
bgr2 = Bitmap.createBitmap(bm.getWidth(), bm.getHeight(), bm.getConfig());
f = new Filters();
}
public void findCirclePixels(){
float prog = (float) Progress / 150000;
bgr2 = f.barrel(bgr, prog);
}
public void initSlider(final HorizontalSlider slider) {
slider.setOnProgressChangeListener(changeListener);
}
private OnProgressChangeListener changeListener = new OnProgressChangeListener() {
@Override
public void onProgressChanged(View v, int progress) {
/*
TODO: If there is a way to see if the slider is still being changed (control
has not been released), then you should return and not continue with the
creation of another task
*/
this.Progress = progress2;
if (mt != null) {
mt.cancel();
}
mt = new MyTask();
mt.execute();
}
};
private class MyTask extends AsyncTask<Void, Void, Void> {
protected void onPreExecute() {
}
@Override
protected Void doInBackground(Void... params) {
// This check is not necessary if coded properly
if (!isCancelled()) {
TouchView.this.findCirclePixels();
}
return null;
}
protected void onPostExecute(Void result) {
// This check is not necessary if coded properly
if (!isCancelled()) {
TouchView.this.invalidate();
}
}
}
@Override
public void onDraw(Canvas canvas){
super.onDraw(canvas);
canvas.drawBitmap(bgr2, 0, 0, null);
canvas.drawCircle(centreX, centreY, radius, pTouch);
}
}