2011-06-08 56 views
2

我有一个应用程序,需要一个摄像头图像,并在位图上放置鱼眼失真效果。大约需要20多秒才能应用效果并重新绘制位图。我决定实现一个处理程序来加速第二个线程中的处理。处理程序代码似乎对应用程序没有影响。基本上,当滑动条被用户移动时,这会使位图变形得更多。 sldebar移动和重绘()之间存在显着的延迟。我是否正确地使用了这个?谢谢马特。处理程序没有加速在辅助线程中的应用程序

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; 
    private static final String TAG = "*********TouchView"; 
    private Filters f = null; 

    private Handler handler = new Handler() { 

     @Override 

     public void handleMessage(Message msg) { 

     super.handleMessage(msg); 



     } 

     }; 

    public TouchView(Context context) { 
     super(context); 
     // TouchView(context, null); 
    } 




    public TouchView(Context context, AttributeSet attr) { 
     super(context,attr); 



    //......code that loads bitmap from sdcard 

     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(){ 



     Log.e(TAG, "inside fcp()"); 
     float prog = (float)Progress/150000; 
     bgr2 = f.barrel(bgr,prog); 


     }// end of changePixel() 




    @Override 
    public boolean onTouchEvent(MotionEvent ev) { 

     switch (ev.getAction()) { 

      case MotionEvent.ACTION_DOWN: { 

       centreX = (int) ev.getX(); 
       centreY = (int) ev.getY(); 
       findCirclePixels(); 
       invalidate(); 

       break; 
      } 

      case MotionEvent.ACTION_MOVE: { 

        centreX = (int) ev.getX(); 
        centreY = (int) ev.getY(); 
        findCirclePixels(); 
        invalidate(); 
        break; 

      }   

      case MotionEvent.ACTION_UP: 

       break; 

     } 
     return true; 
    }//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); 
      processThread(); 
      Log.e(TAG, "***********progress = "+Progress); 

     } 
    }; 

    private void processThread() { 



     new Thread() { 

     public void run() { 
      Log.e(TAG, "about to call findcirclepixel in new thread"); 
     findCirclePixels(); 

     handler.sendEmptyMessage(0); 

     } 

     }.start(); 

     } 



    @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; 
     findCirclePixels(); 
     invalidate(); 

    } 


} 

回答

2

您应该使用AsyncTask。处理程序绑定到创建它的线程,所以您的处理程序仍然绑定到UI线程。

+0

维亚斯我记得现在阅读,谢谢。我试过看AsyncTask,但不知道如何将它应用到我的应用程序。我会发表另一个问题。 – turtleboy 2011-06-08 19:13:15

0

由于您未提供所有相关代码,因此很难获得所有详细信息,但这里存在您可以看到的代码问题。

  1. 你的情况处理程序应该只用于在操作完成后更新UI。实际的工作必须在后台线程完成,而不是在处理程序中完成
  2. 您可以通过progressListener创建并启动新线程。所以你最终可能会有多个线程做同样的工作。

您可能会或可能不会使用AsyncTask其他岗位暗示(虽然它是个好主意),但只使用处理程序来更新UI工作完成后。

+0

gitelman好的谢谢。我认为异步是要走的路 – turtleboy 2011-06-08 19:37:19

相关问题