zoukankan      html  css  js  c++  java
  • 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的简单用法了,因为是基础应用,本身难度不大,只要多上手亲自实践一下,想必掌握简单用法很容易!好了,就到这了,欢迎讨论,谢谢!

    一个自学的程序员

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

  • 相关阅读:
    Servlet到底是单例还是多例你了解吗?
    Idea的一些调试技巧及设置todo
    Android如何使用so文件和Android studio中导入so
    Android 自定义控件之app标题栏的封装
    Android 动态添加删除ExpandableListView的item的例子
    Android 利用ListView制作带竖线的多彩表格
    Android EditText 改变边框颜色
    Android 使用Okhttp/Retrofit持久化cookie的简便方式
    Android 一个漂亮的Android Spinner
    Android 带清除功能的输入框控件EditText
  • 原文地址:https://www.cnblogs.com/ithuangqing/p/12113681.html
Copyright © 2011-2022 走看看