login - My Android alert appears twice after logging in -
i'm testing out notification tells user of android app whether or not there internet connection. have inserted code onresume
function, seen below:
@override protected void onresume(){ super.onresume(); alertdialog.builder builder = new alertdialog.builder(this); builder.setpositivebutton(r.string.ok, new dialoginterface.onclicklistener() { public void onclick(dialoginterface dialog, int id) { dialog.dismiss(); } }); if(isnetworkconnected()){ builder.setmessage(r.string.yes_internet) .settitle(r.string.title); } else{ builder.setmessage(r.string.no_internet) .settitle(r.string.title); } alertdialog dialog = builder.create(); dialog.show(); } private boolean isnetworkconnected() { connectivitymanager cm = (connectivitymanager) getsystemservice(context.connectivity_service); networkinfo ni = cm.getactivenetworkinfo(); if (ni == null) { // there no active networks. return false; } else{ return true; } }
which works fine. except part after log in, see alert, , dismiss it, identical alert appears. happens after logging in, not happen if leave app , come it. login activity (which 1 automatically generated eclipse) called oncreate
, run when app launched. so, appear login activity causing onresume
called twice. have no idea be.
here code login activity:
/** * activity displays login screen user, offering registration * well. */ public class loginactivity extends activity { /** * dummy authentication store containing known user names , passwords. * todo: remove after connecting real authentication system. */ private static final string[] dummy_credentials = new string[] { "foo@example.com:hello", "bar@example.com:world" }; /** * default email populate email field with. */ public static final string extra_email = "com.example.android.authenticatordemo.extra.email"; /** * keep track of login task ensure can cancel if requested. */ private userlogintask mauthtask = null; // values email , password @ time of login attempt. private string memail; private string mpassword; // ui references. private edittext memailview; private edittext mpasswordview; private view mloginformview; private view mloginstatusview; private textview mloginstatusmessageview; @override protected void oncreate(bundle savedinstancestate) { super.oncreate(savedinstancestate); setcontentview(r.layout.activity_login); // set login form. memail = getintent().getstringextra(extra_email); memailview = (edittext) findviewbyid(r.id.email); memailview.settext(memail); mpasswordview = (edittext) findviewbyid(r.id.password); mpasswordview .setoneditoractionlistener(new textview.oneditoractionlistener() { @override public boolean oneditoraction(textview textview, int id, keyevent keyevent) { if (id == r.id.login || id == editorinfo.ime_null) { attemptlogin(); return true; } return false; } }); mloginformview = findviewbyid(r.id.login_form); mloginstatusview = findviewbyid(r.id.login_status); mloginstatusmessageview = (textview) findviewbyid(r.id.login_status_message); findviewbyid(r.id.sign_in_button).setonclicklistener( new view.onclicklistener() { @override public void onclick(view view) { attemptlogin(); } }); } @override public boolean oncreateoptionsmenu(menu menu) { super.oncreateoptionsmenu(menu); getmenuinflater().inflate(r.menu.login, menu); return true; } /** * attempts sign in or register account specified login form. * if there form errors (invalid email, missing fields, etc.), * errors presented , no actual login attempt made. */ public void attemptlogin() { if (mauthtask != null) { return; } // reset errors. memailview.seterror(null); mpasswordview.seterror(null); // store values @ time of login attempt. memail = memailview.gettext().tostring(); mpassword = mpasswordview.gettext().tostring(); boolean cancel = false; view focusview = null; // check valid password. if (textutils.isempty(mpassword)) { mpasswordview.seterror(getstring(r.string.error_field_required)); focusview = mpasswordview; cancel = true; } else if (mpassword.length() < 4) { mpasswordview.seterror(getstring(r.string.error_invalid_password)); focusview = mpasswordview; cancel = true; } // check valid email address. if (textutils.isempty(memail)) { memailview.seterror(getstring(r.string.error_field_required)); focusview = memailview; cancel = true; } else if (!memail.contains("@")) { memailview.seterror(getstring(r.string.error_invalid_email)); focusview = memailview; cancel = true; } if (cancel) { // there error; don't attempt login , focus first // form field error. focusview.requestfocus(); } else { // show progress spinner, , kick off background task // perform user login attempt. mloginstatusmessageview.settext(r.string.login_progress_signing_in); showprogress(true); mauthtask = new userlogintask(); mauthtask.execute((void) null); } } /** * shows progress ui , hides login form. */ @targetapi(build.version_codes.honeycomb_mr2) private void showprogress(final boolean show) { // on honeycomb mr2 have viewpropertyanimator apis, allow // easy animations. if available, use these apis fade-in // progress spinner. if (build.version.sdk_int >= build.version_codes.honeycomb_mr2) { int shortanimtime = getresources().getinteger( android.r.integer.config_shortanimtime); mloginstatusview.setvisibility(view.visible); mloginstatusview.animate().setduration(shortanimtime) .alpha(show ? 1 : 0) .setlistener(new animatorlisteneradapter() { @override public void onanimationend(animator animation) { mloginstatusview.setvisibility(show ? view.visible : view.gone); } }); mloginformview.setvisibility(view.visible); mloginformview.animate().setduration(shortanimtime) .alpha(show ? 0 : 1) .setlistener(new animatorlisteneradapter() { @override public void onanimationend(animator animation) { mloginformview.setvisibility(show ? view.gone : view.visible); } }); } else { // viewpropertyanimator apis not available, show // , hide relevant ui components. mloginstatusview.setvisibility(show ? view.visible : view.gone); mloginformview.setvisibility(show ? view.gone : view.visible); } } /** * represents asynchronous login/registration task used authenticate * user. */ public class userlogintask extends asynctask<void, void, boolean> { @override protected boolean doinbackground(void... params) { // todo: attempt authentication against network service. try { // simulate network access. thread.sleep(2000); } catch (interruptedexception e) { return false; } (string credential : dummy_credentials) { string[] pieces = credential.split(":"); if (pieces[0].equals(memail)) { // account exists, return true if password matches. return pieces[1].equals(mpassword); } } // todo: register new account here. return true; } @override protected void onpostexecute(final boolean success) { mauthtask = null; showprogress(false); if (success) { finish(); } else { mpasswordview .seterror(getstring(r.string.error_incorrect_password)); mpasswordview.requestfocus(); } } @override protected void oncancelled() { mauthtask = null; showprogress(false); } }
i think possible scenario mainactivity's onresume called twice, assume start loginactivity in mainactivity's oncreate:
- mainactivity created , loginactivity launched. mainactivity still continues lifecycle - onresume called (and onpause right after etc..)...
- when finish loginactivity, mainactivity resumed again - onresume called second time.
you can consider saving boolean value (or whole dialog) preserve showing dialog second time, or can change workflow mainactivity started after successful login.
Comments
Post a Comment