网络连接
- 常见的的安卓框架
- ==案例-网页源码查看器==
- 工具类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的值:使用步骤:
- 定义一个子类去继承handle
- 并复写handleMessage()方法
- 在子线程中使用handle将数据传给主线程==.setMessage():==
- 创建布局
1. 在handleMessage() 获取msg数据,根据what值弹出不同的吐司
常见异常:
在主线程中访问网络异常,
- 安卓规定主线程不能访问网络
ANR异常,主线程长时间没反应,在主线程进行了大量的耗时操作,导致主线程卡死
- 访问网络权限异常
- 子线程修改UI异常
- 在子线程中不能弹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都用点击事件
==layout_gravity==:在布局中整体变化,摆放子View位置的属性
==gravity:== 是控件里面的内容变化,==摆放子view中的文字方向==从安卓2.3版本开始,规定主线程不能请求网络,不能有耗时操作,耗时建议放在子线程中
- 安卓规定,哪个线程创建的UI也就是哪个线程修改这个UI
- 只能(ui线程)去访问UI,防止出现UI线程混乱
- 布局的加载顺序,从上往下
- 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);//调用了一个工具类