2016-11-15 51 views
1

上我有如下代碼:的Android除去回調postdelayed xml元素

myelement.postDelayed(new Runnable() { 
    public void run() { 
     myelement.setVisibility(View.GONE); 
    } }, 8000); 

我想要這個刪除回調每次的onStop()或的onPause()發生的情況。

我在其他文章SO閱讀,你可以這樣做:

handler.removeCallbacks(null); 
handler.removeCallbacksAndMessages(null); 
handler.removeCallbacks(runnable); 

當我試圖做的事:

public synchronized void onPause() {  // on pause 
    myelement.removeCallbacks(null); 
    super.onPause();       
} 

,並試圖來回活動之間。然而,當我試圖做到這一點時,元素就像有時顯示元素半秒鐘,有時是整秒鐘,有時會起作用。等等。

回答

1

removeCallback()方法需要一個可運行的,所以你必須保持對它的引用。

例如爲:

public class DemoActivity extends AppCompatActivity { 

    private static final String TAG = "Demo"; 
    private Handler mHandler; 
    private Runnable mRunnable; 
    private View mView; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 
     mView = findViewById(R.id.some_view); 
     mHandler = new Handler(); 
     doSomethingInFiveSeconds(); 
    } 

    void doSomethingInFiveSeconds() { 
     mRunnable = new Runnable() { 
      @Override 
      public void run() { 
       Log.d(TAG, "run: Post Delayed!"); 

       if (mView != null) { 
        // Animate it… 
        mView.animate().alpha(0).setDuration(250); 
        // or just make it disappear 
        // mView.setVisibility(View.GONE); 
       } 
      } 
     }; 
     mHandler.postDelayed(mRunnable, 5000); 
    } 

    @Override 
    protected void onStop() { 
     if (mRunnable != null) { 
      mHandler.removeCallbacks(mRunnable); 
     } 

     super.onStop(); 
    } 
} 

此外,很難說你的觀點是這樣做,因爲你還沒有真正顯示太多的代碼。如果有疑問,請確保您的處理程序正在主線程上循環(默認情況下爲)。我不知道你的myelement是什麼。

+0

感謝您的代碼!雖然這不是確切的解決方案,但它確實幫助我通過驗證一些要點來達到我的最佳解決方案。我還在您的建議中添加了'mRunnable!= null'塊來檢查非空runnable。乾杯! – publicknowledge

0

myelement是一個佈局元素(在這種情況下是LinearLayout),我需要在活動開始時彈出並在一段時間後消失,因此使用可運行。

我想到回調不起作用的原因是因爲我的runnable無法引用。所以我做了以下。

解決方案:外的onCreate

,創建一個全局變量:

private Runnable myRunnable; 

...和改變了代碼塊(在上面的問題),以:

myelement.postDelayed(myRunnable = new Runnable() { 
    public void run() { myelement.setVisibility(View.GONE); } 
}, 8000); 

這樣onPause()onStop()裏面我做的時候:

public synchronized void onPause() {   
    if(myRunnable!=null){ 
     myelement.removeCallbacks(myRunnable); 
    } 
    super.onPause(); 
} 

它現在可以正確刪除回調,並且我不會再出現口吃出現和消失的元素。