安卓下的网络编程

一、概述

安卓下的网络编程和javaweb中并没有很大的差别,还就是向服务器发请求,服务器返回响应。安卓下的网络编程指的是客户端向服务器请求数据。网络编程一般的尿性如下:

  1. 向服务器发出请求

    • GET方式在地址栏放数据
    • POST方式通过相应对象设置键值,再发送
  2. 服务器根据请求,运算后返回结果

  3. 客户端根据服务器返回的状态、结果再次处理

  4. 输入输出流读啊读

  5. 过程中注意中文乱码问题

安卓中有一点值的注意的是:向服务器的请求要放到子线程中去。因为请求占用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);
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值