代码如下:
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();
}
它现在将正确地删除回调,我不会得到口吃出现和消失的元素了。