的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
是什么。
答
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();
}
它现在可以正确删除回调,并且我不会再出现口吃出现和消失的元素。
感谢您的代码!虽然这不是确切的解决方案,但它确实帮助我通过验证一些要点来达到我的最佳解决方案。我还在您的建议中添加了'mRunnable!= null'块来检查非空runnable。干杯! – publicknowledge