片段被销毁时停止处理程序

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);
}

在其他片段中只实现接口什么也不做。