2014-03-31 51 views
0

正在開發使用navigationDrawerAndroid應用程序。我希望抽屜在五秒鐘後自行關閉它,這是它的作用。問題是navigationDrawer關閉後thread正在運行。所以如果我在2秒鐘後手動關閉navigationDrawer,然後重新打開它,約3秒後它會自動關閉。關閉導航帶處理程序計時器的抽紙機

我能做些什麼來解決這個問題?我一直試圖殺死處理程序,但無法使其正常工作。

public void counter() { 
      final Handler handler = new Handler(); 
      handler.postDelayed(new Runnable() { 
       @Override 
       public void run() { 
        mDrawerLayout.closeDrawer(mDrawerList_Right); 
        mDrawerLayout.closeDrawer(mDrawerList_Left); 
       } 
      }, 5000); 
     } 

     public void onDrawerClosed(View view) { 
      getActionBar().setTitle(mTitle); 
      // calling onPrepareOptionsMenu() to show action bar icons 
      invalidateOptionsMenu(); 
     } 

     public void onDrawerOpened(View drawerView) { 
      getActionBar().setTitle(mDrawerTitle); 
      // calling onPrepareOptionsMenu() to hide action bar icons 
      invalidateOptionsMenu(); 
      counter(); 

     } 
    }; 

回答

0

試試這個:

private static int counterValue = 1; 
private static int lastCounterValue; 

public void counter(final int counter) { 
     final Handler handler = new Handler(); 
     handler.postDelayed(new Runnable() { 
      @Override 
      public void run() { 
       if (lastCounterValue == counter) 
       { 
        mDrawerLayout.closeDrawer(mDrawerList_Right); 
        mDrawerLayout.closeDrawer(mDrawerList_Left); 
       } 
      } 
     }, 5000); 
    } 

    public void onDrawerClosed(View view) { 
     getActionBar().setTitle(mTitle); 
    counterValue++; 
     // calling onPrepareOptionsMenu() to show action bar icons 
     invalidateOptionsMenu(); 
    } 

    public void onDrawerOpened(View drawerView) { 
     getActionBar().setTitle(mDrawerTitle); 
     // calling onPrepareOptionsMenu() to hide action bar icons 
     invalidateOptionsMenu(); 
    lastCounterValue = counterValue; 
     counter(counterValue); 

    } 
}; 
+0

沒有工作,線程仍在運行並關閉抽屜。 – Stains

+0

嗯,也許嘗試使用靜態布爾值 – kstachniuk

+0

與以前一樣的問題。 – Stains

0

您可以撥打handler.removeCallbacks(Runnable)擺脫掛起(不是噴執行)可運行的。但要做到這一點,你必須修改你的代碼。使處理器全球,使全球的Runnable這樣的:

Handler handler = new Handler(); 

public Runnable r = new Runnable() { 
    @Override 
    public void run() { 
     mDrawerLayout.closeDrawer(mDrawerList_Right); 
     mDrawerLayout.closeDrawer(mDrawerList_Left); 
    } 
} 

現在你可以打電話給他們在你的方法是這樣的:

public void counter() { 

    handler.postDelayed(r, 5000); // call the runnable 
} 

在您身邊的回調,從抽屜中取出的可運行:

public void onDrawerClosed(View view) { 

    handler.removeCallbacks(r); 

    getActionBar().setTitle(mTitle); 
    // calling onPrepareOptionsMenu() to show action bar icons 
    invalidateOptionsMenu(); 
} 

public void onDrawerOpened(View drawerView) { 
    getActionBar().setTitle(mDrawerTitle); 
    // calling onPrepareOptionsMenu() to hide action bar icons 
    invalidateOptionsMenu(); 
    counter(); 
} 
+0

我仍然害怕同樣的問題。 – Stains

+0

removeCallbacks()不殺死已經運行的線程,它只是清除隊列。任何其他選項? – Stains

+0

刪除布爾型drawerOpened。 –