我在片段中使用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();
}
}
答案 0 :(得分:4)
在onPause
你正在做countDownTimer.cancel();
没有将countDownTimer设置为null。
将其设置为null并尝试或删除onResume