Должен ли я использовать AsyncTask или потоки при удержании кнопки? - PullRequest
0 голосов
/ 25 мая 2018

У меня есть AsyncTask, который записывает данные в сокет, и я не хочу делать событие onTouch, которое удерживает кнопку до ее выпуска.Я фактически сделал это с AsyncTask, но приложение вылетает после записи в сокет.Должен ли я использовать потоки вместо этого или есть лучшее решение этой проблемы?

Редактировать: я получаю сообщение "Ожидание блокировки GC Alloc" в logcat.

Код OnTouchListener:

buttonUp.setOnTouchListener(new View.OnTouchListener() {
        @Override
        public boolean onTouch(View v, MotionEvent event) {
            while(true){
                if (event.getAction() == MotionEvent.ACTION_DOWN){
                    new moveForward().execute();
                } else if (event.getAction() == MotionEvent.ACTION_UP){
                    break;
                }
            }

            return false;
        }
    });

Код AsyncTask:

private class moveForward extends AsyncTask<Void, Void, Void>{

    @Override
    protected Void doInBackground(Void... voids) {
        try {
            MainActivity.client.write('u');

        } catch (IOException e) {
            e.printStackTrace();
        }

        try {
            Thread.sleep(200);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }

        return null;
    }

    @Override
    protected void onPostExecute(Void aVoid) {
    }
}

1 Ответ

0 голосов
/ 25 мая 2018

Никогда не запускайте бесконечный цикл в основном потоке пользовательского интерфейса.Вы можете запустить задачу в ACTION_DOWN и завершить ее в ACTION UP.Вы запускаете несколько задач бесконечно.Попробуйте этот код

    moveForward moveForward;
    buttonUp.setOnTouchListener(new View.OnTouchListener() {
        @Override
        public boolean onTouch(View v, MotionEvent event) {
                if (event.getAction() == MotionEvent.ACTION_DOWN){
                    moveForward = new moveForward();
                    moveForward.execute();
                } else if (event.getAction() == MotionEvent.ACTION_UP){
                    moveForward.cancel(true);
                }

            return false;
        }
    });


    private class moveForward extends AsyncTask<Void, Void, Void>{

    @Override
    protected Void doInBackground(Void... voids) {
        while(!isCancelled()) {
            try {
                MainActivity.client.write('u');

            } catch (IOException e) {
                e.printStackTrace();
            }

            try {
                Thread.sleep(200);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
         }

        return null;
    }

    @Override
    protected void onPostExecute(Void aVoid) {
    }
}
...