一、概述
安卓下的网络编程和javaweb中并没有很大的差别,还就是向服务器发请求,服务器返回响应。安卓下的网络编程指的是客户端向服务器请求数据。网络编程一般的尿性如下:
向服务器发出请求
- GET方式在地址栏放数据
- POST方式通过相应对象设置键值,再发送
服务器根据请求,运算后返回结果
客户端根据服务器返回的状态、结果再次处理
输入输出流读啊读
过程中注意中文乱码问题
安卓中有一点值的注意的是:向服务器的请求要放到子线程中去。因为请求占用CPU的时间,不能让其它应用程序混不下去。
二、网络编程方法
总共有三种方法
1.HttpURLConnection
String path = "http://10.0.2.2:8080/android/loginservlet?name="+name+"&pwd="+pwd;
URL url=new URL(path);
HttpURLConnection conn = (HttpURLConnection) url.openConnection();
conn.setConnectTimeout(3000);
conn.setRequestMethod("GET");
2.HttpClient
//HttpClient更像是一个面向对象的思想
//1.创建一个DefaultHttpClient对象
HttpClient httpclient =new DefaultHttpClient();
//2.创建一个HttpGet对象,并传入目标地址
HttpGet httpGet = new HttpGet(path);
//3.传入目标网络,并得到响应对象
HttpResponse httpResponse = httpclient.execute(httpGet);
3.AsyncHttpClient(开源框架)
开源框架已经用了异步消息处理机制,内部的实现在子线程中进行,所以我们可以放心大胆的在主线程中使用。
// 1.建立客户端
AsyncHttpClient client = new AsyncHttpClient();
// 封装传输的参数
RequestParams params = new RequestParams();
params.put("name", name);
params.put("pwd", pwd);
// 执行一个POST请求 --接口回调的方式
// 第二个参数: 回调的接口实现类对象,传递给了框架里面的某一个类,在某一时刻,根据当前请求的状态,来调用我这里的不同方法
client.post(path, params, new AsyncHttpResponseHandler() {
// 请求成功,服务器能正常响应时调用
@Override
public void onSuccess(int statusCode, Header[] headers,
byte[] responseBody) {
try {
tv_result.setText(new String(responseBody, "gbk"));
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
}
}
// 请求失败,服务器不能正常响应。
@Override
public void onFailure(int statusCode, Header[] headers,
byte[] responseBody, Throwable error) {
tv_result.setText("请检查网络状况。");
}
});
三、ByteArrayOutputStream、Bitmap类学习
1.ByteArrayOutputstream
此类实现了一个输出流,其中的数据被写入一个 byte 数组。缓冲区会随着数据的不断写入而自动增长。可使用 toByteArray() 和 toString() 获取数据。
InputStream is =conn.getInputStream();
//ByteArrayOutputStream类最大的特点就是内置有一个数组,可以不断的读,是后把它toString就可以了。
ByteArrayOutputStream bos=new ByteArrayOutputStream();
byte[] buf=new byte[1024];
int len=0;
Log.e("222", "已经在连接了");
//就是这里的read方法一定要放到buf数组中,否则。。。。
while((len=is.read(buf))!=-1){
bos.write(buf, 0, len);
}
String res=bos.toString("GBK");
bos.close();
is.close();
2.BitMap
一个图片类,通过iv.setImageBitmap(bitmap),可以把图处显示出去
Bitmap bitmap = BitmapFactory.decodeStream(InputStream is)
四、HttpURLConnection完成程序
try {
String path = "http://10.0.2.2:8080/android_day05/loginservlet?name="+name+"&pwd="+pwd;
URL url=new URL(path);
HttpURLConnection conn = (HttpURLConnection) url.openConnection();
conn.setConnectTimeout(3000);
conn.setRequestMethod("GET");
int code = conn.getResponseCode();
Log.e("222", code+"");
if(code==200){
InputStream is =conn.getInputStream();
//ByteArrayOutputStream类最大的特点就是内置有一个数组,可以不断的读,是后把它toString就可以了。
ByteArrayOutputStream bos=new ByteArrayOutputStream();
byte[] buf=new byte[1024];
int len=0;
Log.e("222", "已经在连接了");
//就是这里的read方法一定要放到buf数组中,否则。。。。
while((len=is.read(buf))!=-1){
bos.write(buf, 0, len);
}
String res=bos.toString("GBK");
bos.close();
is.close();
Message message = Message.obtain();
message.obj=res;
message.what=SUCCESS;
handler.sendMessage(message);
Log.e("222", res);
}
} catch ( Exception e) {
Message message = Message.obtain();
message.obj="连接出错";
message.what=ERROR;
Log.e("222","出错了");
handler.sendMessage(message);
}