Android中使用HttpClient实现HTTP通信效果

HTTP通信,这一案例在操作的时候遇到N多种种问题,是前面看过几个实例里面最麻烦的一个。由于没有系统的接触过JAVA,所以出了非常多错误,也无从下手解决,这里经过对错误的检索实现了HTTP通信,以做记录。 实现 HTTP 通信有两种方式,一种是  httpurlconnection ,还有一种是  HttpClient ,出于开发习惯。这里选择了 HttpClient 做了一次实现 看实例  ApacheHttpClient.java
package com.example.httpclient;

import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.InputStream;

import org.apache.http.HttpResponse;
import org.apache.http.HttpStatus;
import org.apache.http.client.ClientProtocolException;
import org.apache.http.client.HttpClient;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.impl.client.DefaultHttpClient;

import android.util.Log;

public class ApacheHttpClient {
private static final String TAG = "Error";

public String httpGet(String url) {
String result = null;
HttpClient httpClient = new DefaultHttpClient();
HttpGet httpGet = new HttpGet(url);
HttpResponse httpResponse = null;
try {
httpResponse = httpClient.execute(httpGet);
int httpStatus = httpResponse.getStatusLine().getStatusCode();
if (httpStatus == HttpStatus.SC_OK) {
InputStream in = httpResponse.getEntity().getContent();
try {
result = readString(in);
} catch (Exception e) {
Log.i(TAG, "Exception");
// TODO Auto-generated catch block
e.printStackTrace();
}
} else {
result = "badly";
}
} catch (ClientProtocolException e) {
// TODO Auto-generated catch block
e.printStackTrace();
Log.i(TAG, "ClientProtocolException");
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
Log.i(TAG, "ClientProtocolException");
}
return result;
}

protected String readString(InputStream in) throws Exception {
byte[] data = new byte[1024];
int length = 0;
ByteArrayOutputStream bout = new ByteArrayOutputStream();
while ((length = in.read(data)) != -1) {
bout.write(data, 0, length);
}
return new String(bout.toByteArray(), "GBK");
}
}
以上代码将 HttpClient 实现了简单的封装。以后使用仅仅需调用相应的函数就能够了,以下看一个调用 MainActivity.java
package com.example.httpclient;

import android.os.Bundle;
import android.os.Handler;
import android.app.Activity;
import android.view.Menu;
import android.widget.TextView;

public class MainActivity extends Activity {

private Handler handler = null;
private String result = null;

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);

handler = new Handler();
new Thread() {
public void run() {
ApacheHttpClient aHttpClient = new ApacheHttpClient();
result = aHttpClient.httpGet("http://192.168.1.100");
handler.post(new Runnable(){
@Override
public void run() {
// TODO Auto-generated method stub
TextView tv = (TextView)findViewById(R.id.textView1);
tv.setText(result);
}});
}
}.start();
}

}
以上代码实现了对 ApacheHttpClient.java的调用,实现效果是会在应用界面上显示服务端内容。 这里须要说明的是,在调试过程中我遇到的问题 1、 android.os.NetworkOnMainThreadException 异常 这里说明的是,不能在主线程中訪问网络 2、Only the original thread that created a view hierarchy can touch its views 这里说明的是Android的相关View和控件不是线程安全的。我们必须做独立的处理,所以这里通过一个Handler对象能够非常好的传递Runnable或Message

posted on 2017-06-10 11:26  yjbjingcha  阅读(153)  评论(0编辑  收藏  举报

导航