2011-06-08 38 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

相關問題