Android 如何使用EntityUtils将服务器响应写入TextView?
为什么在我运行此代码时模拟器会崩溃Android 如何使用EntityUtils将服务器响应写入TextView?,android,textview,Android,Textview,为什么在我运行此代码时模拟器会崩溃 TextView servmsg; String data; @Override protected void onCreate(Bundle savedInstanceState) { // TODO Auto-generated method stub super.onCreate(savedInstanceState); setContentView(R.layout.te
TextView servmsg;
String data;
@Override
protected void onCreate(Bundle savedInstanceState) {
// TODO Auto-generated method stub
super.onCreate(savedInstanceState);
setContentView(R.layout.test_msg);
Vars();
new SendtheData().execute("");
}
private void Vars() {
// TODO Auto-generated method stub
servmsg = (TextView) findViewById(R.id.tvServerMsg);
}
public class SendtheData extends AsyncTask<String, Integer, Void> {
protected void onPreExecute(String f) {
// called before doInBackground has started
f = "f";
}
protected Void doInBackground(String... params) {
// TODO Auto-generated method stub
HttpClient client = new DefaultHttpClient();
HttpPost post = new HttpPost(
"http://192.168.1.6/androidp2p/process.php");
try {
List<NameValuePair> pairs = new ArrayList<NameValuePair>(3);
pairs.add(new BasicNameValuePair("from", "test4"));
pairs.add(new BasicNameValuePair("to", ""));
pairs.add(new BasicNameValuePair("message", ""));
post.setEntity(new UrlEncodedFormEntity(pairs));
HttpResponse response = client.execute(post);
// Convert the response into a String
HttpEntity resEntity = response.getEntity();
// Print the response
data = EntityUtils.toString(resEntity);
servmsg.setText(data);
// Write the response to a log file
if (resEntity != null) {
Log.i("RESPONSE", EntityUtils.toString(resEntity));
}
} catch (UnsupportedEncodingException uee) {
uee.printStackTrace();
} catch (ClientProtocolException cpe) {
cpe.printStackTrace();
} catch (IOException ioe) {
ioe.printStackTrace();
}
return null;
}
protected void onProgressUpdate(Integer... progress) {
// called when the background task has made any progress
}
protected void onPostExecute() {
// called after doInBackground has finished
}
}
提前谢谢
试过之后
受保护的void onPostExecute(){
//在doInBackground完成后调用
servmg.setText(数据);
}
这是新的LogCat:
03-27 00:56:24.006: W/dalvikvm(1736): threadid=11: thread exiting with uncaught exception (group=0x40a13300)
03-27 00:56:24.048: E/AndroidRuntime(1736): FATAL EXCEPTION: AsyncTask #1
03-27 00:56:24.048: E/AndroidRuntime(1736): java.lang.RuntimeException: An error occured while executing doInBackground()
03-27 00:56:24.048: E/AndroidRuntime(1736): at android.os.AsyncTask$3.done(AsyncTask.java:299)
03-27 00:56:24.048: E/AndroidRuntime(1736): at java.util.concurrent.FutureTask$Sync.innerSetException(FutureTask.java:273)
03-27 00:56:24.048: E/AndroidRuntime(1736): at java.util.concurrent.FutureTask.setException(FutureTask.java:124)
03-27 00:56:24.048: E/AndroidRuntime(1736): at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:307)
03-27 00:56:24.048: E/AndroidRuntime(1736): at java.util.concurrent.FutureTask.run(FutureTask.java:137)
03-27 00:56:24.048: E/AndroidRuntime(1736): at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:230)
03-27 00:56:24.048: E/AndroidRuntime(1736): at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1076)
03-27 00:56:24.048: E/AndroidRuntime(1736): at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:569)
03-27 00:56:24.048: E/AndroidRuntime(1736): at java.lang.Thread.run(Thread.java:856)
03-27 00:56:24.048: E/AndroidRuntime(1736): Caused by: java.lang.IllegalStateException: Content has been consumed
03-27 00:56:24.048: E/AndroidRuntime(1736): at org.apache.http.entity.BasicHttpEntity.getContent(BasicHttpEntity.java:84)
03-27 00:56:24.048: E/AndroidRuntime(1736): at org.apache.http.conn.BasicManagedEntity.getContent(BasicManagedEntity.java:100)
03-27 00:56:24.048: E/AndroidRuntime(1736): at org.apache.http.util.EntityUtils.toString(EntityUtils.java:112)
03-27 00:56:24.048: E/AndroidRuntime(1736): at org.apache.http.util.EntityUtils.toString(EntityUtils.java:146)
03-27 00:56:24.048: E/AndroidRuntime(1736): at com.project.keegan.testPrintMsg$SendtheData.doInBackground(testPrintMsg.java:77)
03-27 00:56:24.048: E/AndroidRuntime(1736): at com.project.keegan.testPrintMsg$SendtheData.doInBackground(testPrintMsg.java:1)
03-27 00:56:24.048: E/AndroidRuntime(1736): at android.os.AsyncTask$2.call(AsyncTask.java:287)
03-27 00:56:24.048: E/AndroidRuntime(1736): at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:305)
下面是我的PHP代码:
<?php
/* connect to database */
$db = mysql_connect("localhost", "root", "root");
if (!$db)
die('could not connect');
mysql_select_db('androidp2p')
or die("could not select database");
$from = mysql_real_escape_string($_POST['from']);
$to = mysql_real_escape_string($_POST['to']);
$message = mysql_real_escape_string($_POST['message']);
if ($_POST['to'])
{
/* user wants to send a message */
$query = "INSERT INTO messages (fromuser, touser, message) VALUES ('$from', '$to', '$message')";
mysql_query($query)
or die("\n\ndatabase error!\n". mysql_error());
echo "ok. Messages have been saved.";
}
else
{
/* user wants to retrieve his messages*/
$query = "SELECT * FROM messages WHERE touser='$from'";
$result = mysql_query($query)
or die("\n\ndatabase error!\n". mysql_error());
$message_count = mysql_num_rows($result);
if( $message_count == 0)
{
/* no messages*/
echo "ok. There are no messages.";
}
else
{
/* output messages */
while ($row = mysql_fetch_assoc($result))
{
echo "message start\n{$row['fromuser']}\n{$row['message']}\nmessage end\n";
}
/* clear messages */
$query = "DELETE FROM messages WHERE touser='$from'";
mysql_query($query)
or die("\n\ndatabase error!\n". mysql_error());
echo "ok. Cleared all messages.";
}
}
?>
公共类发送数据扩展异步任务{
受保护的void onPreExecute(字符串f){
//在doInBackground开始之前调用
f=“f”;
}
受保护的字符串doInBackground(字符串…参数){
//TODO自动生成的方法存根
字符串数据=null;
HttpClient=new DefaultHttpClient();
HttpPost=新的HttpPost(
"http://192.168.1.6/androidp2p/process.php");
试一试{
列表对=新的ArrayList(3);
添加(新的BasicNameValuePair(“from”,“test4”));
添加(新的BasicNameValuePair(“to“,”);
添加(新的BasicNameValuePair(“message”和“”);
setEntity(新的UrlEncodedFormEntity(对));
HttpResponse response=client.execute(post);
//将响应转换为字符串
HttpEntity当前性=response.getEntity();
//打印响应
数据=EntityUtils.toString(最近性);
//将响应写入日志文件
if(最近性!=null){
Log.i(“响应”,EntityUtils.toString(resEntity));
}
}捕获(不支持的编码异常uee){
uee.printStackTrace();
}捕获(客户端协议异常cpe){
printStackTrace();
}捕获(ioe异常ioe){
ioe.printStackTrace();
}
返回数据;
}
受保护的void onProgressUpdate(整数…进度){
//在后台任务取得任何进展时调用
}
受保护的void onPostExecute(字符串数据){
if(null!=数据)
{
servmg.setText(数据);
}否则{
//处理错误
}
}
}
您可以更改异步任务
,实现如下。始终在AsyncTask
的onPsotExecute
方法中处理结果。希望这会有所帮助
另外,如果我可以添加的话,服务器的响应有3个字段,
“收件人、发件人和信息”。什么是最好的方式,把每一个这些
他们自己的文本视图
从PHP页面返回的响应,您可以使其成为JSON
响应,并使用androidJSONParser
从客户端解析该JSON
响应,您的响应可能如下“{status:'200',statusMessage:'success or as your wish',data{to:'value',from:'value',message your message}”
谢谢。它已将消息打印到屏幕上。但是有一件事,就像@K所说的,您必须注释掉Log.i(“RESPONSE”,EntityUtils.toString(resEntity)),代码才能工作
在从doInBackground
方法返回之前执行此操作。是否也可以回答问题的第二部分。。。。服务器的响应有3个字段,“收件人、发件人和消息”。什么是最好的方式来把它们放到自己的文本视图中?好的,谢谢。我对JSONParser一无所知,但如果这是最简单的方法,我会检查一下。
<?php
/* connect to database */
$db = mysql_connect("localhost", "root", "root");
if (!$db)
die('could not connect');
mysql_select_db('androidp2p')
or die("could not select database");
$from = mysql_real_escape_string($_POST['from']);
$to = mysql_real_escape_string($_POST['to']);
$message = mysql_real_escape_string($_POST['message']);
if ($_POST['to'])
{
/* user wants to send a message */
$query = "INSERT INTO messages (fromuser, touser, message) VALUES ('$from', '$to', '$message')";
mysql_query($query)
or die("\n\ndatabase error!\n". mysql_error());
echo "ok. Messages have been saved.";
}
else
{
/* user wants to retrieve his messages*/
$query = "SELECT * FROM messages WHERE touser='$from'";
$result = mysql_query($query)
or die("\n\ndatabase error!\n". mysql_error());
$message_count = mysql_num_rows($result);
if( $message_count == 0)
{
/* no messages*/
echo "ok. There are no messages.";
}
else
{
/* output messages */
while ($row = mysql_fetch_assoc($result))
{
echo "message start\n{$row['fromuser']}\n{$row['message']}\nmessage end\n";
}
/* clear messages */
$query = "DELETE FROM messages WHERE touser='$from'";
mysql_query($query)
or die("\n\ndatabase error!\n". mysql_error());
echo "ok. Cleared all messages.";
}
}
?>
public class SendtheData extends AsyncTask<String, Integer, String> {
protected void onPreExecute(String f) {
// called before doInBackground has started
f = "f";
}
protected String doInBackground(String... params) {
// TODO Auto-generated method stub
String data = null;
HttpClient client = new DefaultHttpClient();
HttpPost post = new HttpPost(
"http://192.168.1.6/androidp2p/process.php");
try {
List<NameValuePair> pairs = new ArrayList<NameValuePair>(3);
pairs.add(new BasicNameValuePair("from", "test4"));
pairs.add(new BasicNameValuePair("to", ""));
pairs.add(new BasicNameValuePair("message", ""));
post.setEntity(new UrlEncodedFormEntity(pairs));
HttpResponse response = client.execute(post);
// Convert the response into a String
HttpEntity resEntity = response.getEntity();
// Print the response
data = EntityUtils.toString(resEntity);
// Write the response to a log file
if (resEntity != null) {
Log.i("RESPONSE", EntityUtils.toString(resEntity));
}
} catch (UnsupportedEncodingException uee) {
uee.printStackTrace();
} catch (ClientProtocolException cpe) {
cpe.printStackTrace();
} catch (IOException ioe) {
ioe.printStackTrace();
}
return data;
}
protected void onProgressUpdate(Integer... progress) {
// called when the background task has made any progress
}
protected void onPostExecute(String data) {
if(null != data)
{
servmsg.setText(data);
}else{
//handle Error
}
}
}