[英]My android app does not receive json object
我一直在开发从mysql
数据库检索数据的android应用程序,因此我编写了PHP
脚本,该脚本从数据库中提取数据并将结果编码为JSON
,当我测试PHP
脚本时,它会生成包含对象的清晰JSON
数组。 在我的Android应用程序中,我编写了代码以获取JSON
数组并从中提取数据,但是由于尝试不同而失败,然后我开始获取错误并发现我的应用程序接收的内容是text / html和不是我应该期望的application / json。 当我通过单击菜单>工具>开发人员工具从我的Google chrome浏览器检查PHP
脚本的内容类型时,魔术就来了,它显示内容类型是我设置的application / json。 我是如此迷恋于这个伴侣和我的最后一年项目,我什至不知道该怎么做才能摆脱困境。
这是日志,显示接收到的内容类型为text / html 03-21 09:29:18.187:D /连接成功(791):内容类型:Content-Type:文本/ html
这是我的PHP脚本
<?php
$connection = connect();
function connect() {
$dbhost = 'localhost';
$dbuser = 'user';
$dbpassword = 'password';
$con = mysql_connect($dbhost, $dbuser, $dbpassword);
if ($con) {
mysql_select_db('vpl') or trigger_error(mysql_error());
}
return $con;
}
$result = mysql_query("SELECT * FROM `news` WHERE 1", $connection);
$dataArray = array();
if (mysql_num_rows($result) > 0) :
while ($row = mysql_fetch_array($result)) :
$data['newsTitle'] = $row['newsTitle'];
$data['newsContent'] = $row['newsContent'];
array_push($dataArray, $data);
endwhile;
endif;
mysql_close($connection);
$json = json_encode($dataArray);
header('Content-Type: application/json');
exit($json);
?>
这是我的Android代码
package com.jetas.vpl;
import java.io.BufferedReader;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.List;
import org.apache.http.Header;
import org.apache.http.HeaderElement;
import org.apache.http.HttpEntity;
import org.apache.http.HttpResponse;
import org.apache.http.client.entity.UrlEncodedFormEntity;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.client.params.HttpClientParams;
import org.apache.http.impl.client.DefaultHttpClient;
import org.apache.http.message.BasicNameValuePair;
import org.json.JSONArray;
import org.json.JSONObject;
import android.annotation.SuppressLint;
import android.app.Activity;
import android.os.Bundle;
import android.os.StrictMode;
import android.util.Log;
import android.widget.TextView;
public class Test extends Activity {
@SuppressLint("NewApi")
@Override
protected void onCreate(Bundle savedInstanceState) {
// TODO Auto-generated method stub
super.onCreate(savedInstanceState);
setContentView(R.layout.news_single_post);
StrictMode.enableDefaults();
getData();
}
public void getData() {
TextView textview = (TextView) findViewById(R.id.newsTitle);
// TextView textview2 = (TextView) findViewById(R.id.content);
// textview.setText("Why are you stubborn");
InputStream isr = null;
String result = "";
String url = "http://10.0.2.2/vpl/getnews.php";
try {
DefaultHttpClient httpClient = new DefaultHttpClient();
HttpGet httpGet = new HttpGet(url);
//httpGet.addHeader("Accept", "application/json");
HttpResponse httpResponse = httpClient.execute(httpGet);
HttpEntity httpEntity = httpResponse.getEntity();
isr = httpEntity.getContent();
// textview2.setText("Test Passed");
Log.d("Connection success", "Content Type: " +
httpResponse.getEntity().getContentType());
} catch (Exception e) {
Log.d("Connection failed", "Error in HTTP Connection" +
e.toString());
textview.setText("Connection Failed");
}
try {
BufferedReader reader = new BufferedReader(new InputStreamReader(
isr, "iso-8859-1"), 8);
StringBuilder sb = new StringBuilder();
String line = null;
while ((line = reader.readLine()) != null) {
sb.append(line + "\n");
// textview2.setText("Test Passed");
}
isr.close();
result = sb.toString();
// textview2.setText("Test Passed");
} catch (Exception e) {
Log.e("Buffer Error", "Error converting result " + e.toString());
textview.setText("Buffer reader problem");
}
try {
String s = "hey";
JSONArray jArray = new JSONArray(result);
Log.d("Parsing json", jArray.toString());
for (int i = 0; i < jArray.length(); i++) {
JSONObject json = jArray.getJSONObject(1);
Log.d("json object", json.toString());
Log.d("news title", json.getString("newsTitle"));
s = s + json.getString("newsTitle");
textview.setText(s);
//String newsTitle = json.getString("newsTitle");
//textview.setText(newsTitle);
s = s + "Title: " + json.getString("newsTitle") + "\n" +
"Content: " + json.getString("newsContent") + "\n\n";
textview.setText(s);
}
} catch (Exception e) {
Log.e("log_tag", "Error Parsing Data" + e.toString());
textview.setText("Error in Parsing Data !!!!!");
}
}
}
整合我的评论:您无法在主线程上做网络工作。 使用asynchtask或runnable在单独的线程中执行。
使用可运行的实现(现在您可以将getdata调用到onCreate()中):
这只会解决onmainthread异常
private Handler mHandler_1=null;
private Runnable mRunnable_1=null;
public void getData(){
mHandler_1 = new Handler();
mRunnable_1 = new Runnable() {
public void run() {
TextView textview = (TextView) findViewById(R.id.newsTitle);
// TextView textview2 = (TextView) findViewById(R.id.content);
// textview.setText("Why are you stubborn");
InputStream isr = null;
String result = "";
String url = "http://10.0.2.2/vpl/getnews.php";
try {
DefaultHttpClient httpClient = new DefaultHttpClient();
HttpGet httpGet = new HttpGet(url);
//httpGet.addHeader("Accept", "application/json");
HttpResponse httpResponse = httpClient.execute(httpGet);
HttpEntity httpEntity = httpResponse.getEntity();
isr = httpEntity.getContent();
// textview2.setText("Test Passed");
Log.d("Connection success", "Content Type: " +
httpResponse.getEntity().getContentType());
} catch (Exception e) {
Log.d("Connection failed", "Error in HTTP Connection" +
e.toString());
textview.setText("Connection Failed");
}
try {
BufferedReader reader = new BufferedReader(new InputStreamReader(
isr, "iso-8859-1"), 8);
StringBuilder sb = new StringBuilder();
String line = null;
while ((line = reader.readLine()) != null) {
sb.append(line + "\n");
// textview2.setText("Test Passed");
}
isr.close();
result = sb.toString();
// textview2.setText("Test Passed");
} catch (Exception e) {
Log.e("Buffer Error", "Error converting result " + e.toString());
textview.setText("Buffer reader problem");
}
try {
String s = "hey";
JSONArray jArray = new JSONArray(result);
Log.d("Parsing json", jArray.toString());
for (int i = 0; i < jArray.length(); i++) {
JSONObject json = jArray.getJSONObject(1);
Log.d("json object", json.toString());
Log.d("news title", json.getString("newsTitle"));
s = s + json.getString("newsTitle");
textview.setText(s);
//String newsTitle = json.getString("newsTitle");
//textview.setText(newsTitle);
s = s + "Title: " + json.getString("newsTitle") + "\n" +
"Content: " + json.getString("newsContent") + "\n\n";
textview.setText(s);
}
} catch (Exception e) {
Log.e("log_tag", "Error Parsing Data" + e.toString());
textview.setText("Error in Parsing Data !!!!!");
}
}
};
mRunnable_1.run();
}
PS:请阅读
http://www.codeproject.com/Articles/267023/Send-and-receive-json-between-android-and-php
尝试使用AsyncTask 。 或使用单独的线程在网络调用中运行,然后使用runOnUIThread()方法或“使用处理程序”在以后更新UI。
您下载jar文件httplib
将jar文件放入libs文件夹
然后将getData()方法替换为您的代码
import com.loopj.android.http.*;
public void getData() {
TextView textview = (TextView) findViewById(R.id.newsTitle);
// TextView textview2 = (TextView) findViewById(R.id.content);
// textview.setText("Why are you stubborn");
String result = "";
String url = "http://10.0.2.2/vpl/getnews.php";
AsyncHttpClient client = new AsyncHttpClient();
client.get(url, new AsyncHttpResponseHandler() {
@Override
public void onSuccess(String response) {
System.out.println(response);
try {
String s = "hey";
JSONArray jArray = new JSONArray(response);
Log.d("Parsing json", jArray.toString());
for (int i = 0; i < jArray.length(); i++) {
JSONObject json = jArray.getJSONObject(1);
Log.d("json object", json.toString());
Log.d("news title", json.getString("newsTitle"));
s = s + json.getString("newsTitle");
textview.setText(s);
//String newsTitle = json.getString("newsTitle");
//textview.setText(newsTitle);
s = s + "Title: " + json.getString("newsTitle") + "\n" +
"Content: " + json.getString("newsContent") + "\n\n";
textview.setText(s);
}
} catch (Exception e) {
Log.e("log_tag", "Error Parsing Data" + e.toString());
textview.setText("Error in Parsing Data !!!!!");
}
});
}
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.