2016-12-16 37 views
2

我开始处理程序片段如下图所示:停止处理程序时,片段被破坏

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功能全部回调,但它不工作。

当我在同一个活动的这个处理器 不会停止自身加载不同的片段,只处理停止当我加载在我的应用程序的一些其他 活动。

我希望这个处理程序只在我使用它的片段被加载到活动中时运行,如果某个其他片段被加载到同一个活动中,它应该被停止。

此外,这个片段是在viewpager里面,所以当我切换tab和其他片段被加载时,处理程序不会停止。请检查以下活动代码:

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

当我在那时选择任何其他选项卡时,我正在调用FeedFragment中的removeHandler方法。

public void removeHandler(){ 
     handler.removeCallbacks(runnableCode); 
    } 

但仍然处理程序正在调用。

如果有人对此有所了解,请帮助我。

非常感谢

+0

你把断点和检查? – Raghunandan

+0

我在函数onDetach,onDestroy和onStop中添加了打印语句,但是当新片段在同一活动中被替换时,这些函数都不会被调用。如果您有任何想法,请帮助我。 –

+0

你如何替换片段?发布代码 – Raghunandan

回答

3

我不认为它与您的片段生命周期有关。您需要替换

handler.removeCallbacksAndMessages(runnableCode); 
// this does not seem to work 

handler.removeCallbacks(runnableCode); 

只是一个替代方案,FeedsFragment

public void removeHandler() 
{ 
    Log.i("Stop Handler ","Yes"); 
    handler.removeCallbacks(runnableCode); 
} 

在活动创建一个方法,当你想更换片段

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处的片段。

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

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

+0

我已经使用这段代码,它工作正常,非常感谢。但是我又遇到了一个问题,那就是我的片段在viewpager中,当viewpager的其他片段被加载时,处理程序没有停止。请帮我,我该怎么做? 我在view pager上添加了'** addOnPageChangeListener **',并删除了这个片段的回调处理函数,但它不起作用,仍然调用这个处理函数。请帮助我,如果你对这个也有任何想法。 非常感谢您的帮助。 :) –

+0

@PrithnirajNicyone你是如何做到的。发布你的代码。不作为评论,但编辑的问题 – Raghunandan

+0

我编辑了我的问题,请检查一次。 –