我正在使用JSON和MYSQL创建一个登录应用程序,如果我输入了正确的用户名和密码值,但是每当我输入无效的条目时,它都会崩溃吗?
另一个奇怪的部分是每当我登录然后注销然后尝试一个无效的条目,它成功登录。这就像它保存以前的值,永远不会重置?
Logcat报告
09-22 18:52:26.838: E/AndroidRuntime(1924): FATAL EXCEPTION: main
09-22 18:52:26.838: E/AndroidRuntime(1924): Process: com.learn2crack.tab, PID: 1924
09-22 18:52:26.838: E/AndroidRuntime(1924): java.lang.NullPointerException
09-22 18:52:26.838: E/AndroidRuntime(1924): at com.learn2crack.tab.Login$ProcessLogin.onPostExecute(Login.java:202)
09-22 18:52:26.838: E/AndroidRuntime(1924): at com.learn2crack.tab.Login$ProcessLogin.onPostExecute(Login.java:1)
09-22 18:52:26.838: E/AndroidRuntime(1924): at android.os.AsyncTask.finish(AsyncTask.java:632)
09-22 18:52:26.838: E/AndroidRuntime(1924): at android.os.AsyncTask.access$600(AsyncTask.java:177)
09-22 18:52:26.838: E/AndroidRuntime(1924): at android.os.AsyncTask$InternalHandler.handleMessage(AsyncTask.java:645)
09-22 18:52:26.838: E/AndroidRuntime(1924): at android.os.Handler.dispatchMessage(Handler.java:102)
09-22 18:52:26.838: E/AndroidRuntime(1924): at android.os.Looper.loop(Looper.java:136)
09-22 18:52:26.838: E/AndroidRuntime(1924): at android.app.ActivityThread.main(ActivityThread.java:5017)
09-22 18:52:26.838: E/AndroidRuntime(1924): at java.lang.reflect.Method.invokeNative(Native Method)
09-22 18:52:26.838: E/AndroidRuntime(1924): at java.lang.reflect.Method.invoke(Method.java:515)
09-22 18:52:26.838: E/AndroidRuntime(1924): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:779)
09-22 18:52:26.838: E/AndroidRuntime(1924): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:595)
09-22 18:52:26.838: E/AndroidRuntime(1924): at dalvik.system.NativeStart.main(Native Method)
检查互联网连接后,onclick事件的代码段 login.java
/**
* Async Task to get and send data to My Sql database through JSON respone.
**/
private class ProcessLogin extends AsyncTask<String, String, JSONObject> {
private ProgressDialog pDialog;
String username,password;
@Override
protected void onPreExecute() {
super.onPreExecute();
inputusername = (EditText) findViewById(R.id.username);
inputPassword = (EditText) findViewById(R.id.pword);
username = inputusername.getText().toString();
password = inputPassword.getText().toString();
pDialog = new ProgressDialog(Login.this);
pDialog.setTitle("Contacting Servers");
pDialog.setMessage("Logging in ...");
pDialog.setIndeterminate(false);
pDialog.setCancelable(true);
pDialog.show();
}
@Override
protected JSONObject doInBackground(String... args) {
UserFunctions userFunction = new UserFunctions();
JSONObject json = userFunction.loginUser(username, password);
return json;
}
@Override
protected void onPostExecute(JSONObject json) {
try {
if (json.getString(KEY_SUCCESS) != null) {
String res = json.getString(KEY_SUCCESS);
if(Integer.parseInt(res) == 1){
pDialog.setMessage("Loading User Space");
pDialog.setTitle("Getting Data");
Intent upanel = new Intent(getApplicationContext(), MainActivity.class);
upanel.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
pDialog.dismiss();
startActivity(upanel);
/**
* Close Login Screen
**/
finish();
}else{
pDialog.dismiss();
loginErrorMsg.setText("Incorrect username/password");
}
}
} catch (JSONException e) {
e.printStackTrace();
}
}
}
public void NetAsync(View view){
new NetCheck().execute();
}
}
来自userfunctions.java的登录方法
public JSONObject loginUser(String email, String password){
// Building Parameters
List<NameValuePair> params = new ArrayList<NameValuePair>();
params.add(new BasicNameValuePair("tag", login_tag));
params.add(new BasicNameValuePair("email", email));
params.add(new BasicNameValuePair("password", password));
JSONObject json = jsonParser.getJSONFromUrl(loginURL, params);
return json;
答案 0 :(得分:0)
1.在LoginActivity中定义另一个静态String变量,如:
private static String KEY_ERROR = "error";
2.修改您的onPostExecute()
方法:
@Override
protected void onPostExecute(JSONObject json) {
try {
if (json.getString(KEY_SUCCESS) != null) {
String res = json.getString(KEY_SUCCESS);
String red = json.getString(KEY_ERROR);
if (Integer.parseInt(res) == 1) {
pDialog.setMessage("Dashboard");
pDialog.setTitle("Loading.");
Intent upanel = new Intent(getApplicationContext(),
MainActivity.class);
upanel.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
pDialog.dismiss();
startActivity(upanel);
/**
* Close Login Screen
**/
finish();
} else if (Integer.parseInt(red) == 1) {
pDialog.dismiss();
Toast.makeText(getApplicationContext(), "Wrong Email/Pw",
Toast.LENGTH_SHORT).show();
}
}
} catch (JSONException e) {
e.printStackTrace();
}
}
3.修改您的Web服务(假设您使用PHP):
<强>的index.php 强>
// check for tag type
if ($tag == 'login') {
// Get data
$email = $_POST['email'];
$password = $_POST['password'];
// check for user
$user = $db->getUserByEmailAndPassword($email, $password);
if ($user != false) {
// user found
// echo json with success = 1
$response["success"] = 1;
$response["error_msg"] = "Correct credentials!";
echo json_encode($response);
} else {
// user not found
// echo json with error = 1
$response["error"] = 1;
$response["error_msg"] = "Incorrect email or password!";
echo json_encode($response);
}
}
<强> DB_Functions.php 强>
/**
* Verifies user by email and password
*/
public function getUserByEmailAndPassword($email, $password) {
$result = mysql_query("SELECT * FROM users WHERE email = '$email'") or die(mysql_error());
// check for result
$no_of_rows = mysql_num_rows($result);
if ($no_of_rows > 0) {
$result = mysql_fetch_array($result);
$salt = $result['salt'];
$encrypted_password = $result['encrypted_password'];
$hash = $this->checkhashSSHA($salt, $password);
// check for password equality
if ($encrypted_password == $hash) {
//Update last login of user
//mysql_query("UPDATE users SET last_login = NOW() WHERE email='$email'");
// user authentication details are correct
return $result;
}
} else {
// user not found
return false;
}
}