安卓基础笔记4之网络连接

11 篇文章 0 订阅

网络连接

  • 常见的的安卓框架
  • ==案例-网页源码查看器==
    • 工具类handle
    • Glide框架
  • 案例-网页图片查看器
  • 常见的网络图片请求框架
  • ==注意==

- 遇到的问题以及感受


常见的的安卓框架
- HttpRLConnection  Java (SUM) 不需要任何jar包   
- OKHttp  Square公司,世界排名第一的网络请求框架
- Retrofit Square公司
- HttpClient Apache(2011年废弃)从Android6.0开始已经不再使用~~
- AsyncHttpClient 第三方的开源框架~~
- xUtils国产

案例-网页源码查看
  • 步骤:

    • 创建布局
      • 创建一个EditText用来输入网址
      • 定义一个按钮定义点击事件,用来显示查询的源码
      • 定义一个scrollview控件,放一个TextView用来放源码
    • 在activity里面写页面逻辑
    • ==防止出现主线程访问网络异常,以及防止出现ANR异常,把写在点击按钮的内容,都写在一个子线程中==

      • 点击按钮,设置点击事件

        • 获取URL地址

          String path = edpath.getText().toString().trim();
        • 访问URL地址,并获取到服务器返回的是字节流数据

        • HttpRLConnection
          • 创建一个URL对象
        - URL url = new URL(path);
        • 通过URL获取HttpURLConnection对象
      - HttpURLConnection httpURLConnection = (HttpURLConnection) url.openConnection();
    • 配置该对象(请求方法,连接超时)

      - httpURLConnection.setRequestMethod("GET");//这是默认配置可以不写
                      httpURLConnection.setConnectTimeout(5000);//设置请求超时,如果超过5000毫秒了还获取
    • 开始请求网络资源

          httpURLConnection. ==connect()== ;//内容就会去请求网络资源,该方法是线程阻塞的方法
      
    • 获取一下服务器返回数据中的状态码 调用 ==.getResponseCode()==

      int responseCode = httpURLConnection**==.getResponseCode()==**;
          if (responseCode==200) {//客户端和服务器都是ok
                  获取服务器返回的数据(字节流的形式)
              InputStream is = httpURLConnection.getInputStream();
          -  将字节流数据转换为String
              String string = StreamUtils.in2Str(is);
              Log.d("tag", string);
                  关闭网络连接
              httpURLConnection.disconnect();//可选项
      • 定义一个工具类,调用ByteArrayOutputStream,把字节流转换成String
      • 把获取的字符串设置到TextView上,在子线程上修改UI会发生异常,所以通过handler类来设置UI的值:使用步骤:

        1. 定义一个子类去继承handle
        2. 并复写handleMessage()方法
        3. 在子线程中使用handle将数据传给主线程==.setMessage():==

1. 在handleMessage() 获取msg数据,根据what值弹出不同的吐司


常见异常:
  1. 在主线程中访问网络异常,

    1. 安卓规定主线程不能访问网络
  2. ANR异常,主线程长时间没反应,在主线程进行了大量的耗时操作,导致主线程卡死

  3. 访问网络权限异常
  4. 子线程修改UI异常
  5. 在子线程中不能弹Toast,因为Toast内部需要 new ,handle ,但是handle只能在主线程new 所以不能弹Toast


工具类:
==handle类==
线程间通信机制
使用步骤:

  • 定义一个子类去继承handle
  • 并复写handleMessage()方法
  • 在子线程中使用handle将数据传给主线程==.setMessage():==
  • 在handleMessage() 获取msg数据

方法:
- ==handleMessage(Message msg):==
当handler.sendMessage(msg)的时候,系统就会将该msg以实参的形式传递到该方法中

==Message== 数据的载体

  • Message:数据的载体
  • msg.obj:要发送的具体数据

- handler.sendMessage(msg):发送数据给主线程的handleMessage()方法。


案例-网页图片查看器
  • 创建UI
    • 创建一个Edittext用来存放输入的地址
    • 创建一个Button 用来设置点击事件
    • 创建一个ImageView 用来存放图片
  • 在MainActivity里面业务逻辑

    • 在点击方法中

      • 创建一个子线程,开启线程
      • 在子线程里:
      • 获取输入的地址
      • 创建一个URL对象,并把获取的地址字符串传到URL的构造中
      • 通过url来获取HttpURLConnection对象,调用.openConnection
      • 设置请求方法,默认一般为”GET”调用.setRequestMethod(“GET”)方法
      • 设置请求超时的时间调用.setConnectTimeout(时间)方法
      • 获取状态码调用.getRequestCode()方法
      • 根据状态码判断是否连接服务器

        • 如果成功,即状态码==200

          • 给msg.whth设置一个值
          • 获取HttpURLConnection的返回数据(字节流)
          • 把字节流通过BitMap类把字节流转换成一个图片调用 ==BitmapFactory.decodeStream(字节流对象)== 获取一个BitMap对象
          • 通过handle子类.sendMessage(msg);获取返回的对象

            Message msg = new Message();
            msg.obj = bitmap;
            msg.what = REQUEST_OK;
            handler.sendMessage(msg);
        • 如果不成功给msg.whth设置一个值则返回一个不正确信息用Toast

      • 在Handle里通过msg.whth值来弹出不同的信息

        • 成功就把获取的图片放到ImageView上
        Bitmap bitmap = (Bitmap) msg.obj;  
        imageView.setImageBitmap(bitmap);
        • 如果不成功给msg.whth设置一个值则返回一个不正确信息用Toast

==常见的网络图片请求框架==
- ==Glide Google==
- Universal ImageLoader(UIL) 比较老的框架
- ==Fresco FaceBook 黑科技==

- ==Picasso Square==

联网框架
- OkHttp
- Volley
- android-async-http

解析json
- Gson
- Fastjson
- Jackson

注解
- ButterKnife
- Dagger
- Android Annotations
- Roboguice



Glide框架

Eclipse中使用Glide需要把jar包放在libs目录下
获取图片

Glide
    .with(this) //获取上下文
    .load(path)//加载图片的路径
    .crossFade(5000)//淡入淡出效果5秒钟
    .into(imageView);//把图片布局上

Glide加载gif图

Glide
.with(this)
.load(path)
.asGif()//加载gif的图片
.crossFade(5000)
.into(imageView);     

Glide的图片占位图片使用

Glide.with(this).load(path)
.placeholder(R.drawable.loading)    //在网络图片没拿到之前显示的默认图片
.error(R.drawable.error)            //图片地址错误显示的图片
.crossFade(5000)
.into(imageView);

Glide的三级缓存
分别是:==内存缓存==, ==磁盘缓存==,==网络缓存==
缓存路径:data/data/包名/cache/image_manager_disk_cache
特点

Glide自己会维护缓存图片,如果缓存超过一定量就会删除最早之前缓存的图片,保证内存充足。

概念:

三级缓存:从服务器获取到图片之后先缓存到内存中,然后缓存到data/data目录中。加载的时候先找内存,然后找data目录。如果都没有再去网络拿图片。保证了有缓存的情况下就用缓存,减少流量。

是否使用内存缓存:
==skipMemoryCache(true)==
==配置Glide的缓存策略==

Glide.with(this)
    .load(path)
    .diskCacheStrategy(DiskCacheStrategy.ALL)//磁盘缓存策略
    .skipMemoryCache(true)
    .placeholder(R.drawable.loading)
    .error(R.drawable.error)
    .crossFade(5000)
    .into(imageView);

==diskCacheStrategy(属性)//磁盘缓存策略==
属性

DiskCacheStrategy.ALL:原图和裁剪后的图片都缓存  
DiskCacheStrategy.NONE:不使用磁盘缓存  
DiskCacheStrategy.RESULT:只缓存裁剪后的图片  
DiskCacheStrategy. RESULT:只缓存原始图片  

注意:
1. 在安卓中所有的view都用点击事件

  1. ==layout_gravity==:在布局中整体变化,摆放子View位置的属性
    ==gravity:== 是控件里面的内容变化,==摆放子view中的文字方向==

  2. 从安卓2.3版本开始,规定主线程不能请求网络,不能有耗时操作,耗时建议放在子线程中

  3. 安卓规定,哪个线程创建的UI也就是哪个线程修改这个UI
    • 只能(ui线程)去访问UI,防止出现UI线程混乱
  4. 布局的加载顺序,从上往下
  5. looper 是和主线程绑定的


遇到问题:
1.获取HttpURLConnection对象不是通过new 出来的,是通过url调用openConnection()方法获取的
2.查询图片时,是讲字节流转换成BitMap对象忘记用BitMap类来获取图片

InputStream inputStream = httpURLConnection.getInputStream();
Bitmap bitmap = BitmapFactory.decodeStream(inputStream);

查询源码是讲字节流转换成String

InputStream inputStream = httpURLConnection.getInputStream();
String string = GetString.getString(inputStream);//调用了一个工具类
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值