0

我有一个片段。在这个片段中,我有一个定期运行 timertask 的 Timer。我重写onPause了,所以当切换片段时,TimerTask 和计时器将停止它的工作。

@Override
        public void onPause() {
            super.onPause();
            timerTask.cancel();
            timer.cancel();
            timer.purge();
        }

这是我切换片段的代码:

OrderFragment fragment2 = new OrderFragment();
                    fragment2.setArguments(arguments);
                    getSupportFragmentManager().beginTransaction().replace(R.id.item_detail_container, fragment2).commit();

但是当我切换不同的片段时,我经常收到Null Point Exception因为 TimerTask 无法访问 UI Thread 了(因为我已经使用过runOnUIThread

所以,我的问题是:如何确保 Timer 和 TimerTask 在我可以更改片段之前停止所有工作。

谢谢 :)

4

3 回答 3

1

仅仅通过切换显示的片段,您的片段可能不会进入后台。它的生命周期取决于 Activity 的。我认为,如果您添加Log.d("yourFragment", "onPause()");到 onPause() 方法,您会发现这是真的。

片段生命周期可以在这里找到:

http://developer.android.com/guide/components/fragments.html

请注意,它表示您的片段何时被删除/替换,但如果您只是从您的活动中显示另一个不计入的片段;)

于 2013-04-05T02:20:54.600 回答
1

似乎onHiddenChanged(boolean hidden)是您需要的。从Fragment onPause()文档中:

这通常与包含 Activity 生命周期的 Activity.onPause 相关联。

所以onPause()当片段不再可见时不一定调用。将您的计时器取消代码移动到onHiddenChanged().

于 2013-04-05T03:00:50.700 回答
0

将您的timer.cancle 作为声明放在此上方:

timer.cancel();
OrderFragment fragment2 = new OrderFragment();
                fragment2.setArguments(arguments);  
getSupportFragmentManager().beginTransaction().replace(R.id.item_detail_container,      
fragment2).commit();


Declare private Timer timer; at class level
于 2013-04-05T13:18:48.373 回答