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是多少

myelement是一个布局元素(在这种情况下的LinearLayout),我需要在活动开始时弹出并在一段时间后消失,因此使用runnable。

我认为回调不工作的原因首先是因为我的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();
}

它现在将正确地删除回调,我不会得到口吃出现和消失的元素了。

最新更新