android - Login try and Login has leaked window -
i have login activity. problem has been driving me crazy on 2 days. when insert correct username , password, login successful. when insert wrong username or password, app freezes. think have correct dialog dismiss according search on stackoverflow main leak in circumstances login activity
package com.example.tranfer; import java.util.arraylist; import java.util.list; import org.apache.http.namevaluepair; import org.apache.http.message.basicnamevaluepair; import org.json.jsonexception; import org.json.jsonobject; import android.app.activity; import android.app.progressdialog; import android.content.intent; import android.os.asynctask; import android.os.bundle; import android.util.log; import android.view.view; import android.view.view.onclicklistener; import android.widget.button; import android.widget.edittext; import android.widget.toast; public class login extends activity implements onclicklistener { private edittext user, pass; private button msubmit, mregister; private string username, password; // progress dialog private progressdialog pdialog; // json parser class jsonparser jsonparser = new jsonparser(); // php login script location: // localhost : // testing on device // put local ip instead, on windows, run cmd > ipconfig // or in mac's terminal type ifconfig , ip under en0 or en1 // private static final string login_url = // "http://xxx.xxx.x.x:1234/webservice/login.php"; // testing on emulator:private static final string login_url = "http://******"; // testing real server: // private static final string login_url = // "http://www.yourdomain.com/webservice/login.php"; // json element ids response of php script: private static final string tag_success = "success"; private static final string tag_message = "message"; @override protected void oncreate(bundle savedinstancestate) { // todo auto-generated method stub super.oncreate(savedinstancestate); setcontentview(r.layout.login); // setup input fields user = (edittext) findviewbyid(r.id.editusername); pass = (edittext) findviewbyid(r.id.editpassword); // setup buttons msubmit = (button) findviewbyid(r.id.signin); mregister = (button) findviewbyid(r.id.register); // register listeners msubmit.setonclicklistener(this); mregister.setonclicklistener(this); } @override public void onclick(view v) { // todo auto-generated method stub switch (v.getid()) { case r.id.signin: new attemptlogin().execute(); break; case r.id.register: intent = new intent(this, registrationform.class); startactivity(i); break; default: break; } } class attemptlogin extends asynctask<string, string, string> { /** * before starting background thread show progress dialog * */ boolean failure = false; @override protected void onpreexecute() { super.onpreexecute(); pdialog = new progressdialog(login.this); pdialog.setmessage("Προσπάθεια σύνδεσης..."); pdialog.setindeterminate(false); pdialog.setcancelable(true); pdialog.show(); } @override protected string doinbackground(string... args) { // todo auto-generated method stub // check success tag int success; username = user.gettext().tostring(); password = pass.gettext().tostring(); try { // building parameters list<namevaluepair> params = new arraylist<namevaluepair>(); params.add(new basicnamevaluepair("username", username)); params.add(new basicnamevaluepair("password", password)); log.d("request!", "starting"); // getting product details making http request jsonobject json = jsonparser.makehttprequest(login_url, "post", params); // check log json response log.d("login attempt", json.tostring()); // json success tag success = json.getint(tag_success); if (success == 1) { log.d("login successful!", json.tostring()); intent = new intent(login.this, mainactivity1.class); finish(); startactivity(i); return json.getstring(tag_message); } else { log.d("login failure!", json.getstring(tag_message)); return json.getstring(tag_message); } } catch (jsonexception e) { e.printstacktrace(); } return null; } /** * after completing background task dismiss progress dialog * **/ protected void onpostexecute(string file_url) { // dismiss dialog once product deleted pdialog.dismiss(); if (file_url != null) { toast.maketext(login.this, file_url, toast.length_long).show(); } } } }
my php file
<?php //load , connect mysql database stuff require("config.inc.php"); if (!empty($_post)) { //gets user's info based off of username. $query = " select id, username, password users username = :username "; $query_params = array( ':username' => $_post['username'] ); try { $stmt = $db->prepare($query); $result = $stmt->execute($query_params); } catch (pdoexception $ex) { // testing, use die , message. //die("failed run query: " . $ex->getmessage()); //or use use 1 product json data: $response["success"] = 0; $response["message"] = "database error1. please try again!"; die(json_encode($response)); } //this variable determine whether or not user's information correct. //we initialize false. $validated_info = false; //fetching rows query $row = $stmt->fetch(); if ($row) { //if encrypted password, unencrypt here, in our case //compare 2 passwords if ($_post['password'] === $row['password']) { $login_ok = true; } } if ($login_ok) { $response["success"] = 1; $response["message"] = "login successful!"; die(json_encode($response)); } else { $response["success"] = 0; $response["message"] = "invalid credentials!"; die(json_encode($response)); } } else { ?> <h1>login</h1> <form action="login.php" method="post"> username:<br /> <input type="text" name="username" placeholder="username" /> <br /><br /> password:<br /> <input type="password" name="password" placeholder="password" value="" /> <br /><br /> <input type="submit" value="login" /> </form> <a href="register.php">register</a> <?php } ?>
logcat
05-29 22:01:23.388: e/windowmanager(24822): activity com.example.tranfer.login has leaked window com.android.internal.policy.impl.phonewindow $decorview@4272a7f0 added here 05-29 22:01:23.388: e/windowmanager(24822): android.view.windowleaked: activity com.example.tranfer.login has leaked window com.android.internal.policy.impl.phonewindow$decorview@4272a7f0 added here 05-29 22:01:23.388: e/windowmanager(24822): @ android.view.viewrootimpl.<init>(viewrootimpl.java:415) 05-29 22:01:23.388: e/windowmanager(24822): @ android.view.windowmanagerimpl.addview(windowmanagerimpl.java:322) 05-29 22:01:23.388: e/windowmanager(24822): @ android.view.windowmanagerimpl.addview(windowmanagerimpl.java:234) 05-29 22:01:23.388: e/windowmanager(24822): @ android.view.windowmanagerimpl$compatmodewrapper.addview(windowmanagerimpl.java:153) 05-29 22:01:23.388: e/windowmanager(24822): @ android.view.window$localwindowmanager.addview(window.java:559) 05-29 22:01:23.388: e/windowmanager(24822): @ android.app.dialog.show(dialog.java:301) 05-29 22:01:23.388: e/windowmanager(24822): @ com.example.tranfer.login$attemptlogin.onpreexecute(login.java:106) 05-29 22:01:23.388: e/windowmanager(24822): @ android.os.asynctask.executeonexecutor(asynctask.java:586) 05-29 22:01:23.388: e/windowmanager(24822): @ android.os.asynctask.execute(asynctask.java:534) 05-29 22:01:23.388: e/windowmanager(24822): @ com.example.tranfer.login.onclick(login.java:80) 05-29 22:01:23.388: e/windowmanager(24822): @ android.view.view.performclick(view.java:4262) 05-29 22:01:23.388: e/windowmanager(24822): @ android.view.view$performclick.run(view.java:17421) 05-29 22:01:23.388: e/windowmanager(24822): @ android.os.handler.handlecallback(handler.java:615) 05-29 22:01:23.388: e/windowmanager(24822): @ android.os.handler.dispatchmessage(handler.java:92) 05-29 22:01:23.388: e/windowmanager(24822): @ android.os.looper.loop(looper.java:137) 05-29 22:01:23.388: e/windowmanager(24822): @ android.app.activitythread.main(activitythread.java:4944) 05-29 22:01:23.388: e/windowmanager(24822): @ java.lang.reflect.method.invokenative(native method) 05-29 22:01:23.388: e/windowmanager(24822): @ java.lang.reflect.method.invoke(method.java:511) 05-29 22:01:23.388: e/windowmanager(24822): @ com.android.internal.os.zygoteinit$methodandargscaller.run(zygoteinit.java:1038) 05-29 22:01:23.388: e/windowmanager(24822): @ com.android.internal.os.zygoteinit.main(zygoteinit.java:805) 05-29 22:01:23.388: e/windowmanager(24822): @ dalvik.system.nativestart.main(native method)
i think it's because progressdialog
not close before going next activity.
change:
if (success == 1) { log.d("login successful!", json.tostring()); intent = new intent(login.this, mainactivity1.class); finish(); startactivity(i); return json.getstring(tag_message); }
to:
if (success == 1) { pdialog.dismiss(); log.d("login successful!", json.tostring()); intent = new intent(login.this, mainactivity1.class); finish(); startactivity(i); return json.getstring(tag_message); }
you should make sure pdialog.dismss();
in ondestroy()
method if not null.
Comments
Post a Comment