2014-01-10 2 views
0

Здравствуйте, я пытаюсь выполнить некоторые действия, пока пользователь удерживает кнопку.Выполнение действия при длительном нажатии

Моя проблема в том, что мой Runnable не будет работать.

Вот мой код:

@Override 
    public boolean onLongClick(View v) { 
     final Runnable r = new Runnable() 
     { 
      public void run() 
      {//do the forwarding logic here 

       int test = 0; 

       if(holdingDown) 
        test++; 
       else 
        return; 

       Log.i("test", test+""); 
      } 
     }; 

     r.run(); 

     } 

     return false; 
    } 

    @Override 
    public boolean onTouch(View v, MotionEvent event) { 
     switch (event.getAction() & MotionEvent.ACTION_MASK) { 

      case MotionEvent.ACTION_UP: 
      { 
       holdingDown= false; 
       Log.i("holdingDown", "false"); 
       break; 
      } 
     } 
     return false; 
    } 

onTouch для обнаружения, когда пользователь остановить нажатием кнопки. Когда я смотрю на свои журналы, я вижу, что Runnable работает только один раз.

Мой журнал тест получить только значение 1.

Журнал вызовов для Log.i("holdingDown", "false") становится Привели в нужное время, только тогда, когда я перестану касанием кнопки.

Почему мой Runnable не запускается? Благодарю.

EDIT:

Я попробовал этот код:

@Override 
    public boolean onLongClick(View v) { 
     // TODO Auto-generated method stub 

     holdingDown = true; 

     new Thread(new Runnable() { 
      @Override 
      public void run() { 

         if(holdingDown) 
{ 
      int test = 0; 
      test++; 
      Log.i("test", test+""); 
} 
else 
return; 


      } 
     }).start(); 

     return false; 
    } 

Его до не работает.

+0

где вы изменяете значение true? Кроме того, это не способ запускать и запускать поток – gunar

ответ

1

Вы можете попробовать использовать тему вместо Runnable так:

Thread thread = new Thread() { 
    @Override 
    public void run() { 
     //code you want to run on long press 
    } }; 

thread.start(); 

ИЛИ

Вы могли бы попытаться положить с выполняемым внутри волоске, как это:

Thread thread = new Thread(new Runnable() { 
     public void run() { 
      // code you want to run on long press 
     } 
    }); 

thread.start(); 

UPDATE: - попробуй это?

@Override 
public boolean onLongClick(View v) { 
    // TODO Auto-generated method stub 

    holdingDown = true; 

    new Thread(new Runnable() { 
     @Override 
     public void run() { 

      if (holdingDown) { 
       int test = 0; 
       test++; 
       Log.i("test", test + ""); 
      } else { 
       Log.i("test", "else"); 
      } 
       return; 

     } 
    }).start(); 

    return false; 
} 
+0

Его не работает см. Мое редактирование – dasdasd

1

Вы не делаете r.run(), чтобы начать поток, который запускает его только один раз.

Вы либо делаете new Thread(r).start();, либо используете ScheduledExecutorService.

+0

Его не работает – dasdasd

0

Вы можете создать класс с именем HoldingDown переопределяет Runnable и экземпляр Thread объекта проходящего новый экземпляр вашего HoldingDown и вызов метода запуска.

Также вы можете использовать события mousePressed и mouseReleased событий MouseListener.

Вы должны начать новый Thread в своем mousePressed, сохраните экземпляр где-нибудь и остановите его на mouseReleased.

Дополнительную информацию см. В документации.

Смежные вопросы