以下是整理的一些框架原理及使用方法,有是从别的博客阅读过来的,以供了解:
一.AsyncHttpClient
简介 Android中网络请求一般使用Apache HTTP Client或者采用HttpURLConnect,但是直接使用这两个类库需要写大量的代码才能完成网络post和get请求,而使用android-async-http这个库可以大大的简化操作,它是基于Apache’s HttpClient ,所有的请求都是独立在UI主线程之外,通过回调方法处理请求结果,采用android Handler message 机制传递信息。
特性 (1)采用异步http请求,并通过匿名内部类处理回调结果 (2)http请求独立在UI主线程之外 (3)采用线程池来处理并发请求 (4)采用RequestParams类创建GET/POST参数 (5)不需要第三方包即可支持Multipart file文件上传 (6)大小只有25kb (7)自动为各种移动电话处理连接断开时请求重连 (8)超快的自动gzip响应解码支持 (9)使用BinaryHttPResponseHandler类下载二进制文件(如图片) (10) 使用JsonHttpResponseHandler类可以自动将响应结果解析为json格式 (11)持久化cookie存储,可以将cookie保存到你的应用程序的SharedPreferences中
使用方法 (1)到官网http://loopj.com/android-async-http/下载最新的android-async-http-1.4.9.jar,然后将此jar包添加进Android应用程序 libs文件夹 (2)通过import com.loopj.android.http.*;引入相关类 (3)创建异步请求 [java] view plaincopy AsyncHttpClient client = new AsyncHttpClient(); client.get(“http://www.google.com“, new AsyncHttpResponseHandler() { @Override public void onSuccess(String response) { System.out.println(response); } });
二.OkHttpClient OkHttp是一个高效的HTTP库:
1.支持 SPDY ,共享同一个Socket来处理同一个服务器的所有请求 2.如果SPDY不可用,则通过连接池来减少请求延时 3.无缝的支持GZIP来减少数据流量 4.缓存响应数据来减少重复的网络请求 优点:
OkHttp会从很多常用的连接问题中自动恢复。如果您的服务器配置了多个IP地址,当第一个IP连接失败的时候,会自动尝试下一个IP。OkHttp还处理了代理服务器问题和SSL握手失败问题。 使用 OkHttp 无需重写您程序中的网络代码。OkHttp实现了几乎和java.net.HttpURLConnection一样的API。如果您用了 Apache HttpClient,则OkHttp也提供了一个对应的okhttp-apache 模块 Okhttp的基本使用,从以下五方面讲解:
1.Get请求(同步和异步) 2.POST请求表单(key-value) 3.POST请求提交(JSON/String/文件等)(这个有待研究) 4.文件下载 5.请求超时设置
GET请求同步方法
OkHttpClient client=new OkHttpClient(); Request request = new Request.Builder().url(url) .build(); Response response= client.newCall(request).execute(); String message=response.body().string();GET请求异步方法
OkHttpClient client=new OkHttpClient(); Request request = new Request.Builder().url(url).build(); client.newCall(request).enqueue(new Callback() { @Override public void onFailure(Request request, IOException e) { } @Override public void onResponse(Response response) throws IOException { } });POST请求提交
在这里解释一下,我在用3.0的时候,去找FormEncodingBuilder(),这个方法,找不到了,就去了他的官网查看了信息,找到了一下一段解释:
We’ve replaced the opaque FormEncodingBuilder with the more powerful FormBody and FormBody.Builder combo. Similarly we’ve upgraded MultipartBuilder into MultipartBody, MultipartBody.Part, and MultipartBody.Builder. okhttp3.0之前:
OkHttpClient client = new OkHttpClient(); RequestBody forBody = new FormEncodingBuilder().add("username","tom").add("passWord", "1110").build(); Request request=new Request.Builder().url(url).post(forBody).build(); client.newCall(request).enqueue(new Callback() { @Override public void onFailure(Request request, IOException e) { } @Override public void onResponse(Response response) throws IOException { Log.d("xiaoming",response.body().string()); } });okhttp3.0之后
OkHttpClient client = new OkHttpClient(); FormBody formBody = new FormBody.Builder() .add(“type”, “1”) .build(); Request request=new Request.Builder().url(url).post(forBody).build(); client.newCall(request).enqueue(new Callback() { @Override public void onFailure(Request request, IOException e) { } @Override public void onResponse(Response response) throws IOException { Log.d(“xiaoming”,response.body().string()); } }); 文件下载
String url = “http://www.0551fangchan.com/images/keupload/20120917171535_49309.jpg“; //构建request对象 Request request = new Request.Builder().url(url).build(); OkHttpClient client = new OkHttpClient(); client.newCall(request).enqueue(new Callback() { @Override public void onFailure(Call call, IOException e) {
} @Override public void onResponse(Call call, Response response) throws IOException { InputStream inputStream = response.body().byteStream(); FileOutputStream fileOutputStream = new FileOutputStream(new File("/sdcard/logo.jpg")); byte[] buffer = new byte[2048]; int len = 0; while ((len = inputStream.read(buffer)) != -1) { fileOutputStream.write(buffer, 0, len); } fileOutputStream.flush(); Log.d("wuyinlei", "文件下载成功..."); } });超时设置:
okhttp3.0之前:
client.setConnectTimeout(10, TimeUnit.SECONDS);client.setWriteTimeout(10, TimeUnit.SECONDS);client.setReadTimeout(30, TimeUnit.SECONDS);okhttp3.0之后:
client.newBuilder().connectTimeout(10, TimeUnit.SECONDS); client.newBuilder().readTimeout(10,TimeUnit.SECONDS); client.newBuilder().writeTimeout(10,TimeUnit.SECONDS);三.Retrofit
Retrofit与okhttp共同出自于Square公司,retrofit就是对okhttp做了一层封装。把网络请求都交给给了Okhttp,我们只需要通过简单的配置就能使用retrofit来进行网络请求了
导包: compile ‘com.squareup.retrofit2:retrofit:2.0.0-beta4’//Retrofit2所需要的包 compile ‘com.squareup.retrofit2:converter-gson:2.0.0-beta4’//ConverterFactory的Gson依赖包 compile ‘com.squareup.retrofit2:converter-scalars:2.0.0-beta4’//ConverterFactory的String依赖包 *这里需要值得注意的是导入的retrofit2包的版本必须要一致,否则就会报错。
首先定义我们请求的Api,我们假设是这样的
http://106.3.227.33/pulamsi/mobileLogin/submit.html 与Okhttp不同的是,Retrofit需要定义一个接口,用来返回我们的Call对象
四.Volley 转载出处:http://blog.csdn.net/guolin_blog/article/details/17482095 我们平时在开发Android应用的时候不可避免地都需要用到网络技术,而多数情况下应用程序都会使用HTTP协议来发送和接收网络数据。Android系统中主要提供了两种方式来进行HTTP通信,HttpURLConnection和HttpClient,几乎在任何项目的代码中我们都能看到这两个类的身影,使用率非常高。
不过HttpURLConnection和HttpClient的用法还是稍微有些复杂的,如果不进行适当封装的话,很容易就会写出不少重复代码。于是乎,一些Android网络通信框架也就应运而生,比如说AsyncHttpClient,它把HTTP所有的通信细节全部封装在了内部,我们只需要简单调用几行代码就可以完成通信操作了。再比如Universal-Image-Loader,它使得在界面上显示网络图片的操作变得极度简单,开发者不用关心如何从网络上获取图片,也不用关心开启线程、回收图片资源等细节,Universal-Image-Loader已经把一切都做好了。
Android开发团队也是意识到了有必要将HTTP的通信操作再进行简单化,于是在2013年Google I/O大会上推出了一个新的网络通信框架——Volley。Volley可是说是把AsyncHttpClient和Universal-Image-Loader的优点集于了一身,既可以像AsyncHttpClient一样非常简单地进行HTTP通信,也可以像Universal-Image-Loader一样轻松加载网络上的图片。除了简单易用之外,Volley在性能方面也进行了大幅度的调整,它的设计目标就是非常适合去进行数据量不大,但通信频繁的网络操作,而对于大数据量的网络操作,比如说下载文件等,Volley的表现就会非常糟糕。
下载Volley
介绍了这么多理论的东西,下面我们就准备开始进行实战了,首先需要将Volley的jar包准备好,如果你的电脑上装有Git,可以使用如下命令下载Volley的源码: [plain] view plain copy 在CODE上查看代码片派生到我的代码片 git clone https://android.googlesource.com/platform/frameworks/volley 下载完成后将它导入到你的Eclipse工程里,然后再导出一个jar包就可以了。如果你的电脑上没有Git,那么也可以直接使用我导出好的jar包,下载地址是:http://download.csdn.net/detail/sinyu890807/7152015 。
新建一个Android项目,将volley.jar文件复制到libs目录下,这样准备工作就算是做好了。
五.XUtils xUtils简介 xUtils 包含了很多实用的android工具。 xUtils 最初源于Afinal框架,进行了大量重构,使得xUtils支持大文件上传,更全面的http请求协议支持(10种谓词),拥有更加灵活的ORM,更多的事件注解支持且不受混淆影响… xUitls最低兼容android 2.2 (api level 8)
目前xUtils主要有四大模块: DbUtils模块: android中的orm框架,一行代码就可以进行增删改查; 支持事务,默认关闭; 可通过注解自定义表名,列名,外键,唯一性约束,NOT NULL约束,CHECK约束等(需要混淆的时候请注解表名和列名); 支持绑定外键,保存实体时外键关联实体自动保存或更新; 自动加载外键关联实体,支持延时加载; 支持链式表达查询,更直观的查询语义,参考下面的介绍或sample中的例子。 ViewUtils模块: android中的ioc框架,完全注解方式就可以进行UI,资源和事件绑定; 新的事件绑定方式,使用混淆工具混淆后仍可正常工作; 目前支持常用的20种事件绑定,参见ViewCommonEventListener类和包com.lidroid.xutils.view.annotation.event。 HttpUtils模块: 支持同步,异步方式的请求; 支持大文件上传,上传大文件不会oom; 支持GET,POST,PUT,MOVE,COPY,DELETE,HEAD,OPTIONS,TRACE,CONNECT请求; 下载支持301/302重定向,支持设置是否根据Content-Disposition重命名下载的文件; 返回文本内容的请求(默认只启用了GET请求)支持缓存,可设置默认过期时间和针对当前请求的过期时间。 BitmapUtils模块: 加载bitmap的时候无需考虑bitmap加载过程中出现的oom和android容器快速滑动时候出现的图片错位等现象; 支持加载网络图片和本地图片; 内存管理使用lru算法,更好的管理bitmap内存; 可配置线程加载线程数量,缓存大小,缓存路径,加载显示动画等… 使用xUtils快速开发框架需要有以下权限: 混淆时注意事项: 添加Android默认混淆配置${sdk.dir}/tools/proguard/proguard-android.txt 不要混淆xUtils中的注解类型,添加混淆配置:-keep class * extends java.lang.annotation.Annotation { *; } 对使用DbUtils模块持久化的实体类不要混淆,或者注解所有表和列名称@Table(name=”xxx”),@Id(column=”xxx”),@Column(column=”xxx”),@Foreign(column=”xxx”,foreign=”xxx”); 六 Afinal
简介
Afinal 是一个android的sqlite orm 和 ioc 框架。同时封装了android中的http框架,使其更加简单易用;
使用finalBitmap,无需考虑bitmap在android中加载的时候oom的问题和快速滑动的时候图片加载位置错位等问题。
Afinal的宗旨是简洁,快速。约定大于配置的方式。尽量一行代码完成所有事情。
目前Afinal主要有四大模块:
FinalDB模块:android中的orm框架,一行代码就可以进行增删改查。支持一对多,多对一等查询。
FinalActivity模块:android中的ioc框架,完全注解方式就可以进行UI绑定和事件绑定。无需findViewById和setClickListener等。
FinalHttp模块:通过httpclient进行封装http数据请求,支持Ajax方式加载。
FinalBitmap模块:通过FinalBitmap,imageview加载bitmap的时候无需考虑bitmap加载过程中出现的oom和android容器快速滑动时候出现的图片错位等现象。FinalBitmap可以配置线程加载线程数量,缓存大小,缓存路径,加载显示动画等。FinalBitmap的内存管理使用lru算法,没有使用弱引用(android2.3以后google已经不建议使用弱引用,android2.3后强行回收软引用和弱引用,详情查看android官方文档),更好的管理bitmap内存。FinalBitmap可以自定义下载器,用来扩展其他协议显示网络图片,比如ftp等。同时可以自定义bitmap显示器,在imageview显示图片的时候播放动画等(默认是渐变动画显示)。
使用afinal快速开发框架需要有以下权限:
第一个是访问网络
第二个是访问sdcard
访问网络是请求网络图片的时候需要或者是http数据请求时候需要,访问sdcard是图片缓存的需要。
七 ImageLoader 详情可以在这个博客地址了解: http://blog.csdn.net/xiaanming/article/details/26810303
多线程下载图片,图片可以来源于网络,文件系统,项目文件夹assets中以及drawable中等 支持随意的配置ImageLoader,例如线程池,图片下载器,内存缓存策略,硬盘缓存策略,图片显示选项以及其他的一些配置 支持图片的内存缓存,文件系统缓存或者SD卡缓存 支持图片下载过程的监听 根据控件(ImageView)的大小对Bitmap进行裁剪,减少Bitmap占用过多的内存 较好的控制图片的加载过程,例如暂停图片加载,重新开始加载图片,一般使用在ListView,GridView中,滑动过程中暂停加载图片,停止滑动的时候去加载图片 提供在较慢的网络下对图片进行加载
ImageLoaderConfiguration是图片加载器ImageLoader的配置参数,使用了建造者模式,这里是直接使用了createDefault()方法创建一个默认的ImageLoaderConfiguration,当然我们还可以自己设置ImageLoaderConfiguration,设置如下 [java] view plain copy 在CODE上查看代码片派生到我的代码片 File cacheDir = StorageUtils.getCacheDirectory(context); ImageLoaderConfiguration config = new ImageLoaderConfiguration.Builder(context) .memoryCacheExtraOptions(480, 800) // default = device screen dimensions .diskCacheExtraOptions(480, 800, CompressFormat.JPEG, 75, null) .taskExecutor(…) .taskExecutorForCachedImages(…) .threadPoolSize(3) // default .threadPriority(Thread.NORM_PRIORITY - 1) // default .tasksProcessingOrder(QueueProcessingType.FIFO) // default .denyCacheImageMultipleSizesInMemory() .memoryCache(new LruMemoryCache(2 * 1024 * 1024)) .memoryCacheSize(2 * 1024 * 1024) .memoryCacheSizePercentage(13) // default .diskCache(new UnlimitedDiscCache(cacheDir)) // default .diskCacheSize(50 * 1024 * 1024) .diskCacheFileCount(100) .diskCacheFileNameGenerator(new HashCodeFileNameGenerator()) // default .imageDownloader(new BaseImageDownloader(context)) // default .imageDecoder(new BaseImageDecoder()) // default .defaultDisplayImageOptions(DisplayImageOptions.createSimple()) // default .writeDebugLogs() .build(); 上面的这些就是所有的选项配置,我们在项目中不需要每一个都自己设置,一般使用createDefault()创建的ImageLoaderConfiguration就能使用,然后调用ImageLoader的init()方法将ImageLoaderConfiguration参数传递进去,ImageLoader使用单例模式。
八 Picasso
picasso是Square公司开源的一个Android图形缓存库,地址http://square.github.io/picasso/,可以实现图片下载和缓存功能。仅仅只需要一行代码就能完全实现图片的异步加载:
Picasso.with(context).load(“http://i.imgur.com/DvpvklR.png“).into(imageView);
Picasso不仅实现了图片异步加载的功能,还解决了android中加载图片时需要解决的一些常见问题:
1.在adapter中需要取消已经不在视野范围的ImageView图片资源的加载,否则会导致图片错位,Picasso已经解决了这个问题。
2.使用复杂的图片压缩转换来尽可能的减少内存消耗
3.自带内存和硬盘二级缓存功能
特性以及示例代码:
ADAPTER 中的下载:Adapter的重用会被自动检测到,Picasso会取消上次的加载@Override public void getView(int position, View convertView, ViewGroup parent) { SquaredImageView view = (SquaredImageView) convertView; if (view == null) { view = new SquaredImageView(context); } String url = getItem(position); Picasso.with(context).load(url).into(view); } 图片转换:转换图片以适应布局大小并减少内存占用
Picasso.with(context) .load(url) .resize(50, 50) .centerCrop() .into(imageView); 你还可以自定义转换:
public class CropSquareTransformation implements Transformation { @Override public Bitmap transform(Bitmap source) { int size = Math.min(source.getWidth(), source.getHeight()); int x = (source.getWidth() - size) / 2; int y = (source.getHeight() - size) / 2; Bitmap result = Bitmap.createBitmap(source, x, y, size, size); if (result != source) { source.recycle(); } return result; } @Override public String key() { return “square()”; } } 将CropSquareTransformation 的对象传递给transform 方法即可。
Place holders-空白或者错误占位图片:picasso提供了两种占位图片,未加载完成或者加载发生错误的时需要一张图片作为提示。
Picasso.with(context) .load(url) .placeholder(R.drawable.user_placeholder) .error(R.drawable.user_placeholder_error) .into(imageView); 如果加载发生错误会重复三次请求,三次都失败才会显示erro Place holder
资源文件的加载:除了加载网络图片picasso还支持加载Resources, assets, files, content providers中的资源文件。
Picasso.with(context).load(R.drawable.landing_screen).into(imageView1); Picasso.with(context).load(new File(…)).into(imageView2);
新闻热点
疑难解答