2014-01-10 320 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不能運行?謝謝。

編輯:

我試過這段代碼:

@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'的值?此外,這不是開始和運行線程的方式 – gunar

回答

1

你可以嘗試使用一個線程,而不是一個Runnable的是這樣的:

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

thread.start(); 

OR

你可以嘗試把可運行一個線程裏面是這樣的:

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

thread.start(); 

更新: - 嘗試這個?

@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的一個新的實例,並調用start方法。

另外,您還可以使用MouseListenermousePressedmouseReleased事件。

您應該在mousePressed中啓動一個新的Thread,將該實例存儲在某個地方,並將其停止在mouseReleased上。

請參閱文檔以瞭解更多詳細信息。