Как вставить цикл в setOnLongClickListener

В Android приложении нужно при длительном нажатии отправлять символ, пока зажата кнопка. Смотрел разные варианты, так и не смог ничего подобрать. Пока длительное нажатие отправляет символ 10 раз. Это очень корявое, временное решение.

    b26.setOnClickListener(new OnClickListener() {
        public void onClick(View v) {
            MyThred.sendData("J");
            mytext.setText("Отправляем: J");
        }
    });

    b26.setOnLongClickListener(new View.OnLongClickListener() {
        @Override
        public boolean onLongClick(View view) {
            switch (view.getId()){
                case R.id.b26:
                    MyThred.sendData("J");
                    MyThred.sendData("J");
                    MyThred.sendData("J");
                    MyThred.sendData("J");
                    MyThred.sendData("J");
                    MyThred.sendData("J");
                    MyThred.sendData("J");
                    MyThred.sendData("J");
                    MyThred.sendData("J");
                    MyThred.sendData("J");
                    mytext.setText("Длительное нажатие отправляет: J 10 раз");
                    break;
            }
            return true;
        }
    });

Ответы (1 шт):

Автор решения: Barmaley Red Star

Вам нужно детектировать окончание LongPress, например так:

private Sender sender=new Sender(); //thread для запуска "J"
private View.OnLongClickListener longListener = new View.OnLongClickListener() {

          @Override
          public boolean onLongClick(View pView) {
               buttonLongPressed = true;
               //запускаем Thread, который генерит в бесконечном цикле отправку J
               sender.start();
               return true;
          }
     }

     View.OnTouchListener touchListener = new View.OnTouchListener() {

          @Override
          public boolean onTouch(View pView, MotionEvent pEvent) {
               pView.onTouchEvent(pEvent);
               // ловим момент когда кнопка отпущена
               if (pEvent.getAction() == MotionEvent.ACTION_UP) {
                    if (buttonLongPressed) {
                         buttonLongPressed = false;
                         //где то здесь останавливаем Thread 
                         sender.stop();
                    }
               }
               return false;
          }
     }

 private class Sender extends Thread {
     private volatile boolean stop;
     Sender() {
        stop=false;
     }
     public void run() {
         stop=false;
         while(!stop) {
             MyThred.sendData("J");
         }
     }
     public synchronized void stop() {
         stop=true;
     }
 }

Написано на коленках, я не компилятор, могут быть ошибки - здесь только идея - остальное уже сами.

→ Ссылка