HttpClient  和 HttpURLConnection 以及 OkHttp :

  在Android 2.2版本之前,HttpClient拥有较少的bug,因此使用它是最好的选择。
        而在Android2.3版本及以后,HttpURLConnection则是最佳的选择。它的API简单,体积较小,因而非常适用于Android项目。压缩和缓存机制可以有效地减少网络访问的流量,在提升速度和省电方面也起到了较大的作用。对于新的应用程序应该更加偏向于使用HttpURLConnection,因为在以后的工作当中我们也会将更多的时间放在优化HttpURLConnection上面。

        其实现在嘛,两者都不用,就用Okhttp. HttpUrlConnection现在的底层实现就是通过Okhttp.

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

  开启线程两种常用的实现方式:一种是继承Thread类.一种是实现Runnable接口.

  1. new Thread(new Runnable() {
  2. @Override
  3. public void run() {
  4. ...
  5. //子线程方法异步执行
  6. ...
  7. }
  8. }).start();

  如果在主线程(也就是我们常说的UI线程)中进行Http请求,会报如下错.(NetworkOnMainThreadException)

  1. java.lang.RuntimeException: Unable to start activity ComponentInfo{com.android.okhttp.okhttp/com.android.okhttp.okhttp.MainActivity}: android.os.NetworkOnMainThreadException
  2. at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2855)
  1. // 1. 得到访问地址的URL
  2. URL url = new URL(urlStr);
  3. // 2. 得到网络访问对象java.net.HttpURLConnection
  4. HttpURLConnection connection = (HttpURLConnection) url.openConnection();
  5. /* 3. 设置请求参数(过期时间,输入、输出流、访问方式),以流的形式进行连接 */
  6. // 设置是否向HttpURLConnection输出
  7. connection.setDoOutput(false);
  8. // 设置是否从httpUrlConnection读入
  9. connection.setDoInput(true);
  10. // 设置请求方式
  11. connection.setRequestMethod("GET");
  12. // 设置是否使用缓存
  13. connection.setUseCaches(true);
  14. // 设置此 HttpURLConnection 实例是否应该自动执行 HTTP 重定向
  15. connection.setInstanceFollowRedirects(true);
  16. // 设置超时时间
  17. connection.setConnectTimeout(3000);
  18. // 连接
  19. connection.connect();
  20. // 4. 得到响应状态码的返回值 responseCode
  21. int code = connection.getResponseCode();
  22. // 5. 如果返回值正常,数据在网络中是以流的形式得到服务端返回的数据
  23. String msg = "";
  24. if (code == 200) { // 正常响应
  25. // 从流中读取响应信息
  26. BufferedReader reader = new BufferedReader(
  27. new InputStreamReader(connection.getInputStream()));
  28. String line = null;
  29. // 循环从流中读取
  30. while ((line = reader.readLine()) != null) {
  31. msg += line + "\n";
  32. }
  33. reader.close(); // 关闭流
  34. }
  35. // 6. 断开连接,释放资源
  36. connection.disconnect();
  37. // 显示响应结果
  38. Log.i("getDataByHttpUrlConnect",msg);
  39. //组装消息
  40. Message message = new Message();
  41. message.what = RESPONSE_OK;
  42. message.obj = msg;
  43. //发送消息
  44. handler.sendMessage(message);
  1.   //定义一个Handler来接收子线程发送的消息并处理:
  1. Handler handler = new Handler(new Handler.Callback() {
  2. @Override
  3. public boolean handleMessage(Message message) {
  4. switch (message.what){
  5. case RESPONSE_OK:
  6. //将返回的消息打印在界面TextView控件上显示
  7. tv_response.setText(message.obj.toString());
  8. break;
  9. }
  10. return true;
  11. }
  12. });

  Requests 和 Responses 两个属性概念解释:

    Requests(请求) 每一个HTTP请求中都应该包含一个URL,一个GET或POST方法以及Header或其他参数,当然还可以含特定内容类型的数据流。
        注意下Content-Type:
          RequestBody的数据格式都要指定Content-Type,常见的有三种:
          application/x-www-form-urlencoded 数据是个普通表单
          multipart/form-data 数据里有文件
          application/json 数据是个json

    Responses(响应) 响应则包含一个回复代码(200代表成功,404代表未找到等灯),Header和定制可选的body。

  首先gradle 引入类库(AndroidStudio显示最新的是3.11.0版本-2018年7月28日):

  1. implementation \'com.squareup.okhttp3:okhttp:3.11.0\'

  或者下载jar包:
    OkHttp官网地址:http://square.github.io/okhttp/
    OkHttp GitHub地址:https://github.com/square/okhttp

  1.       //new OkHttpClient
  2. OkHttpClient okHttpClient = new OkHttpClient();
  3. //封装Request请求信息,get方式,请求url
  4. Request request = new Request.Builder().get().url(urlStr).build();
  5. //定义一个接受返回信息的Response
  6. Response response = null;
  7. try {
  8. //调用OkHttp内部真正的实现请求,并返回请求结果Response
  9. response = okHttpClient.newCall(request).execute();
  10. if(response.isSuccessful()){
  11. //请求回来不能再子线程里进行界面Ui更新操作,通过Handler来通知主线程界面刷新
  12. Message message = new Message();
  13. message.what = RESPONSE_OK;
  14. message.obj = response.body().toString();
  15. handler.sendMessage(message);
  16. }
  17. } catch (IOException e) {
  18. e.printStackTrace();
  19. }

 

版权声明:本文为bugzone原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://www.cnblogs.com/bugzone/p/rxjava_get.html