2016-12-16 75 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

我編輯了我的問題,請檢查一次。 –