一直想做一个系统的总结,种种原因,未能成行,今天受同事刺激,决定发粪图墙!从xutils开始!!
xutils已经使用两年了,就两个印象;1、流弊。2、作者是真懒,3出了这么久了,连个文档都没有,虽说有我也不看。。。水平有限,我不会说源码的事,只会总结自己怎么用的经验,因为没看过源码,也看不懂,牢骚完毕,说正事:
xutils有若干功能,主要有4部分;注解、网络加载、图片加载、数据库;其他的还有log输出、MD5加密等小功能,基本上对于新手而言,xutils在手,帝都怎么着也能8000+了。
导入
1、权限;在清单文件里添加权限
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
2、倒包;
as;以as2.2来说;
Build->Edit Libraries and Deperdencies(编辑应用库和依赖库)
Deperdencies->右上角绿色加号->在弹出的对话框里的搜索框里输入xUtils->点击搜索按钮->选择xutils3
的版本,如果没出现,说明你的汉语拼音打错了,,,->然后点击对话框下面的OK
o了~~~
ec;
网上找个3的jar包复制粘贴到项目的libs里
http://download.csdn.net/detail/li419360214/9358413(我现在用的3的jar包)
哦了~~
3、混淆
3貌似不用管混淆了。。
2的话;在proguard-project中加入:
-libraryjars libs/xUtils-2.6.14.jar
-keep class com.lidroid.** { *; }
另外据说因为注解的原因,注解的控件的修饰符必须是public,不然会找不到(没试过,不知道是否是这样)
4、初始化
xutils3要求必须在Application里的onCreate方法里进行初始化;
x.Ext.init(this);//必填项。。
如果要使用xutils的log的话,也是在这里进行设置,
x.Ext.setDebug(true);
对于界面也可以说是Activity和fragment中也要进行初始化,或者说是对其注解,叫什么无所谓,只需知道,这也是个必填就好了
在Activity的onCreate里
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
x.view().inject(this);
}
fragment的onCreateView里
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
injected = true;
View view = x.view().inject(this, inflater, container);
return view;
}
四大功能
注解;
1、注解布局;@ContentView
@ContentView(R.layout.activity_guide)//这样您就可以把oncreat里的setContentView()删掉了
public class GuideActivity extends Activity{}
2、注解控件(view);@ViewInject
@ViewInject(R.id.index_container) private LinearLayout indexContainer;
@ViewInject(R.id.vp_guide) private ViewPager vpGuide;
@ViewInject(R.id.welcome_regist)TextView welcome_regist;
@ViewInject(R.id.welcome_login)TextView welcome_login;
@ViewInject(R.id.ll_showlogin)FrameLayout layout;
3、注解响应事件,主要是点击监听;@Envent
@Event(value={R.id.l_bz,R.id.btn_regist},type=View.OnClickListener.class)
private void click(View v) {
// TODO Auto-generated method stub
switch (v.getId()) {
case R.id.l_bz:
startActivity(new Intent(this,LoginAc.class));
finish();
break;
}
点击类型默认是OnClickListener,可不写,点击类型可换,另外点击方法必须用private 修饰
基本上注解就是这些,优点是比findviewbyid省性能,并且一步到位,省事啊!
加载图片;
基本方法;
x.image().bind(imageView, url);
x.image().bind(imageView, "file:///sdcard/test.gif");
x.image().bind(imageView, "assets://test.gif");
高级点的方法;+对图片进行处理
x.image().bind(imageView, url, imageOptions);
x.image().bind(imageView, "file:///sdcard/test.gif", imageOptions);
x.image().bind(imageView, "assets://test.gif", imageOptions);
这里多了一个imageOptions的参数,很好用的东西
ImageOptions options=new ImageOptions.Builder()
//设置加载过程中的图片
.setLoadingDrawableId(R.drawable.head)
//设置加载失败后的图片
.setFailureDrawableId(R.drawable.head)
//设置使用缓存
.setUseMemCache(true)
//设置显示圆形图片
.setCircular(false)
//设置支持gif
.setIgnoreGif(false)
.build();
再高级点;+对图片加载状态进行监听
x.image().bind(imageView, url, imageOptions, new Callback.CommonCallback() {...});
x.image().loadDrawable(url, imageOptions, new Callback.CommonCallback() {...});
x.image().loadFile(url, imageOptions, new Callback.CommonCallback() {...});
多了一个回调方法,可以设置一些加载状态,比如弄个加载中的滚轮、设置一下加载完成后感什么等等,Drawable,File,任君蹂躏·····
x.image().bind(imgv, imagUrl, options, new CommonCallback() {
@Override
public void onSuccess(Drawable arg0) {
LogUtil.e("下载成功");
}
@Override
public void onFinished() {
LogUtil.e("下载完成");
}
@Override
public void onError(Throwable arg0, boolean arg1) {
LogUtil.e("下载出错," + arg0.getMessage());
}
@Override
public void onCancelled(CancelledException arg0) {
LogUtil.e("下载取消");
}
});
再高级点;+缓存
xutils加载图片可以设置缓存,这个在imageOptions设置里可以找到,但是当一张图片变了但是图片名没变的情况下,xutils加载的图片还是回事上一张图片,即;
图片名不变的情况下,xutils加载图片是会默认从他的缓存里加载,除非你不用缓存···怎么可能不用呢。。。
x.image().clearMemCache();//清除缓存里的图片数据
x.image().clearCacheFiles();//清除文件,也就是吧sd里的图片数据干了
注意,xutils加载图片默认缓存,如果不缓存的话,一则流量会飙升,二则,加载时会出现闪烁
网络请求;
我大xutils被使用最多的就是这个模块了,内置的其实是okhttp,其实就是一个okhttp的封装,对于新手来说,我们不想知道他内部是怎么跑的,只需要一个我上传参数,返回结果的东西,至于他内部的东西··有用吗? 有。但是我不需要!所以造就了xutils的繁荣。
基本方法;
x.http().get(params, callback)
x.http().post(params, callback)
get–接口能在网页上跑出来,安全性低点
post–相当于把接口加密了一下,网页上跑不了,但是安全性高点
在使用的时候,这两个方法除了名字不同,使用都一样
params–请求的参数
RequestParams params=new RequestParams("这里是接口");
params.addBodyParameter("tel", username);//这里添加参数,文件类型,串型等等,
设置cookie
params.setUseCookie(true);
params.addHeader("cookie","");
callback–回调,这是个好东西
// 请求参数
RequestParams params = new RequestParams("http://www.baidu.com");
x.http().get(params, new CommonCallback() {
@Override
public void onCancelled(CancelledException arg0) {//取消请求
}
@Override
public void onError(Throwable arg0, boolean arg1) {//请求失败
}
@Override
public void onFinished() {//请求完成
}
@Override
public void onSuccess(String arg0) {//请求成功
// 成功下载,显示到txtv上面
txtv.setText(arg0);
}
});
回调有3种;正常的、带缓存的、带进度的,一般都会单封一个地方
正常的
/**
*
* @tags :网络请求回调
* @author: moshangpiaoxu
* @data : 2016-1-4
* @time : 下午5:54:33
*/
public class fCallBacks implements Callback.CommonCallback<String> {
private String result = null;
private boolean hasError = false;
@Override
public void onCancelled(CancelledException arg0) {
// TODO Auto-generated method stub
LogUtil.i("网络请求取消");
}
@Override
public void onError(Throwable ex, boolean arg1) {
LogUtil.i("网络请求失败="+ex);
hasError = true;
if (ex instanceof HttpException) { // 网络错误
HttpException httpEx = (HttpException) ex;
int responseCode = httpEx.getCode();
String responseMsg = httpEx.getMessage();
String errorResult = httpEx.getResult();
// ...
} else { // 其他错误
// ...
}
}
@Override
public void onFinished() {
// TODO Auto-generated method stub
this.result = result;
if (!hasError && result != null) {
LogUtil.i("网络请求完成");
}
}
@Override
public void onSuccess(String result) {
// TODO Auto-generated method stub
this.result = result;
LogUtil.i("网络请求成功="+result);
}
}
带缓存的
/**
*
* @tags : 网络请求回调类
* @author: moshangpiaoxu
* @data : 2016-1-4
* @time : 下午3:33:59
*/
public class fCacheCallbacks implements Callback.CacheCallback {
private String result = null;
private boolean hasError = false;
@Override
public void onCancelled(CancelledException arg0) {
// TODO Auto-generated method stub
LogUtil.i("网络请求取消");
}
@Override
public void onError(Throwable ex, boolean arg1) {
LogUtil.i("网络请求失败="+ex);
hasError = true;
if (ex instanceof HttpException) {
HttpException httpEx = (HttpException) ex;
if (httpEx.getCode() >= 500) {
LogUtil.i( "服务器繁忙,请稍后重试");
} else {
LogUtil.i("请求网络失败,请检查您的网络连接是否正常");
}
}
}
@Override
public void onFinished() {
// TODO Auto-generated method stub
this.result = result;
if (!hasError && result != null) {
LogUtil.i("网络请求完成");
}
}
@Override
public void onSuccess(String result) {
// TODO Auto-generated method stub
this.result = result;
LogUtil.i("网络请求成功="+result);
}
@Override
public boolean onCache(String arg0) {
// TODO Auto-generated method stub
this.result = result;
return false;//设置是否缓存
}
}
带进度的
/**
*
* @tags : 带进度条的回调
* @author: moshangpiaoxu
* @data : 2016-1-4
* @time : 下午5:54:56
*/
public class fProgressCallBack implements Callback.ProgressCallback{
@Override
public void onCancelled(CancelledException arg0) {
// TODO Auto-generated method stub
}
@Override
public void onError(Throwable arg0, boolean arg1) {
// TODO Auto-generated method stub
}
@Override
public void onFinished() {
// TODO Auto-generated method stub
}
@Override
public void onSuccess(String arg0) {
// TODO Auto-generated method stub
}
@Override
public void onLoading(long arg0, long arg1, boolean arg2) {//加载中到各种进度的时候可设
// TODO Auto-generated method stub
}
@Override
public void onStarted() {//加载开始
// TODO Auto-generated method stub
}
@Override
public void onWaiting() {//加载等待
// TODO Auto-generated method stub
}
}
高级点的–封装
请求方法
/**
*
* @tags :网络请求封装类
* @author: moshangpiaoxu
* @data : 2016-1-4
* @time : 下午2:56:52
*/
public class UtilsHttpss {
/**
* GET请求
* @param params
* @param callback
*/
public static void Get(RequestParams params,CommonCallback callback){
Cancelable cancelable=x.http().get(params, callback);
}
/**
* 带缓存的GET请求
* @param params
* @param callback
*/
@SuppressWarnings({ "rawtypes", "unchecked", "unused" })
public static void GetCache(RequestParams params,CacheCallback callback ){
params.setCacheMaxAge(2000);
Cancelable cancelable = x.http().get(params, callback);
}
/**
* POST请求
* @param params
* @param callback
*/
public static void Post(RequestParams params, CommonCallback callback){
Cancelable cancelable=x.http().post(params, callback);
}
/**
* 上传文件
* @param params
* @param callback
*/
public static void Post(RequestParams params, CommonCallback callback){
params.setMultipart(true);
Cancelable cancelable=x.http().post(params, callback);
}
/**
* 下载文件
* @param params
* @param callback
*/
public static void Post(RequestParams params, CommonCallback callback){
params.setAutoResume(true);
params.setSaveFilePath(filepath);
Cancelable cancelable = x.http().get(params, callback);
}
}
再高级点–自动解析
可以看到 我封装的回调里用的都是泛型 也就是T,干什么用的呢,一般来说,回调返回的都是串,然后我们再对这个串进行解析,那么有没有一个方法能让他自动就解析了然后返回一个解析好了的实体类呢?当然有了。。。
解析的工具一般两种 fastjson和gson 一般用的是gson,虽然fastjson更牛一些,这里用gson
public class JsonResponseParser implements ResponseParser {
//检查服务器返回的响应头信息
@Override
public void checkResponse(UriRequest request) throws Throwable {
}
/**
* 转换result为resultType类型的对象
*
* @param resultType 返回值类型(可能带有泛型信息)
* @param resultClass 返回值类型
* @param result 字符串数据
* @return
* @throws Throwable
*/
@Override
public Object parse(Type resultType, Class> resultClass, String result) throws Throwable {
return new Gson().fromJson(result, resultClass);//这里就是gson解析数据,他会把串解析到实体类里
}
}
然后,在实体类上面加上@HttpResponse(parser = JsonToResponse.class)就成了
注意这个实体类必须是根据获取的json串的最上一级写出的。比如串的数据结构是res{code。。。,data。。des。。}实体类就要从res开始
@HttpResponse(parser = JsonToResponse.class)
public class res<T> {}
基本上就这些。
例子
网络请求
RequestParams params=new RequestParams("接口");
params.addBodyParameter("tel", username);
UtilsHttpss.Get(params, new fCallBacks(){//res为实体类
@Override
public void onSuccess(res result) {
// TODO Auto-generated method stub
super.onSuccess(result);
//result 就是返回的json串经过处理后返回的实体类
}
});
先写这么多吧,以后再慢慢完善
欢迎大家多提建议,只要我能听懂,一定改。。。。也可以加群330108003;