2015-07-21 22 views
0

因此,如果拖動幾乎在draggingzone之外,我有線程檢查每10ms的線程。基本上我的線程代碼沒有做到99%的時間,所以我應該讓它暫停並在需要時才恢復?或者,當左右兩邊都是錯誤的時候,這個字面上什麼都不會做?我是否應該暫停我的線程Android

我的代碼看起來像這樣

timer = new Thread() { //new thread 
     public void run() { 
      b = true; 
      try { 
       do { 
        sleep(10); 
        runOnUiThread(new Runnable() { 

         @Override 
         public void run() { 
          if (right) { 
           dragzone.moveleft(-5); 
          } else if (left) { 
           dragzone.moveleft(5); 
          } 
         } 
        }); 
       } 
       while (b); 
      } catch (InterruptedException e) { 
      } 
     } 

     ; 
    }; 
    timer.start(); 

回答

0

這不是一個真正的好做法,以保持其運行。您可以在檢測到Drag操作時啓動它,然後在完成時釋放它。

1

它看起來像在這裏使用一個線程是沒有必要的,你應該切換到使用一個處理器和postDelayed()

首先,聲明你的處理程序,布爾值,和一個Runnable實例變量:

Handler handler; 
boolean b; 

Runnable checkDragZone = new Runnable(){ 
    @Override 
    public void run() { 
     if (right) { 
      dragzone.moveleft(-5); 
     } else if (left) { 
      dragzone.moveleft(5); 
     } 

     if (b){ 
      handler.postDelayed(this, 10); 
     } 

    } 
}; 

開始監視,設置b爲真,並啓動了Runnable:

handler = new Handler(); 
    b = true; 
    handler.postDelayed(checkDragZone, 10); 

要停止它(暫時或permane ntly),只需設置b爲false:

b = false; 
+0

這是工作幾乎一樣好它應該是。但是在很多拖動事件之後,會有很多處理程序同時運行。因爲它每次都會開始新的。正因爲如此,它每10ms執行多次dragzone.moveleft。我怎麼能先暫停處理程序,然後在另一個dragevent開始時恢復呢? – niksi

+0

所以在onCreate我首先做這個'handler = new Handler(); ' 並在ACTION_DRAG_STARTED我這樣做 'b = true; handler.postDelayed(checkDragZone,10);' 然後在ACTION_DROP 'handler.removeCallbacks(checkDragZone); b = false;' 它似乎工作,但這是正確的方式來使用處理程序? – niksi

0
Runnable runnable; 
Thread globalThread; 

public void startThread() { 
    if (threadController) { 
     runnable = new Runnable() { 
      @Override 
      public void run() { 


       while (threadController) { 

        for (int i = 0; i < adapter.getCount(); i++) { 
         final int value = i; 

         try { 

          Thread.sleep(4000); 


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


         handler.post(new Runnable() { 
          @Override 
          public void run() { 

           viewPager.setCurrentItem(value, true); 
          } 
         }); 
        } 

       } 
      } 
     }; 
     globalThread = new Thread(runnable); 
     globalThread.start(); 
    } else { 
     return; 
    } 
} 

@Override 
public void onPause() { 
    super.onPause(); 
    threadController = false; 

    handler.removeCallbacks(runnable); 


    runnable = null; 

    if (globalThread != null) { 
     globalThread.interrupt(); 
    } 

} 

@Override 
public void onDestroy() { 
    super.onDestroy(); 
    threadController = false; 
} 

你的決心必須是這樣的globalThread.interrupt();