xutils3使用方法
1.先来认识一下xUtils3
更新 2017/03/30
需求:我们需要在parent表中添加一个“username”字段。
1.在parent类中添加“username”属性
2.调用dbManager.addColumn(Parent.class,"username");方法添加字段
3.在DbManager.DaoConfig()中的版本号+1,是否必须未知。
更新 2017/04/19
String path="/mnt/sdcard/Download/icon.jpg"; RequestParams params = new RequestParams(""); params.setMultipart(true); params.addBodyParameter("file",new File(path)); Callback.Cancelable post = x.http().post(params, new Callback.CommonCallback<String>() {@Override public void onSuccess(String result) {}@Override public void onError(Throwable ex, boolean isOnCallback) {}@Override public void onCancelled(CancelledException cex) {}@Override public void onFinished() {} }); //取消请求 post.cancel();
1)xUtils3简介
xUtils是目前功能比较完善的一个Android开源框架,最近又发布了xUtil3.0,在增加新功能的同时又提高了框架的性能,下面来看看官方(https://github.com/wyouflf/xUtils3)对xUtils3的介绍:
- xUtils包含了很多实用的android工具;
- xUtils支持超大文件(超过2G)上传,更全面的http请求协议支持(11种谓词),拥有更加灵活的ORM,更多的事件注解支持且不受混淆影响;
- xUtils 最低兼容Android 4.0 (api level 14);
- xUtils3变化较多所以建立了新的项目不在旧版(github.com/wyouflf/xUtils)上继续维护, 相对于旧版本:
- HTTP实现替换HttpClient为UrlConnection, 自动解析回调泛型, 更安全的断点续传策略;
- 支持标准的Cookie策略, 区分domain, path;
- 事件注解去除不常用的功能, 提高性能;
- 数据库api简化提高性能, 达到和greenDao一致的性能;
- 图片绑定支持gif(受系统兼容性影响, 部分gif文件只能静态显示), webp; 支持圆角, 圆形, 方形等裁剪, 支持自动旋转。
2)在我们的项目中快速配置xUtils3
xUtils3的配置十分的简单:
2-1)使用Gradle构建时添加一下依赖即可
compile 'org.xutils:xutils:3.3.36'
- 1
- 1
如果使用eclipse可以点击下面链接下载aar文件, 然后用zip解压,取出jar包和so文件。
Github下载:https://github.com/wyouflf/xUtils3
JCenter下载:http://jcenter.bintray.com/org/xutils/xutils/
Maven下载1:http://central.maven.org/maven2/org/xutils/xutils/
Maven下载2:http://repo1.maven.org/maven2/org/xutils/xutils/
2-2)加入权限
<uses-permission android:name="android.permission.INTERNET"/>
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
- 1
- 2
- 1
- 2
2-3)创建Application
public class MyApp extends Application {@Overridepublic void onCreate() {super.onCreate();x.Ext.init(this);x.Ext.setDebug(false); //输出debug日志,开启会影响性能}
}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
2-4)在AndroidManifest文件中注册MyApp
<applicationandroid:name=".MyApp"...
</application>
- 1
- 2
- 3
- 4
- 1
- 2
- 3
- 4
xUtils3主要包含注解模块、网络模块、图片模块和数据库模块,下面将做一一说明。
2.xUtils3注解模块的使用
@ContentView(R.layout.activity_main)
public class MainActivity extends AppCompatActivity {@ViewInject(R.id.viewpager)ViewPager viewPager;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);//setContentView(R.layout.activity_main);x.view().inject(this);...}
}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
2)Fragment的注解的使用如下:
@ContentView(R.layout.fragment_http)
public class HttpFragment extends Fragment {@Nullable@Overridepublic View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {return x.view().inject(this, inflater, container);}@Overridepublic void onViewCreated(View v, @Nullable Bundle savedInstanceState) {super.onViewCreated(v, savedInstanceState);}
}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
3)为按钮设置点击事件
- 方法必须私有限定,
- 方法参数形式必须和type对应的Listener接口一致.
- 注解参数value支持数组: value={id1, id2, id3}
/*** 单击事件* type默认View.OnClickListener.class,故此处可以简化不写,@Event(R.id.bt_main)*/
@Event(type = View.OnClickListener.class,value = R.id.bt_main)
private void testInjectOnClick(View v){Snackbar.make(v,"OnClickListener",Snackbar.LENGTH_SHORT).show();
}
/*** 长按事件*/
@Event(type = View.OnLongClickListener.class,value = R.id.bt_main)
private boolean testOnLongClickListener(View v){Snackbar.make(v,"testOnLongClickListener",Snackbar.LENGTH_SHORT).show();return true;
}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
强调:使用注解模块一定要注意初始化视图注解框架。
3.xUtils3网络模块的使用
xUtils3网络模块大大方便了在实际开发中网络模块的开发,xUtils3网络模块大致包括GET请求、POST请求、如何使用其他请求方式、上传文件、下载文件、使用缓存等功能,下面将做一一说明:
RequestParams params = new RequestParams(url);
params.addQueryStringParameter("username","abc");
params.addQueryStringParameter("password","123");
x.http().get(params, new Callback.CommonCallback<String>() {@Overridepublic void onSuccess(String result) {//解析result}//请求异常后的回调方法@Overridepublic void onError(Throwable ex, boolean isOnCallback) {}//主动调用取消请求的回调方法@Overridepublic void onCancelled(CancelledException cex) {}@Overridepublic void onFinished() {}
});
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
下面我们来看下带有缓存的GET请求,POST请求和其他请求方式类似,后面就不再赘述:
带有缓存的GET请求:
RequestParams params = new RequestParams(url);
params.addQueryStringParameter("username","abc");
params.addQueryStringParameter("password","123");
// 默认缓存存活时间, 单位:毫秒(如果服务器没有返回有效的max-age或Expires则参考)
params.setCacheMaxAge(1000 * 60);x.http().get(params, new Callback.CacheCallback<String>() {private boolean hasError = false;private String result = null;@Overridepublic boolean onCache(String result) { //得到缓存数据, 缓存过期后不会进入this.result = result;return true; //true: 信任缓存数据, 不再发起网络请求; false不信任缓存数据}@Overridepublic void onSuccess(String result) {//如果服务返回304或onCache选择了信任缓存,这时result为nullLog.i("JAVA", "开始请求");if (result != null) {this.result = result;}}@Overridepublic void onError(Throwable ex, boolean isOnCallback) {hasError = true;Toast.makeText(x.app(), ex.getMessage(), Toast.LENGTH_LONG).show();if (ex instanceof HttpException) { //网络错误HttpException httpEx = (HttpException) ex;int responseCode = httpEx.getCode();String responseMsg = httpEx.getMessage();String errorResult = httpEx.getResult();//...} else { //其他错误//...}}@Overridepublic void onCancelled(CancelledException cex) {}@Overridepublic void onFinished() {if (!hasError && result != null) {//成功获取数据Toast.makeText(x.app(), result, Toast.LENGTH_LONG).show();}}
});
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 39
- 40
- 41
- 42
- 43
- 44
- 45
- 46
- 47
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 39
- 40
- 41
- 42
- 43
- 44
- 45
- 46
- 47
上面onCache方法中需要注意的几点:
a)如果服务端没有返回过期时间,参考params.setCacheMaxAge(maxAge)方法。
b)客户端会根据服务端返回的header中max-age或expires来确定本地缓存是否给onCache方法。如果服务端没有返回max-age或expires,那么缓存将一直保存,除非这里自己定义了返回false,那么xUtils将请求新数据, 来覆盖它。
c)如果信任该缓存返回true,将不再请求网络。返回false继续请求网络,但会在请求头中加上ETag,Last-Modified等信息。如果服务端返回304,则表示数据没有更新,不继续加载数据。
2)POST请求
RequestParams params = new RequestParams(url);
params.addBodyParameter("username","abc");
params.addParameter("password","123");
params.addHeader("head","android"); //为当前请求添加一个头
x.http().post(params, new Callback.CommonCallback<String>() {@Overridepublic void onSuccess(String result) {//解析result}@Overridepublic void onError(Throwable ex, boolean isOnCallback) {}@Overridepublic void onCancelled(CancelledException cex) {}@Overridepublic void onFinished() {}
});
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
3)其他网络请求方式
RequestParams params = new RequestParams(url);
params.addParameter("username","abc");
x.http().request(HttpMethod.PUT, params, new Callback.CommonCallback<String>() {@Overridepublic void onSuccess(String result) {//解析result}@Overridepublic void onError(Throwable ex, boolean isOnCallback) {}@Overridepublic void onCancelled(CancelledException cex) {}@Overridepublic void onFinished() {}
});
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
4)上传文件
String path="/mnt/sdcard/Download/icon.jpg";
RequestParams params = new RequestParams(url);
params.setMultipart(true);
params.addBodyParameter("file",new File(path));
x.http().post(params, new Callback.CommonCallback<String>() {@Overridepublic void onSuccess(String result) {}@Overridepublic void onError(Throwable ex, boolean isOnCallback) {}@Overridepublic void onCancelled(CancelledException cex) {}@Overridepublic void onFinished() {}
});
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
5)下载文件
这里以下载apk为例进行说明,apk下载完成后,自动调用系统的安装方法。
url = "http://127.0.0.1/server/abc.apk";
RequestParams params = new RequestParams(url);
//自定义保存路径,Environment.getExternalStorageDirectory():SD卡的根目录
params.setSaveFilePath(Environment.getExternalStorageDirectory()+"/myapp/");
//自动为文件命名
params.setAutoRename(true);
x.http().post(params, new Callback.ProgressCallback<File>() {@Overridepublic void onSuccess(File result) {//apk下载完成后,调用系统的安装方法Intent intent = new Intent(Intent.ACTION_VIEW);intent.setDataAndType(Uri.fromFile(result), "application/vnd.android.package-archive");getActivity().startActivity(intent);}@Overridepublic void onError(Throwable ex, boolean isOnCallback) {}@Overridepublic void onCancelled(CancelledException cex) {}@Overridepublic void onFinished() {}//网络请求之前回调@Overridepublic void onWaiting() {}//网络请求开始的时候回调@Overridepublic void onStarted() {}//下载的时候不断回调的方法@Overridepublic void onLoading(long total, long current, boolean isDownloading) {//当前进度和文件总大小Log.i("JAVA","current:"+ current +",total:"+total); }
});
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
4.xUtils3图片模块的使用
xUtils3图片模块,重点在于加载图片的4个bind方法,loadDrawable与loadFIle用法和ImageOptions用法,需多加练习。
//通过ImageOptions.Builder().set方法设置图片的属性
ImageOptions imageOptions= new ImageOptions.Builder().setFadeIn(true).build(); //淡入效果
//ImageOptions.Builder()的一些其他属性:
.setCircular(true) //设置图片显示为圆形
.setSquare(true) //设置图片显示为正方形
.setCrop(true).setSize(200,200) //设置大小
.setAnimation(animation) //设置动画
.setFailureDrawable(Drawable failureDrawable) //设置加载失败的动画
.setFailureDrawableId(int failureDrawable) //以资源id设置加载失败的动画
.setLoadingDrawable(Drawable loadingDrawable) //设置加载中的动画
.setLoadingDrawableId(int loadingDrawable) //以资源id设置加载中的动画
.setIgnoreGif(false) //忽略Gif图片
.setParamsBuilder(ParamsBuilder paramsBuilder) //在网络请求中添加一些参数
.setRaduis(int raduis) //设置拐角弧度
.setUseMemCache(true) //设置使用MemCache,默认true
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
2)xUtils3 bind方法:
// assets file
x.image().bind(imageView, "assets://test.gif", imageOptions);// local file
x.image().bind(imageView, new File("/sdcard/test.gif").toURI().toString(), imageOptions);
x.image().bind(imageView, "/sdcard/test.gif", imageOptions);
x.image().bind(imageView, "file:///sdcard/test.gif", imageOptions);
x.image().bind(imageView, "file:/sdcard/test.gif", imageOptions);x.image().bind(imageView, url, imageOptions, new Callback.CommonCallback<Drawable>() {@Overridepublic void onSuccess(Drawable result) {}@Overridepublic void onError(Throwable ex, boolean isOnCallback) {}@Overridepublic void onCancelled(CancelledException cex) {}@Overridepublic void onFinished() {}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
3)xUtils3 loadDrawable方法:
x.image().loadDrawable(url, imageOptions, new Callback.CommonCallback<Drawable>() {@Overridepublic void onSuccess(Drawable result) {imageView.setImageDrawable(result);}@Overridepublic void onError(Throwable ex, boolean isOnCallback) {}@Overridepublic void onCancelled(CancelledException cex) {}@Overridepublic void onFinished() {}
});
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
4)xUtils3 loadFile方法:
当我们通过bind()或者loadDrawable()方法加载了一张图片后,它会保存到本地文件中,那当我需要这张图片时,就可以通过loadFile()方法进行查找。
x.image().loadFile(url,imageOptions,new Callback.CacheCallback<File>(){@Overridepublic boolean onCache(File result) {//在这里可以做图片另存为等操作Log.i("JAVA","file:"+result.getPath()+result.getName());return true; //相信本地缓存返回true}@Overridepublic void onSuccess(File result) {}@Overridepublic void onError(Throwable ex, boolean isOnCallback) {}@Overridepublic void onCancelled(CancelledException cex) {}@Overridepublic void onFinished() {}
});
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
4.xUtils3数据库模块的使用
首先在项目Application中进行初始化配置DaoConfig(与onCreate方法同级目录下):
/*** 初始化DaoConfig配置*/
DbManager.DaoConfig daoConfig = new DbManager.DaoConfig()//设置数据库名,默认xutils.db.setDbName("myapp.db")//设置数据库路径,默认存储在app的私有目录.setDbDir(new File("/mnt/sdcard/"))//设置数据库的版本号.setDbVersion(2)//设置数据库打开的监听.setDbOpenListener(new DbManager.DbOpenListener() {@Overridepublic void onDbOpened(DbManager db) {//开启数据库支持多线程操作,提升性能,对写入加速提升巨大db.getDatabase().enableWriteAheadLogging();}})//设置数据库更新的监听.setDbUpgradeListener(new DbManager.DbUpgradeListener() {@Overridepublic void onUpgrade(DbManager db, int oldVersion, int newVersion) {}})//设置表创建的监听.setTableCreateListener(new DbManager.TableCreateListener() {@Overridepublic void onTableCreated(DbManager db, TableEntity<?> table){Log.i("JAVA", "onTableCreated:" + table.getName());}});//设置是否允许事务,默认true//.setAllowTransaction(true)DbManager db = x.getDb(daoConfig);
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
然后创建数据库表ChildInfo的实体类:
/*** onCreated = "sql":当第一次创建表需要插入数据时候在此写sql语句*/
@Table(name = "child_info",onCreated = "")
public class ChildInfo {/*** name = "id":数据库表中的一个字段* isId = true:是否是主键* autoGen = true:是否自动增长* property = "NOT NULL":添加约束*/@Column(name = "id",isId = true,autoGen = true,property = "NOT NULL")private int id;@Column(name = "c_name")private String cName;public ChildInfo(String cName) {this.cName = cName;}//默认的构造方法必须写出,如果没有,这张表是创建不成功的public ChildInfo() {}public int getId() {return id;}public void setId(int id) {this.id = id;}public String getcName() {return cName;}public void setcName(String cName) {this.cName = cName;}@Overridepublic String toString() {return "ChildInfo{"+"id="+id+",cName='"+cName+'\''+'}';}
}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 39
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 39
之后就能进行创建和删除数据库的操作了:
2)创建数据库
//用集合向child_info表中插入多条数据
ArrayList<ChildInfo> childInfos = new ArrayList<>();
childInfos.add(new ChildInfo("zhangsan"));
childInfos.add(new ChildInfo("lisi"));
childInfos.add(new ChildInfo("wangwu"));
childInfos.add(new ChildInfo("zhaoliu"));
childInfos.add(new ChildInfo("qianqi"));
childInfos.add(new ChildInfo("sunba"));
//db.save()方法不仅可以插入单个对象,还能插入集合
db.save(childInfos);
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
3)删除数据库
db.dropDb();
- 1
- 1
4)删除表
db.dropTable(ChildInfo.class);
- 1
- 1
5)新增表中的数据
ChildInfo childInfo = new ChildInfo("zhangsan123");
db.save(childInfo);
- 1
- 2
- 1
- 2
6)删除表中的数据
//第一种写法:
db.delete(ChildInfo.class); //child_info表中数据将被全部删除
//第二种写法,添加删除条件:
WhereBuilder b = WhereBuilder.b();
b.and("id",">",2); //构造修改的条件
b.and("id","<",4);
db.delete(ChildInfo.class, b);
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 1
- 2
- 3
- 4
- 5
- 6
- 7
7)修改表中的数据
//第一种写法:
ChildInfo first = db.findFirst(ChildInfo.class);
first.setcName("zhansan2");
db.update(first,"c_name"); //c_name:表中的字段名
//第二种写法:
WhereBuilder b = WhereBuilder.b();
b.and("id","=",first.getId()); //构造修改的条件
KeyValue name = new KeyValue("c_name","zhansan3");
db.update(ChildInfo.class,b,name);
//第三种写法:
first.setcName("zhansan4");
db.saveOrUpdate(first);
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
8)查询表中的数据
//查询数据库表中第一条数据
ChildInfo first = db.findFirst(ChildInfo.class);
Log.i("JAVA",first.toString());
//添加查询条件进行查询
List<ChildInfo> all = db.selector(ChildInfo.class).where("id",">",2).and("id","<",4).findAll();
for(ChildInfo childInfo :all){Log.i("JAVA",childInfo.toString());
}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
5.xUtils3提供的其他一些方法
x.task().run(new Runnable() {@Overridepublic void run() {//异步代码}
});
- 1
- 2
- 3
- 4
- 5
- 6
- 1
- 2
- 3
- 4
- 5
- 6
2)UI同步执行
x.task().post(new Runnable() { @Overridepublic void run() {//同步代码}
});
xutils3使用方法相关推荐
- xutils3使用方法(很全面)
转载请注明出处:http://blog.csdn.net/tyk9999tyk/article/details/53306035 1.xUtils3简介以及文章更新 更新 2017/03/30 给表增 ...
- 手机影音第十三天,xutils3、Glide的使用获取网络图片;下拉、上滑刷新;缓存网络资源...
代码已经托管到码云上,感兴趣的小伙伴可以下载看看 https://git.oschina.net/joy_yuan/MobilePlayer 本次的网络资源地址使用的是时光网的api接口,地址如下: ...
- 在 Oracle Enterprise Linux 和 iSCSI 上构建您自己的 Oracle RAC 11g 集群
作者:Jeffrey Hunter 了解如何以低于 2,700 美元的费用在 Oracle Enterprise Linux 上安装并配置 Oracle RAC 11g 第 2 版开发集群. 本指南中 ...
- Java面试题大全2021版
一.Java 基础 JDK 和 JRE 有什么区别? JDK:Java Development Kit 的简称,java 开发工具包,提供了 java 的开发环境和运行环境. JRE:Java Run ...
- android xutil 数据库,Android XUtils3框架的基本使用方法(二)
上一篇Android中XUtils3框架使用方法详解(一)文章,主要介绍了XUtil3的注解模块,网络模块,图片加载模块,今天给大家带来数据库模块的讲解,现在主流的ORM框架很多,比如OrmLite, ...
- Xutils3 数据库模块的使用方法
1.开源地址 https://github.com/wyouflf/xUtils3/tree/master 2.导入工程 使用Gradle构建时添加一下依赖即可: compile 'org.xutil ...
- XUtils===XUtils3框架的基本使用方法
转载自:http://blog.csdn.NET/a1002450926/article/details/50341173 今天给大家带来XUtils3的基本介绍,本文章的案例都是基于XUtils3的 ...
- 认真点,带你全面了解xutils3
一.xUtils3简介 xUtils 包含了很多实用的android工具. xUtils 支持超大文件(超过2G)上传,更全面的http请求协议支持(11种谓词),拥有更加灵活的ORM,更多的事件注解 ...
- 红橙Darren视频笔记 IOC注解框架 了解xUtils3与ButterKnife的原理
1.什么是IOC IOC是Inversion of Control的缩写,直接翻译过来就叫依赖反转,看起来感觉不明觉厉,我觉得IOC就是一种解耦方式.比如原本我们在Activity中findviewb ...
最新文章
- Android左右连接和USING
- 为什么 Redis 单线程能支撑高并发?
- 一篇博客带你轻松应对java面试中的多线程与高并发
- Python基础教程: with语句详解
- 01_sklearn,安装sklearn,软件环境要求,第三方发行版
- MUI框架之输入框Input
- 家用简单电线路图_家庭配电箱接线图解 家用配电箱安装方法
- 布朗桥python_MATLAB 里面有哪些加快程序运行速度的方法呢,求分享?
- Oracle 性能优化之内核的shmall 和shmmax 参数
- 用于存储过程的ASP.NET Core Blazor和EF Core原始SQL查询
- 互联网运营数据分析(3): 留存分析
- 【案例】复制静止问题一则
- LeetCode:Path Sum
- Pandas数据清洗总结
- 自己动手搭建家庭局域网(一),服务器搭建和文件共享
- pxe网络安装服务器的部署
- 《本科-线性代数笔记-精简汇总》,纯手工!
- 常用材料的弹性模量、泊松比、密度
- 嵌入式Linux系统移植的四大步骤(详细长文,慎入!)
- 电流环、速度环、位置环的优化