如何使用http请求获取特定数据?

时间:2018-07-11 07:12:51

标签: java android http httprequest

所以我真的是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);
}

?>

但是该代码只会使应用转到主要活动,而数据库上尚无记录。是因为我的服务吗?

2 个答案:

答案 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不应扩展AsyncTaskAsyncTask应该专用于单个异步任务(例如发送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代码中,您正在混合职责。

摘要

确保正确使用现有代码,然后尝试对其进行改进。