2014-01-10 4 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은 한 번만 실행됩니다.

내 테스트 로그 내가 버튼을 터치 중지하는 경우에만 Log.i("holdingDown", "false")에 대한 로그 호출, 적절한 시간에 트리거하기 1.

에만 값을 얻는다.

Runnable이 실행되지 않는 이유는 무엇입니까? 감사.

편집 :

나는이 코드를 시도 : 작동하지 않을 때까지

@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

여기서 'holdDown'의 값을 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

당신은 Runnable를 오버라이드 (override) HoldingDown라는 클래스를 만들고 HoldingDown의 새로운 인스턴스를 통과하는 Thread 객체를 인스턴스화하고 시작 메서드를 호출 할 수 있습니다.

또한 mousePressedmouseReleased 이벤트는 MouseListener입니다.

mousePressed에 새 Thread을 시작하고 어딘가에 인스턴스를 저장하고 mouseReleased에 중지해야합니다.

자세한 내용은 설명서를 참조하십시오.

관련 문제