所以我真的是android的新手,打算制作一个获取设备的设备ID的应用程序,将其存储在数据库服务器上,然后检查该设备是否与已注册的设备相同,如果是的,然后转到主要活动,如果没有,则需要再次注册。 我的方法:
public class SigninActivity extends AsyncTask<String, String, String> {
private Context context;
public SigninActivity(Context context, int flag) {
this.context = context;
}
protected void onPreExecute(String result) {
}
//@Override
protected String doInBackground(String... arg0) {
try {
String dev = (String) arg0[0];
String link = "http://10.20.2.14/service_antrian/get_data.php?device_id=" + dev;
URL url = new URL(link);
HttpClient client = new DefaultHttpClient();
HttpGet request = new HttpGet();
request.setURI(new URI(link));
HttpResponse response = client.execute(request);
BufferedReader in = new BufferedReader(new InputStreamReader(response.getEntity().getContent()));
StringBuffer sb = new StringBuffer("");
String line = "";
while ((line = in.readLine()) != null) {
sb.append(line);
break;
}
in.close();
Log.d("RETURN", "return");
return sb.toString();
} catch (Exception e) {
Log.d("EXCEPTION", "EXP");
//return "failed";
return new String("Exception: " + e.getMessage());
}
}
// @Override
protected void onPostExecute(String result) {
if (result.equalsIgnoreCase("false")) {
Intent mainIntent = new Intent(UserActivity.this, RegisterActivity.class);
UserActivity.this.startActivity(mainIntent);
} else {
Intent mainIntent = new Intent(UserActivity.this, MainActivity.class);
UserActivity.this.startActivity(mainIntent);
}
}
}
这是我用php代码提供的服务:
<?php
ini_set('display_errors', 1);
require_once 'database.php';
if(isset($_GET['device_id'])) {
$device_id = $_GET['device_id'];
$sql = " SELECT * FROM `pasien`.`antrian_mobile` WHERE `device_id`=
'$device_id' ";
$rs = $mysqli->query($sql);
$data = array();
while ($row = $rs->fetch_object()) {
$data[] = $row;
}
if ($mysqli->affected_rows > 0) {
echo "successfull";
} else {
echo "false";
}
echo json_encode($data);
}
?>
但是该代码只会使应用转到主要活动,而数据库上尚无记录。是因为我的服务吗?
答案 0 :(得分:0)
您正在从服务中返回Styles.Render("~/css/myVirtualPath")
或 bundles.Add(new StyleBundle("~/css/myVirtualPath").Include("~/Styles/myStyle.css"))
successfull
但是您正在将结果与移动应用中的failed
进行比较,因此,它始终采用else路线并打开MainActivity
if ($mysqli->affected_rows > 0) {
echo "successfull";
} else {
echo "failed";
}
答案 1 :(得分:0)
我在您的代码中看到了一些问题:
第1个问题
Activity
不应扩展AsyncTask
。 AsyncTask
应该专用于单个异步任务(例如发送HTTP请求),并且Activity
代表单个用户屏幕(UI层)。您应该分别创建AsyncTask
并在这样的Activity中调用它:
class SigninActivity extends Activity {
// this method should be called in the place where you want to execute your task
// it could be onResume() method, onClick listener for the button or whatever
private void executeAsyncTask() {
new MyTask().execute(...) // put your params here...
}
private class MyTask extends AsyncTask<String, String, String> {
... // your task code goes here...
}
}
第2个问题
如今,在Android应用程序中使用AsyncTask
被认为是不好的做法,因为它的错误处理能力很差,并且不了解Activity的生命周期。推荐的Android异步操作解决方案是RxJava(版本2)。
第3个问题
您正在使用HttpClient
。建议使用更成熟的解决方案,例如Retrofit Http REST客户端或OkHttp库。它们可以轻松地与RxJava集成。
第4个问题
您正在传递Context
,但您没有使用它
第5个问题
您不必注释@Override
注释。
第6个问题
您的代码混乱,难以调试和阅读。一旦将其清理干净,将更容易解决与之相关的问题。
第7个问题
在PHP代码中,您正在混合职责。
摘要
确保正确使用现有代码,然后尝试对其进行改进。