的Android除去回调postdelayed xml元素

问题描述:

上我有如下代码:的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();       
} 

,并试图来回活动之间。然而,当我试图做到这一点时,元素就像有时显示元素半秒钟,有时是整秒钟,有时会起作用。等等。

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

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(); 
} 

它现在可以正确删除回调,并且我不会再出现口吃出现和消失的元素。