片段被销毁时停止处理程序
Stop Handler when Fragment is destroyed
我在如下片段中启动处理程序:
public class FeedsFragment extends Fragment{
private Handler handler;
private Runnable runnableCode;
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
// Create the Handler object (on the main thread by default)
handler = new Handler();
// Define the task to be run here
runnableCode = new Runnable() {
@Override
public void run() {
// Get the No of New Feeds
getFeedCounts();
// Repeat this runnable code again every 30 seconds
handler.postDelayed(runnableCode, 30,000);
}
};
handler.post(runnableCode);
}
@Override
public void onDetach() {
super.onDetach();
handler.removeCallbacksAndMessages(runnableCode);
}
@Override
public void onDestroyView() {
handler.removeCallbacksAndMessages(runnableCode);
super.onDestroyView();
}
@Override
public void onPause() {
super.onPause();
handler.removeCallbacksAndMessages(runnableCode);
}
@Override
public void onResume() {
/**
* Start the handler again if coming back from any profile page
* or hashtag search
*/
isHandlerStopped = false;
handler.post(runnableCode);
super.onResume();
}
我正在删除 onDetach 和 onDestroyView 函数中的所有回调,但它不起作用。
When I load a different fragment in the same activity this handler
doesn't stop itself, handler stops only when I load some other
activity in my application.
我希望此处理程序 运行 仅当我正在使用它的片段加载到 activity 中时,如果其他片段正在加载到相同的 activity它应该停止。
此外,此片段位于 viewpager 内,因此当我切换选项卡并且加载其他片段时,处理程序不会停止。请检查 activity 中的以下代码:
ViewPager pager = (ViewPager) findViewById(R.id.viewpager);
FeedsFragment feedsFragment;
pager.addOnPageChangeListener(new ViewPager.OnPageChangeListener() {
@Override
public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {
}
@Override
public void onPageSelected(int position) {
// when user do a swipe the selected tab change
switch (position){
case 0:
break;
case 1:
feedsFragment.removeHandler();
break;
case 2:
feedsFragment.removeHandler();
break;
case 3:
feedsFragment.removeHandler();
break;
}
}
@Override
public void onPageScrollStateChanged(int state) {
}
});
FragmentAdapter adapter = new FragmentAdapter(getActivity().getSupportFragmentManager());
feedsFragment = FeedsFragment.newInstance(bundle);
adapter.addFragmentWithIcon(FeedsFragment.newInstance(null))
, mContext.getResources().getString(R.string.feed_tab_name));
adapter.addFragmentWithIcon(FeedFriendRequests.newInstance(null),
mContext.getResources().getString(R.string.requests_tab_name));
adapter.addFragmentWithIcon(NewMessagesFragment.newInstance(null), mContext.getResources().getString(R.string.message_tab_name));
adapter.addFragmentWithIcon(NotificationFragment.newInstance(null)
, mContext.getResources().getString(R.string.notification_tab_name));
pager.setAdapter(adapter);
当我 select 任何其他选项卡时,我正在调用 FeedFragment 中的 removeHandler 方法。
public void removeHandler(){
handler.removeCallbacks(runnableCode);
}
但仍在调用处理程序。
如果有人对此有想法,请帮助我。
非常感谢
我认为这与您的片段生命周期无关。你需要更换
handler.removeCallbacksAndMessages(runnableCode);
// this does not seem to work
和
handler.removeCallbacks(runnableCode);
只是在 FeedsFragment 中创建一个方法的替代方法
public void removeHandler()
{
Log.i("Stop Handler ","Yes");
handler.removeCallbacks(runnableCode);
}
在activity时要替换片段
if(feedsFragment.isAdded())
{
feedsFragment.removeHandler();
}
...// rest of the code to replace the fragment with new one
编辑:
viewPager.addOnPageChangeListener(pageChangeListener);
viewPager.post(new Runnable() {
@Override
public void run() {
pageChangeListener.onPageSelected(0);
}
});
然后
ViewPager.OnPageChangeListener pageChangeListener = new ViewPager.OnPageChangeListener() {
int currentPosition = 0;
@Override
public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {
}
@Override
public void onPageSelected(int newPosition) {
FragmentLifeCycle fragmentToShow = (FragmentLifeCycle) adapter.getItem(newPosition);
fragmentToShow.onResumeFragment();
if(newPosition==0)
{
currentPosition = newPosition;
}else {
FragmentLifeCycle fragmentToHide = (FragmentLifeCycle) adapter.getItem(currentPosition);
fragmentToHide.onPauseFragment();
currentPosition = newPosition;
}
}
有界面
public interface FragmentLifeCycle {
void onPauseFragment();
void onResumeFragment();
}
在所有片段中实现接口。假设处理程序在位置 0 的 Fragment 中使用。
@Override
public void onPauseFragment() {
if(handler!=null)
handler.removeCallbacks(runnableCode);
}
@Override
public void onResumeFragment() {
handler = new Handler();
// Define the task to be run here
runnableCode = new Runnable() {
@Override
public void run() {
Log.i("Do ","Something");
handler.postDelayed(runnableCode, 3000);
}
};
handler.post(runnableCode);
}
在其他片段中只实现接口什么也不做。
我在如下片段中启动处理程序:
public class FeedsFragment extends Fragment{
private Handler handler;
private Runnable runnableCode;
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
// Create the Handler object (on the main thread by default)
handler = new Handler();
// Define the task to be run here
runnableCode = new Runnable() {
@Override
public void run() {
// Get the No of New Feeds
getFeedCounts();
// Repeat this runnable code again every 30 seconds
handler.postDelayed(runnableCode, 30,000);
}
};
handler.post(runnableCode);
}
@Override
public void onDetach() {
super.onDetach();
handler.removeCallbacksAndMessages(runnableCode);
}
@Override
public void onDestroyView() {
handler.removeCallbacksAndMessages(runnableCode);
super.onDestroyView();
}
@Override
public void onPause() {
super.onPause();
handler.removeCallbacksAndMessages(runnableCode);
}
@Override
public void onResume() {
/**
* Start the handler again if coming back from any profile page
* or hashtag search
*/
isHandlerStopped = false;
handler.post(runnableCode);
super.onResume();
}
我正在删除 onDetach 和 onDestroyView 函数中的所有回调,但它不起作用。
When I load a different fragment in the same activity this handler doesn't stop itself, handler stops only when I load some other activity in my application.
我希望此处理程序 运行 仅当我正在使用它的片段加载到 activity 中时,如果其他片段正在加载到相同的 activity它应该停止。
此外,此片段位于 viewpager 内,因此当我切换选项卡并且加载其他片段时,处理程序不会停止。请检查 activity 中的以下代码:
ViewPager pager = (ViewPager) findViewById(R.id.viewpager);
FeedsFragment feedsFragment;
pager.addOnPageChangeListener(new ViewPager.OnPageChangeListener() {
@Override
public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {
}
@Override
public void onPageSelected(int position) {
// when user do a swipe the selected tab change
switch (position){
case 0:
break;
case 1:
feedsFragment.removeHandler();
break;
case 2:
feedsFragment.removeHandler();
break;
case 3:
feedsFragment.removeHandler();
break;
}
}
@Override
public void onPageScrollStateChanged(int state) {
}
});
FragmentAdapter adapter = new FragmentAdapter(getActivity().getSupportFragmentManager());
feedsFragment = FeedsFragment.newInstance(bundle);
adapter.addFragmentWithIcon(FeedsFragment.newInstance(null))
, mContext.getResources().getString(R.string.feed_tab_name));
adapter.addFragmentWithIcon(FeedFriendRequests.newInstance(null),
mContext.getResources().getString(R.string.requests_tab_name));
adapter.addFragmentWithIcon(NewMessagesFragment.newInstance(null), mContext.getResources().getString(R.string.message_tab_name));
adapter.addFragmentWithIcon(NotificationFragment.newInstance(null)
, mContext.getResources().getString(R.string.notification_tab_name));
pager.setAdapter(adapter);
当我 select 任何其他选项卡时,我正在调用 FeedFragment 中的 removeHandler 方法。
public void removeHandler(){
handler.removeCallbacks(runnableCode);
}
但仍在调用处理程序。
如果有人对此有想法,请帮助我。
非常感谢
我认为这与您的片段生命周期无关。你需要更换
handler.removeCallbacksAndMessages(runnableCode);
// this does not seem to work
和
handler.removeCallbacks(runnableCode);
只是在 FeedsFragment 中创建一个方法的替代方法
public void removeHandler()
{
Log.i("Stop Handler ","Yes");
handler.removeCallbacks(runnableCode);
}
在activity时要替换片段
if(feedsFragment.isAdded())
{
feedsFragment.removeHandler();
}
...// rest of the code to replace the fragment with new one
编辑:
viewPager.addOnPageChangeListener(pageChangeListener);
viewPager.post(new Runnable() {
@Override
public void run() {
pageChangeListener.onPageSelected(0);
}
});
然后
ViewPager.OnPageChangeListener pageChangeListener = new ViewPager.OnPageChangeListener() {
int currentPosition = 0;
@Override
public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {
}
@Override
public void onPageSelected(int newPosition) {
FragmentLifeCycle fragmentToShow = (FragmentLifeCycle) adapter.getItem(newPosition);
fragmentToShow.onResumeFragment();
if(newPosition==0)
{
currentPosition = newPosition;
}else {
FragmentLifeCycle fragmentToHide = (FragmentLifeCycle) adapter.getItem(currentPosition);
fragmentToHide.onPauseFragment();
currentPosition = newPosition;
}
}
有界面
public interface FragmentLifeCycle {
void onPauseFragment();
void onResumeFragment();
}
在所有片段中实现接口。假设处理程序在位置 0 的 Fragment 中使用。
@Override
public void onPauseFragment() {
if(handler!=null)
handler.removeCallbacks(runnableCode);
}
@Override
public void onResumeFragment() {
handler = new Handler();
// Define the task to be run here
runnableCode = new Runnable() {
@Override
public void run() {
Log.i("Do ","Something");
handler.postDelayed(runnableCode, 3000);
}
};
handler.post(runnableCode);
}
在其他片段中只实现接口什么也不做。