将数据从Android发送到php webservice以验证登录
我有一个login.php脚本,它将验证在android中输入的用户名和密码。代码如下将数据从Android发送到php webservice以验证登录,android,json,web-services,android-asynctask,Android,Json,Web Services,Android Asynctask,我有一个login.php脚本,它将验证在android中输入的用户名和密码。代码如下 <?php include('dbconnect.php'); $data=file_get_contents('php://input'); $json = json_decode($data); $tablename = "users"; //username and password sent from android $username=$
<?php
include('dbconnect.php');
$data=file_get_contents('php://input');
$json = json_decode($data);
$tablename = "users";
//username and password sent from android
$username=$json->{'username'};
$password=$json->{'password'};
//protecting mysql injection
$username = stripslashes($username);
$password = stripslashes($password);
$username = mysql_real_escape_string($username);
$password = mysql_real_escape_string($password);
$password = md5($password);
$sql = "SELECT id FROM $tablename WHERE u_username='$username' and password='$password'";
//Querying the database
$result=mysql_query($sql);
//If found, number of rows must be 1
if((mysql_num_rows($result))==1){
//creating session
session_register("$username");
session_register("$password");
print "success";
}else{
print "Incorrect details";
}
?>
我得到以下错误:error/AndroidRuntime(29611):致命异常:main android.os.NetworkOnMainThreadException。
我知道我需要另一个线程,我正在考虑使用AsyncTask,但我不知道在这个类中放在哪里
您还可以给我一些关于使用JSON从android发送和接收数据的建议吗
感谢您的帮助,您可以使用AsyncTask更改代码,方法是在
doInBackground
中调用login方法,并在登录成功时在onPostExecute
上启动下一个活动:
private class LoginOperation extends AsyncTask<String, Void, String> {
String str_username=;
String str_password=;
public LoginOperation(String str_username,String str_password){
this.str_password= str_password;
this.str_username= str_username;
}
@Override
protected void onPreExecute() {
// show progress bar here
}
@Override
protected String doInBackground(String... params) {
// call login method here
String userID=login(str_username,str_password);
return userID;
}
@Override
protected void onPostExecute(String result) {
// start next Activity here
if(result !=null){
Intent casesActivity = new Intent(getApplicationContext(),
CasesActivity.class);
casesActivity.putExtra("username", result);
Your_Activiy.this.startActivity(casesActivity);
}
}
简单的答案是创建一个线程,只调用该线程中的登录名或异步任务(您可以将其定义为一个新类,只需调用execute)。像这样: 旧代码:
userID=login(editTextUsername.getText().toString(), editTextPassword.getText().toString());
新代码:
Runnable runnable = new Runnable() {
void run() {
login(editTextUsername.getText().toString(), editTextPassword.getText().toString());
}
(new Thread(runnable)).start();
当我学习时,我发现这非常有用:谢谢你,这解决了我的错误。我在JSON解析方面仍然存在一些问题。我会做一些研究,并试图找到一个解决方案。谢谢
userID=login(editTextUsername.getText().toString(), editTextPassword.getText().toString());
Runnable runnable = new Runnable() {
void run() {
login(editTextUsername.getText().toString(), editTextPassword.getText().toString());
}
(new Thread(runnable)).start();