【发布时间】:2017-05-01 22:32:30
【问题描述】:
我正在下面的片段中启动处理程序:
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 中,所以当我切换选项卡并加载其他片段时,处理程序不会停止。请在活动中检查以下代码:
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);
}
但仍会调用处理程序。
如果有人对此有任何想法,请帮助我。
提前非常感谢
【问题讨论】:
-
你放断点检查了吗?
-
我在 onDetach、onDestroy 和 onStop 函数中添加了打印语句,但是当在同一个活动中替换新片段时,这些函数都不会被调用。如果您有任何想法,请帮助我。
-
如何替换片段?贴出代码
-
您可以在替换另一个片段时调用 removeCallBack。请注意,您可以使用接口作为回调与托管活动通信
-
我在活动中使用此代码来替换片段。
if (fragment != null) { FragmentManager fragmentManager = getSupportFragmentManager(); FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction(); fragmentTransaction.replace(R.id.main_content, fragment).commit(); }使用替换功能不再显示片段时,将调用片段生命周期的哪个方法。