CountDownTimer不以onResume()开头

时间:2016-12-27 06:51:29

标签: android timer android-lifecycle countdowntimer

我在片段中使用CountDownTimer。我希望计时器在应用程序进入后台时暂停,并在用户返回时恢复。正如在其他SO问题中所建议的那样,我在托管活动的onPause()中取消了计时器,并从同一时间点开始在onResume()中启动一个新计时器(维护一个静态变量millisLeft)。

我不知道为什么但是计时器没有在onResume()中再次启动(我尝试登录onResume()但是没有出现日志意味着计时器从未启动过)。请帮帮我。谢谢。

public class MainFragment extends Fragment implements NavigationView.OnNavigationItemSelectedListener {

    private View rootView;
    private ComprehensionDb db;
    CountDownTimer countDownTimer;
    static long millisLeft;
    TextView timer;

    public static Fragment newInstance() {
        return new MainFragment();
    }

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {

        rootView = inflater.inflate(R.layout.main, container, false);
        Toolbar toolbar = (Toolbar) rootView.findViewById(R.id.toolbar);
        toolbar.setBackgroundColor(ContextCompat.getColor(getActivity(), R.color.colorPrimary_comprehension));
        toolbar.inflateMenu(R.menu.menu_main_white);

        toolbar.setOnMenuItemClickListener(new Toolbar.OnMenuItemClickListener() {
            @Override
            public boolean onMenuItemClick(MenuItem menuItem) {
                switch (menuItem.getItemId()) {
                    case R.id.action_about:
                        AlertDialog.Builder builder =
                                new AlertDialog.Builder(getActivity());
                        builder.setTitle(String.format("%1$s", getString(R.string.comprehension_about_us)));
                        builder.setMessage(getResources().getText(R.text));
                        builder.setPositiveButton("OK", null);
                        AlertDialog welcomeAlert = builder.create();
                        welcomeAlert.show();
                        assert welcomeAlert.findViewById(android.R.id.message) != null;
                        assert welcomeAlert.findViewById(android.R.id.message) != null;
                        assert ( welcomeAlert.findViewById(android.R.id.message)) != null;
                        ((TextView) welcomeAlert.findViewById(android.R.id.message)).setMovementMethod(LinkMovementMethod.getInstance());
                        break;
                    default: //do nothing
                        break;
                }
                return true;
            }
        });

        DrawerLayout drawer = (DrawerLayout) rootView.findViewById(R.id.drawer_layout);
        ActionBarDrawerToggle toggle = new ActionBarDrawerToggle(
                getActivity(), drawer, toolbar, R.string.comprehension_navigation_drawer_open, R.string.comprehension_navigation_drawer_close);
        drawer.addDrawerListener(toggle);
        toggle.syncState();

        NavigationView navigationView = (NavigationView) rootView.findViewById(R.id.nav_view);
        navigationView.setNavigationItemSelectedListener(this);


        db = new ComprehensionDb(getActivity());
        db.open();
        db.resetCount();

        Cursor cursor = db.getMetaCursor();
        cursor.moveToFirst();
        String title = cursor.getString(Constants.COL_TITLE);
        toolbar.setTitle(title);
        String passage = cursor.getString(Constants.COL_PASSAGE);
        final long time = cursor.getLong(Constants.COL_TIME);
        timer = (TextView) rootView.findViewById(R.id.timer);
        assert timer != null;
        timer.setText(String.valueOf(time));

         countDownTimer = new CountDownTimer(time * 1000, 1000) {

            public void onTick(long millisUntilFinished) {
                millisLeft = millisUntilFinished;
                long min = millisUntilFinished / 60000;
                long sec = millisUntilFinished / 1000 - min * 60;
                timer.setText(String.format(Locale.getDefault(), "%1$d:%2$02d", min, sec));
            }

            public void onFinish() {

                Bundle arguments = new Bundle();
                arguments.putString(Intent.EXTRA_TEXT, "1");

                Fragment frag = QuestionFragment.newInstance();
                frag.setArguments(arguments);
                if(getActivity()!=null) {
                    getActivity().getSupportFragmentManager().popBackStack(null, FragmentManager.POP_BACK_STACK_INCLUSIVE);
                    getActivity().getSupportFragmentManager().beginTransaction().replace(((ViewGroup) getView().getParent()).getId(), frag).addToBackStack(null).commit();
                }
            }
        }.start();

        Menu m = navigationView.getMenu();
        SubMenu topChannelMenu = m.addSubMenu("Questions");
        long numQues = db.getCountQuestions();

        for (int i = 1; i <= numQues; i++) {
            topChannelMenu.add(String.format(Locale.getDefault(), "Question %1$d", i));
            topChannelMenu.getItem(i - 1).setIcon(R.drawable.ic_assignment_black_24dp);
            final int finalI = i;
            topChannelMenu.getItem(i - 1).setOnMenuItemClickListener(new MenuItem.OnMenuItemClickListener() {
                @Override
                public boolean onMenuItemClick(MenuItem item) {

                    Bundle arguments = new Bundle();
                    arguments.putString(Intent.EXTRA_TEXT, String.valueOf(finalI));
                    countDownTimer.cancel();
                    Fragment frag = QuestionFragment.newInstance();
                    frag.setArguments(arguments);
                    getActivity().getSupportFragmentManager().popBackStack(null, FragmentManager.POP_BACK_STACK_INCLUSIVE);

                    getActivity().getSupportFragmentManager().beginTransaction().replace(((ViewGroup) getView().getParent()).getId(), frag).addToBackStack(null).commit();
                    return false;
                }
            });
        }

        MenuItem mi = m.getItem(m.size() - 1);
        mi.setTitle(mi.getTitle());

        ((TextView) rootView.findViewById(R.id.passage)).setText(passage);
        rootView.findViewById(R.id.go_to_ques).setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {

                Bundle arguments = new Bundle();
                arguments.putString(Intent.EXTRA_TEXT, "1");
                countDownTimer.cancel();
                Fragment frag = QuestionFragment.newInstance();
                frag.setArguments(arguments);
                getActivity().getSupportFragmentManager().popBackStack(null, FragmentManager.POP_BACK_STACK_INCLUSIVE);

                getActivity().getSupportFragmentManager().beginTransaction().replace(((ViewGroup) getView().getParent()).getId(), frag).addToBackStack(null).commit();

            }
        });

        return rootView;
    }

    @Override
    public void onDestroyView() {
        super.onDestroyView();
        db.close();
        ViewGroup mContainer = (ViewGroup) getActivity().findViewById(R.id.container);
        mContainer.removeAllViews();
    }

    @Override
    public boolean onNavigationItemSelected(MenuItem item) {
        DrawerLayout drawer = (DrawerLayout) rootView.findViewById(R.id.drawer_layout);
        drawer.closeDrawer(GravityCompat.START);
        return true;
    }

    @Override
    public void onResume() {
        if(countDownTimer==null)
            countDownTimer = new CountDownTimer(millisLeft * 1000, 1000) {

                public void onTick(long millisUntilFinished) {
                    long min = millisUntilFinished / 60000;
                    long sec = millisUntilFinished / 1000 - min * 60;
                    Log.e("sachin",""+millisUntilFinished);
                    timer.setText(String.format(Locale.getDefault(), "%1$d:%2$02d", min, sec));
                }

                public void onFinish() {

                    Bundle arguments = new Bundle();
                    arguments.putString(Intent.EXTRA_TEXT, "1");

                    Fragment frag = QuestionFragment.newInstance();
                    frag.setArguments(arguments);
                    if(getActivity()!=null) {
                        getActivity().getSupportFragmentManager().popBackStack(null, FragmentManager.POP_BACK_STACK_INCLUSIVE);
                        getActivity().getSupportFragmentManager().beginTransaction().replace(((ViewGroup) getView().getParent()).getId(), frag).addToBackStack(null).commit();
                    }
                }
            }.start();
        super.onResume();
    }

    @Override
    public void onPause() {
        countDownTimer.cancel();
        super.onPause();
    }

}

1 个答案:

答案 0 :(得分:4)

onPause你正在做countDownTimer.cancel();没有将countDownTimer设置为null。 将其设置为null并尝试或删除onResume

中的空检查