Android 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

我有一个在位图上放置效果的应用程序。当用户滑动滑块时,efect的失真程度增加/减少,然后重新绘制位图。我的自定义视图类称为TouchView,该类获取位图并从处理图像的Filters类调用一个方法。我在实现asyncTask方面得到了帮助,以加快处理速度,但没有任何效果。异步任务是否正确执行。谢谢你,马特

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);
  }
}