【问题标题】:connection to server database in Android连接到 Android 中的服务器数据库
【发布时间】:2016-08-03 19:37:24
【问题描述】:

我正在尝试将我的 Android 应用程序连接到服务器,但出现错误并且我不知道出了什么问题。

这是我的 MainActivity 类:

public class MainActivity extends AppCompatActivity {
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        try {
            JsonReader jsonReader=new JsonReader(new JsonReader.AsyncResponse() {
                @Override
                public void processfinish(JSONObject output) {
                    Gson gson=new Gson();
                    String message=gson.toJson(output);
                    Toast.makeText(getApplicationContext(),"this is "+message,Toast.LENGTH_LONG).show();
                }
            });
            jsonReader.execute();


        } catch (IOException e) {
            e.printStackTrace();
        }catch (Exception e){
            e.printStackTrace();

        }
    }
}    

这是我的 JsonReader 类:

public class JsonReader extends AsyncTask<String,String,JSONObject>{
    final static String myurl="http://example.com";
    public interface AsyncResponse{
        void processfinish(JSONObject output);
    }
    public AsyncResponse delegate = null;

    public JsonReader(AsyncResponse delegate){
        this.delegate = delegate;
    }
    public static JSONObject readJsonFromUrl(String url) throws IOException, JSONException {
        InputStream is = new URL(url).openStream();
        try {
            BufferedReader rd = new BufferedReader(new InputStreamReader(is, Charset.forName("UTF-8")));
            String jsonText = readAll(rd);
            JSONObject json = new JSONObject(jsonText);
            return json;
        }
        finally {
            is.close();
        }
    }
    @Override
    protected JSONObject doInBackground(String... strings) {
        try {
            JSONObject s = readJsonFromUrl(myurl);
            return s;
        } catch (IOException e) {
            e.printStackTrace();
            return null;
        } catch (JSONException e) {
            e.printStackTrace();
            return null;
        }
    }

    @Override
    protected void onPostExecute(JSONObject jsonObject) {
        super.onPostExecute(jsonObject);
        delegate.processfinish(jsonObject);
    }
}

我使用本指南创建了 AsyncResponse: How to get the result of OnPostExecute() to main activity because AsyncTask is a separate class?

还有我的 PHP 服务器代码:

<?php
$dbhost = "myhost";
$dbuser = "myuser";
$dbname = "myname";
$dbpass = "mypassword";

$connect_db = mysql_connect ($dbhost, $dbuser, $dbpass);
mysql_select_db($dbname,$connect_db);
if ($connect_db){
    $result= mysql_query("SELECT * FROM `ask` ",$connect_db)or die(mysql_error());
    while($row = mysql_fetch_array($result))
    {
        $qa=new StdClass();
        $qa->Question=$row['Question'];
        $qa->Answer=$row['Answer'];
        $qa->Answer2=$row['Answer2'];
        $qa->Answer3=$row['Answer3'];
        $qa->Answer4=$row['Answer4'];
        echo "<br />";

        $rses=json_encode($qa);
        echo $rses;

    }

}else{
    echo "error in connecting db";
}
?>

当我启动我的应用程序时,它显示“this is null”,但是当我在浏览器中打开我的 php 代码时,它会正确显示数据。 有什么问题?

更新:

我使用了另一个网址并且它有效。 所以问题出在我的php代码中。我删除了echo "&lt;br /&gt;"; 并在浏览器上打开它。结果是{"Question":"question","Answer":"a","Answer2":"b","Answer3":"c","Answer4":"d"} 我对 json 格式不专业,但我认为它的格式不正确。我该如何解决这个问题?

【问题讨论】:

  • 你得到什么错误?
  • 应用程序编译时不会崩溃,并显示带有文本“this is null”的吐司,但我希望它显示“这是”来自服务器的 +json 数据。在 logcat 中它显示“E/Surface:getSlotFromBufferLocked:未知缓冲区:0xeb1cb8a0" 我搜索它,它似乎是 android 6.0.0 错误,但我在 android 4.4.2 上测试,结果相同。
  • 我假设您的 myurl 字面意思 http://example.com 但实际上是一个可从互联网解析和访问的真实 URL,或者至少从设备所在的网络可访问开吗?

标签: php android mysql json


【解决方案1】:

您的浏览器正确呈现 HTML。这将隐藏在你的眼前

 echo "<br />";

Android 只关心字符串内容,因此无法解析中断标记。

您可能会检查 logcat 以查看 JSONParseException 正在发生,尽管您捕获它并返回 null,因此应用程序不会崩溃

只在 PHP 中回显 JSON

由于您有一个 while 循环,因此您想要构建一个 JSONArray,并对其进行解析,而不是尝试逐行解析 JsonObject。

另外,这不是必需的

String message=gson.toJson(output);

你有一个 JsonObject 作为output,所以只需toString

【讨论】:

  • 我删除了 php 代码并运行应用程序,但它仍然显示这是空的,当我尝试 toString 时应用程序崩溃,因为输出为空。
  • 我只能猜测为什么应用程序在没有 full logcat 的情况下会崩溃。另外,我还说过,使用数组,不要只删除那条线。但是,当无法解析 json 时,您确实返回 null,因此 NullPointerException 隐藏了实际问题,听起来像
猜你喜欢
  • 2021-04-22
  • 1970-01-01
  • 1970-01-01
  • 2016-12-17
  • 1970-01-01
  • 2014-01-05
  • 1970-01-01
  • 2017-09-14
  • 2011-08-12
相关资源
最近更新 更多