网络通讯http

本文详细介绍了利用AsyncTask、HTTP GET和POST方法获取数据的过程,并通过一个简易的HTTP异步框架实现了网络请求的异步处理,旨在提高用户体验和应用性能。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1.httpget获取数据

1.1利用AsyncTask读取数据

1.2创建URL

1.3创建URLConnection接受返回值

1.4创建InputStream返回值

1.5建立字符集 从字节到字符的转换 读取数据

1.6关闭

public void onClick(View v) {
                    // 网络耗时 采用异步任务进行获取
                    new AsyncTask<String, Void, Void>() { // 利用AsyncTask读取数据
                        @Override
                        protected Void doInBackground(String... params) {
                            try {
                                URL url = new URL(params[0]);
                                URLConnection connection = url
                                        .openConnection(); // 创建URLConnection接受返回值
                                InputStream is = connection
                                        .getInputStream();// 创建InputStream返回值
                                InputStreamReader isr = new InputStreamReader(
                                        is, "UTF_8"); // 建立字符集 从字节到字符的转换
 
                                BufferedReader br = new BufferedReader(isr); // 读取一行字符串
                                String line;
                                while ((line = br.readLine()) != null) {
                                    System.out.println(line); //打印在logCat zhong
 
                                }
                                br.close();
                                isr.close();
                                is.close();
 
                            } catch (MalformedURLException e) {
                                // TODO Auto-generated catch block
                                e.printStackTrace();
                            } catch (IOException e) {
                                // TODO Auto-generated catch block
                                e.printStackTrace();
                            }
                            return null;
                        }
 
                    }.execute(geturl);//geturl为从中获取地址的网址

2.httpPost获取数据

2.1利用AsyncTask读取数据

2.2声明URL

2.3创建URLConnection 接受返回值

2.4确认权限。获取输出流

2.5写入数据 将数据传到数据库

2.6建立InputStream,建立字符集从字节到字符的转换

2.7关闭

public void onClick(View v) {
    // 网络耗时 采用异步任务进行获取
    new AsyncTask<String, Void, Void>() { // 利用AsyncTask读取数据
        @Override
        protected Void doInBackground(String... params) {
            try {
                URL url = new URL(params[0]);
                HttpURLConnection connection = (HttpURLConnection) url
                        .openConnection(); // 创建URLConnection接受返回值
                connection.setDoOutput(true); //输出
                connection.setDoInput(true);//输入
                connection.setRequestMethod("POST");
                OutputStreamWriter osw=new OutputStreamWriter(connection.getOutputStream(),"UTF-8");//获取输出流
                BufferedWriter bw = new BufferedWriter(osw);
                bw.write("keyfrom=yuyuyu&key=719067052&type=data&doctype=xml&version=1.1&q=这里是有道翻译API");
                bw.flush();//将数据传入到数据库
                InputStream is = connection
                        .getInputStream();// 创建InputStream返回值
                InputStreamReader isr = new InputStreamReader(
                        is, "UTF_8"); // 建立字符集 从字节到字符的转换
 
                BufferedReader br = new BufferedReader(isr); // 读取一行字符串
                String line;
                while ((line = br.readLine()) != null) {
                    System.out.println(line);
 
                }
                br.close();
                isr.close();
                is.close();
 
            } catch (MalformedURLException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            } catch (IOException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
            return null;
        }
 
    }.execute("http://fanyi.youdao.com/openapi.do");
 
}

3.简易的HTTP异步框架

    3.1.开启子线程,执行一个http请求,在后台执行,在子线程中执行

    3.2. 子线程执行完毕,通知UI 界面更新

public void click(View view) {
    // 1.开启子线程,执行一个http请求,在后台执行,在子线程中执行
    // 2. 子线程执行完毕,通知UI 界面更新
    AsyncHttpClient client = new AsyncHttpClient();//开启一个子线程,并且把子线程的内容穿回到这里
    String path = "http://210.29.185.218:8080/web/LoginServlet?username="
            + URLEncoder.encode("zhangsan") + "&password="
            + URLEncoder.encode("123");
    client.get(path, new MyHander() { //根据不同的方法来确定是否成功,失败
        public void doSuccess(String content) {
            Toast.makeText(MainActivity.this, "成功", 0).show();
        }
        public void doFailure(String comtent) {
            Toast.makeText(MainActivity.this, "失败", 0).show();
        }
    }
    );
}

public class AsyncHttpClient {
     
    public void get(final String path, final MyHander myHandler) {
        new Thread(){
            public void run(){
   //创建一个HTTP请求,并且执行            
 HttpClient client  = new DefaultHttpClient();
                HttpGet httpget = new HttpGet(path);
                try {
                    HttpResponse response =client.execute(httpget);
                    InputStream is = response.getEntity().getContent();
                    String result = StreamTools.readInputStream(is);
                    //执行成功
                    Message msg = new Message();
                    msg.what =1;
                    msg.obj=result;
                    myHandler.sendMessage(msg);
             
                } catch (IOException e) {
                    e.printStackTrace();
                    Message msg = new Message();
                    msg.what =2;
                    msg.obj="请求失败";
                    myHandler.sendMessage(msg);
                }  
            }
        }.start();
    }

创建子线程,

Hander类

public class MyHander extends Handler {
 
    public void doSuccess(String content) {
 
    }
 
    public void doFailure(String comtent) {
 
    }
    @Override
    public void handleMessage(Message msg) {
        String content = (String) msg.obj;
        switch (msg.what) {
        case 1:
            doSuccess(content);
            break;
        case 2:
            doFailure(content);
            break;
        }
    }
}

public class StreamTools {
 
    public static String readInputStream(InputStream is) {
        // TODO Auto-generated method stub
        return null;
    }


转载于:https://my.oschina.net/TAOH/blog/510451

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值