обработчик не ускоряет приложение во вторичном потоке - PullRequest
2 голосов
/ 08 июня 2011

У меня есть приложение, которое берет изображение с камеры и накладывает эффект искажения «рыбий глаз» на растровое изображение. Для применения эффекта и перерисовки растрового изображения требуется более 20 секунд. я решил реализовать обработчик для ускорения обработки во втором потоке. Код обработчика, похоже, не влияет на приложение. В основном, когда пользователь перемещает ползунок, это больше искажает растровое изображение. между перемещением слайдбара и перерисовкой () существует значительная задержка. Правильно ли я это реализовал? спасибо мат.

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 ]

2 голосов
/ 08 июня 2011

Вы должны использовать AsyncTask . Обработчик связан с потоком, создающим его, поэтому ваш обработчик все еще связан с потоком пользовательского интерфейса.

0 голосов
/ 08 июня 2011

Поскольку вы не предоставили весь соответствующий код, трудно получить все детали, но есть проблемы с вашим кодом, которые я мог видеть.

  1. Обработчик в вашем случае должен использоваться только для обновления пользовательского интерфейса после завершения операции. Фактическая работа должна выполняться в фоновом потоке, а не в обработчике.
  2. Вы создаете и запускаете новую тему из progressListener. Таким образом, вы можете получить несколько потоков, выполняющих одну и ту же работу.

Вы можете или не можете использовать AsyncTask, как предлагает другой пост (хотя это хорошая идея), но используйте обработчик только для обновления пользовательского интерфейса после выполнения задания.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...