简介
xUtils是一款简单的对网络请求以及数据库操作的工具,并且提供了非常好的异常处理方法onError,并且对图片的加载显示等一系类操作也非常简介好用。使用注解来加载布局控件的方法也非常的简单好用
用法
compile 'org.xutils:xutils:3.5.0'
下面就可以对XUtils进行操作了,首先初始化数据xUtils
package com.bawei.qiaoshi.xutilsdome;
import android.app.Application;
import android.widget.Toast;
import org.xutils.DbManager;
import org.xutils.db.table.TableEntity;
import org.xutils.x;
/**
* 作 者:
* 创作时间:2017/7/6
* 项目名称:XutilsDome
*/
public class App extends Application {
private DbManager.DaoConfig daoConfig;
//初始化
@Override
public void onCreate() {
super.onCreate();
// 初始化XUtils
x.Ext.init(this);
// 设置日志的级别
x.Ext.setDebug(BuildConfig.DEBUG);
// 在初始化中创建数据库
daoConfig= new DbManager.DaoConfig()
.setDbName("users.db")//表名
.setDbVersion(2)//表的版本(用于升级)
.setAllowTransaction(true)//是否允许开启事务(操作数据快)
.setDbOpenListener(new DbManager.DbOpenListener() {//打开数据库监听
@Override
public void onDbOpened(DbManager db) {
// 开启WAL, 对写入加速提升巨大
db.getDatabase().enableWriteAheadLogging();
}
})
.setTableCreateListener(new DbManager.TableCreateListener() {//表创建成功的监听
@Override
public void onTableCreated(DbManager db, TableEntity> table) {
Toast.makeText(App.this, table.getName(), Toast.LENGTH_SHORT).show();
}
});
}
public DbManager.DaoConfig getDaoConfig(){
// 将创建好的数据库传到MainActivity里进行具体的操作
return daoConfig;
}
}
可以看见初始化的同时创建了日志以及数据库,但是设置日志级别时会影响性能
这个是开启一个WAL模式对写入数据库的速度提升很大
db.getDatabase().enableWriteAheadLogging();
public DbManager.DaoConfig getDaoConfig(){
// 将创建好的数据库传到MainActivity里进行具体的操作
return daoConfig;
}
这个方法本人的理解就是当数据库创建成功的时候我们可以通过该方法将DaoConfig返回到MainActivity的方法中。
package com.bawei.qiaoshi.xutilsdome;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.util.Log;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.ImageView;
import android.widget.ListView;
import android.widget.TextView;
import android.widget.Toast;
import com.google.gson.Gson;
import org.xutils.DbManager;
import org.xutils.common.Callback;
import org.xutils.ex.DbException;
import org.xutils.http.RequestParams;
import org.xutils.image.ImageOptions;
import org.xutils.view.annotation.ContentView;
import org.xutils.view.annotation.Event;
import org.xutils.view.annotation.ViewInject;
import org.xutils.x;
import java.util.ArrayList;
import java.util.List;
/**
*
*@作者:
*@日期: 2017/7/6
* 用该框架实现对数据库的存储,网络请求数据,和对数据的适配
* 一定得在清单文件里面配置android:name=".App"切记
*/
@ContentView(R.layout.activity_main)
public class MainActivity extends AppCompatActivity {
@ViewInject(R.id.tv)
private TextView tv;
private App app;
@ViewInject(R.id.listview)
private ListView listview;
private String path="http://qhb.2dyt.com/Bwei/news";
private List list=new ArrayList<>();
private MyAdapter adapter;
private DbManager db;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
// 使用注解来加载布局和控件
// 引用初始化的Xutils
// 加载当前引用的布局
x.view().inject(this);
// 这个和实例对象很相似只有实例化才能调用里面的方法
// 到这里数据库已经创建成功只是没有数据
app= (App) getApplication();
// db=x.getDb(app.getDaoConfig());
db = x.getDb(app.getDaoConfig());
adapter = new MyAdapter();
listview.setAdapter(adapter);
tv.setText("just 搜搜");
// 对数据库的操作
try {
List listBeen = db.findAll(ListBean.class);
Log.e("TTTTTTTTTTTT",listBeen.toString()+"HHHHH");
if (listBeen!=null&&listBeen.size()>0){
list.addAll(listBeen);
adapter.notifyDataSetChanged();
}else {
getData();
}
} catch (Exception e) {
e.printStackTrace();
}
ListBean bean=new ListBean();
bean.setTitle("乔石");
bean.setPic("HHHHHHHHHHHHHH");
try {
db.save(bean);
} catch (DbException e) {
e.printStackTrace();
}
}
// 如果给他设置点击的监听事件的话当然这里是可以设置具体类型的默认是点击事件
@Event(value = R.id.tv)
private void click(View v){
Toast.makeText(MainActivity.this,"点击了"+((TextView)v).getText(),Toast.LENGTH_LONG).show();
}
// 定义一个加载数据的方法
private void getData() {
// RequestParams params=new RequestParams(urlPath);
RequestParams params = new RequestParams(path);
//?page=1&type=5&postkey=1503d这里也可以网络请求的接口地址进行拼接
params.addQueryStringParameter("page","1");
params.addQueryStringParameter("type","5");
params.addQueryStringParameter("postkey","1503d");
// 从网络获取数据
x.http().get(params, new Callback.CommonCallback() {
@Override
public void onSuccess(String result) {
// 网络请求成功时
Gson gson = new Gson();
UserBean json = gson.fromJson(result, UserBean.class);
list.addAll(json.getList());
adapter.notifyDataSetChanged();
// 把集合里面的数据添加的集合
try {
db.save(list);
} catch (DbException e) {
e.printStackTrace();
}
}
@Override
public void onError(Throwable ex, boolean isOnCallback) {
// 出现错误是
}
@Override
public void onCancelled(CancelledException cex) {
// 取消时
}
@Override
public void onFinished() {
// 完成时
}
});
}
// 定义内部类适配数据
class MyAdapter extends BaseAdapter{
// 里面带的加载图片的方法
// 当设置属性时这里图片会模糊失真
ImageOptions options=new ImageOptions.Builder()
.setSize(600,800)
.setFailureDrawableId(R.mipmap.ic_launcher)
.setLoadingDrawableId(R.mipmap.ic_launcher)
.setRadius(10)
.build();
@Override
public int getCount() {
return list.size();
}
@Override
public Object getItem(int position) {
return list.get(position);
}
@Override
public long getItemId(int position) {
return position;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
ViewHolder holder=null;
if(convertView==null){
convertView=View.inflate(MainActivity.this,R.layout.list_item,null);
holder=new ViewHolder();
x.view().inject(holder,convertView);
convertView.setTag(holder);
}else{
holder= (ViewHolder) convertView.getTag();
}
holder.title.setText(list.get(position).getTitle());
//这里是对网络请求的图片地址分割一下
String imageUrl = list.get(position).getPic().split("\\|")[0];
//适配图片
x.image().bind(holder.image,imageUrl,options);
return convertView;
}
class ViewHolder{
@ViewInject(R.id.item_title)
TextView title;
@ViewInject(R.id.item_img)
ImageView image;
}
}
}
这里就是通过注解的方法来引用布局并且把从网络上获取来的图片通过listview展示出来
其实代码中的注释已经很详细了,但实现这个方法时,他里面封装了对主线与子线程之间的处理机制并且通过onSuccess(String result)方法返回从网络上请求来的数据(个人认为这就和Handler 机制很相似)所以可以在里面进行数据的解析以及创建数据库
x.http().get(params, new Callback.CommonCallback()
数据库的创建
xUtils也提供了非常简单的创建数据的方法(也是通过注解来实现)由于对于内部类创建数据库有肯能不识别,所以我们把要用到的内部类专门写到一个类来建表
import org.xutils.db.annotation.Column;
import org.xutils.db.annotation.Table;
/**
* 作 者
* 创作时间:2017/7/6
* 项目名称:XutilsDome
*/
//表名
@Table(name = "new")
public class ListBean {
//这个才是我真正想要的数据
// 决定把id(数据库肯定会有id自增字段) pic 和 title写进数据库 同样通过注解来实现创建数据库的表
// 这里的字段和注解的字段不一定要相同
private String date;
@Column(name = "id",isId = true)
private int id;
@Column(name = "pic")
private String pic;
@Column(name = "title")
private String title;
private int type;
public String getDate() {
return date;
}
public void setDate(String date) {
this.date = date;
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getPic() {
return pic;
}
public void setPic(String pic) {
this.pic = pic;
}
public String getTitle() {
return title;
}
public void setTitle(String title) {
this.title = title;
}
public int getType() {
return type;
}
public void setType(int type) {
this.type = type;
}
}
可见只需要把想要的字段加上注解(注意id 必须要有 @Column(name = “id”,isId = true))以及用到的类加上创建表的字段就可以实现。
最后要注意的是:由于我们初始化App类所以在使用时必须在清单文件里面加上才可以使用
android:name=".App"
到这XUtils的功能就基本实现了,至于像对数据库的操作(增删改查)我们就可以通过对ListBean对象操作来实现了。