Android使用http协议访问网络

今天主要介绍两种方式来通过http协议访问网络。第一种是使用httpurlconnection,第二种是使用开源框架okhttp来访问网络,这次只是介绍简单的使用,适合新手入门学习,后续会增加HttpURLConnection和OkHttp使用的深入学习。

添加网络权限

因为我们需要访问网络,所以要添加访问网络的权限。代码如下

 <uses-permission android:name="android.permission.INTERNET"></uses-permission>

使用HttpURLConnection访问网络

1.首先需要获取到HttpURLConnection的实例,那么如何获取呢?这里有个一般的方法就是我们可以先创建一个URL,然后传入网络地址,紧接着调用url的openConnection()方法就行了,我们看下代码怎么操作:

 URL url = new URL("https://www.baidu.com");
            HttpURLConnection connection = (HttpURLConnection) url.openConnection();

在此介绍一下关于http请求所使用的方法,一般有两种方法即post和get,其实很好理解,get表示要从服务器那里获取数据,而post则代表要把数据提交给服务器,我们这里以获取服务器数据为例。

2.设置http请求的方式以及设置连接超时等信息

//自由定制
            connection.setRequestMethod("GET");
            connection.setConnectTimeout(80000);
            connection.setReadTimeout(8000);

3.使用getInputStream获取服务器返回的输入流

 InputStream stresm = connection.getInputStream();

4.在得到服务器返回的输入流之后我们就要对输入流进行读取了,在这里我们使用BufferedReader对输入流进行读取,主要的读取流程如下:

 //对返回的输入流进行读取
BufferedReader reader = new BufferedReader(new InputStreamReader(stresm));

5.对输入流读取完毕之后我们就开始读取存放在reader当中的字符串了,这时我们可以通过调用BufferedReader的readLine()方法去除字符串,看具体的代码实现如下:

            StringBuilder response = new StringBuilder();
            String line;
                    while ((line=reader.readLine()) != null){

                        response.append(line);
                    }

我们将读取到的字符流全部存放在了response当中,接下来将其通过toString()方法进行转换就可以在textview当中进行显示了。

注意:执行网络操作是一件比较耗时的操作,所以我们应该开启一个新的线程去单独执行耗时的网络操作,接下来我们开启一个新的线程去执行上述操作,完整代码如下:

    public void openBaidu(View v){

        new Thread(new Runnable() {
            @Override
            public void run() {
                HttpURLConnection connection = null;
                BufferedReader reader = null;
                //第一步建立httpurlconnection实例
                try {
                    URL url = new URL("https://www.baidu.com");
                    connection = (HttpURLConnection) url.openConnection();
                    //自由定制
                    connection.setRequestMethod("GET");
                    connection.setConnectTimeout(80000);
                    connection.setReadTimeout(8000);

                    //使用getInputStream获取服务器返回的输入流
                    InputStream stresm = connection.getInputStream();
                    //对返回的输入流进行读取
                    reader = new BufferedReader(new InputStreamReader(stresm));
                    StringBuilder response = new StringBuilder();
                    String line;
                    while ((line=reader.readLine()) != null){

                        response.append(line);
                    }

                    showData(response.toString());

                } catch (java.io.IOException e) {
                    e.printStackTrace();
                }finally {
                    if (reader!=null){
                        try {
                            reader.close();
                        } catch (IOException e) {
                            e.printStackTrace();
                        }
                    }
                    if (connection != null){
                        connection.disconnect();
                    }
                }
            }
        }).start();
    }

    private void showData(final String s) {

        runOnUiThread(new Runnable() {
            @Override
            public void run() {

                mTextView.setText(s);
                if (s == null){

                    System.out.println("this");
                }else {
                    System.out.println("不是");
                }

            }
        });
    }

在以上代码中我们发现设置文本的时候我们新建了一个showData方法去设置文本,同时在方法中使用了runOnUiThread()方法去执行设置文本的操作,这是为什么呢?因为在子线程中是不允许操作ui线程的,所以我们要刷新ui控件的话就必须在主线程中进行,通过runOnUiThread我们可以将线程从子线程切换到主线程,这样就可以进行文本的设置了。

以上就是通过HttpURLConnection访问网络的操作了,使用httpurlconnection是比较原始的操作,在如今开源盛行的时代,有许多出色的网络通信库可以替代原生的HttpURLConnection,我们这里推荐OkHttp,你一定听说过它的大名,它已经是Android开发首选的网络通信库了,下面我们就来先简单的认识并且使用一下这个强大的网络通信库把!

使用OkHttp

在使用OkHttp之前,我们首先需要在项目中添加OkHttp的库依赖,需要在app/build.gradle文件中的dependencies闭包当中添加如下依赖。

compile 'com.squareup.okhttp3:okhttp:3.9.0'

添加如上依赖之后就可以使用OkHttp了,你可以在类中输入ok,如果你as开启了代码自动提示功能的话就会出现关于OkHttp的各种类了,这就代表我们集成OkHttp成功了。

其实OkHttp的基础使用还是很简单的,下面我们来说一下它的简单使用。

第一:需要首先创建一个OkHttpClient实例。

 //使用OkHttp
                OkHttpClient client = new OkHttpClient();

我们可以跟httpurlconnection对比一下,这里不需要先创建一个url对象,那么我们该怎么创建url呢?毕竟我们是要访问网络的,其实OkHttp是需要创建一个Request对象来执行相关操作的。

第二:创建一个Request对象

 Request request = new Request.Builder()
                        .url("https://www.baidu.com")
                        .build();

以上添加了一个url,接下来我们就可以获取服务器的数据了,那么该如何获取服务器的数据呢?其实只需要一行代码

第三:获取服务器返回的数据

 Response response = client.newCall(request).execute();
                    //此处response就是服务器返回的数据

当获取到服务器的数据之后我们应该对数据进行处理,得到可以设置在textview当中的数据,这里不需要多么复杂的实现逻辑,同样是一行代码

 String data = response.body().string();

好了,如此一来我们就得到了我们想要的数据了,总体来说使用OkHttp非常的方便,因为它真的很强大。接下来我们看下完整的代码

mOpenBaidu.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
               // sendRequestWithHttpURLConnection();
                sendRequestWithOkHttp();
            }
        });
private void sendRequestWithOkHttp() {
        //开启一个新的线程执行网络操作
        new Thread(new Runnable() {
            @Override
            public void run() {
                //使用OkHttp
                OkHttpClient client = new OkHttpClient();

                Request request = new Request.Builder()
                        .url("https://www.baidu.com")
                        .build();
                try {
                    Response response = client.newCall(request).execute();
                    //此处response就是服务器返回的数据
                    String data = response.body().string();

                   showResponse(data);

                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }).start();
    }
  private void showResponse(final String s) {
        runOnUiThread(new Runnable() {
            @Override
            public void run() {
                //在这进行ui操作,将结果显示在界面上
                response_text.setText(s);
            }
        });
    }

简单说一下我的代码,这里我是设置了一个按钮并且给它添加了点击事件,新建了一个新的方法去执行网络操作,同样开启了一个新的线程去执行耗时的网络操作,在设置文本的时候和httpurlconnection使用了相同的方法,大家可以两者对比着来看。

以上就是HttpURLConnection和OkHttp的简单用法了,因为是基础应用,本身难度不大,只要多上手亲自实践一下,想必掌握简单用法很容易!好了,就到这了,欢迎讨论,谢谢!

一个自学的程序员

来自一个自学的程序员,扫一扫,学习更多!

posted @ 2017-10-30 15:39  ithuangqing  阅读(208)  评论(0编辑  收藏  举报