将Android应用程序连接到在线数据库时遇到一些麻烦

时间:2014-04-10 18:10:22

标签: java android

我在学校的一个小型Android项目中遇到了一些问题。我需要通过发送用户名来通过.php从在线数据库中请求密码。它应该返回加密密码。但是我用来连接数据库和接收密码的方法似乎有问题。 LogCat给了我这些:

HTTP连接错误java.net.UnknownHostException:boekenapp.atwebpages.com
转换结果java.lang.NullPointerException时出错 解析数据时出错org.json.JSONException:

字符0处的输入结束

所以我的问题是:我做错了什么?/我需要做些什么才能让它发挥作用?

代码:

public static String phpconnect(String name, String value) {
        String result = "";
        InputStream is = null;

        //variables to send to database
        ArrayList<NameValuePair> nameValuePairs = new ArrayList<NameValuePair>();
        nameValuePairs.add(new BasicNameValuePair(name,value));

        //HTTP post
        try{
            HttpClient httpclient = new DefaultHttpClient();
            URI connection = new URI("http://boekenapp.atwebpages.com/phpscript.php");
            HttpPost httppost = new HttpPost(connection);
            httppost.setEntity(new UrlEncodedFormEntity(nameValuePairs));
            HttpResponse response = httpclient.execute(httppost);
            HttpEntity entity = response.getEntity();
            is = entity.getContent();

        } catch(Exception e) {
            Log.e("log_tag", "Error in HTTP connection "+e.toString());
        } 

        //convert response to string
        try{
            BufferedReader reader = new BufferedReader(new InputStreamReader(is,"iso-8859-1"),8);
            StringBuilder sb = new StringBuilder();
            String line = null;
            while ((line = reader.readLine()) != null) {
                sb.append(line + "\n");
            }
            is.close();

            result=sb.toString();
        } catch(Exception e){
            Log.e("log_tag", "Error converting result "+e.toString());
        }

        //parse JSON data
        try{
            JSONArray jArray = new JSONArray(result);
            for(int i=0;i<jArray.length();i++){
                JSONObject json_data = jArray.getJSONObject(i);
                Log.i("log_tag","userid: "+json_data.getInt("userid")+", password: "+json_data.getString("password"));
            }
        } catch(JSONException e) {
            Log.e("log_tag", "Error parsing data "+e.toString());
        }
        return "";
    }

2 个答案:

答案 0 :(得分:0)

第二个try块将始终执行,因为您只登录第一个catch块。

您应该考虑return语句或throw语句。另一种方法是将第二个try块嵌入第一个try块中,但可能性较差。

在您的情况下,问题是连接本身失败。你确定你有网络吗?你可以从你的计算机和Android ping主机(你可以在CLI上使用adb shell ping <host>。)

不要在第一行截断错误堆栈,必须自上而下地读取堆栈,直到找到导致错误的代码段为止。

答案 1 :(得分:0)

首先,浏览器中使用的此代码中的URL重定向到www.alotspace.com/error-404/。大家就知道了。

如果不进行测试,只需查看代码,我就会先检查响应的状态行。这就是

StatusLine statusLine = response.getStatusLine();
int statusCode = statusLine.getStatusCode();
if (statusCode == 200) {
    // here all is OK, you can check for 404 and so on
}

此外,我看到您使用缓冲读取器处理响应,并将所有内容放在StringBuilder的代码中。更好的选择是使用gson

但首先要关注最初的网络相关异常。其他异常只是单独的try / catch块的结果(正如@Snicolas已经指出的那样)。 Unknownhost听起来像没有网络。重定向只会返回不同于预期的输出,而不是unkownhost。要验证是否正在测试您正在测试的Android设备上的网址。