xUtils使用詳細介紹


xUtils3使用詳解


一、xUtils簡介:

xUtils是基於Afinal開發的目前功能比較完善的一個Android開源框架,官網:https://github.com/wyouflf/xUtils3

  • xUtils 包含了orm, http(s), image, view注解, 但依然很輕量級(246K), 並且特性強大, 方便擴展:
    1. 穩定的基石: AbsTask和統一的回調接口Callback, 任何異常, 即使你的回調方法實現有異常都會進入onError, 任何情況下onFinished總會讓你知道任務結束了.
  1. 基於高效穩定的orm工具, http模塊得以更方便的實現cookie(支持domain, path, expiry等特性)和 緩存(支持Cache-Control, Last-Modified, ETag等特性)的支持.
  2. 有了強大的http及其下載緩存的支持, image模塊的實現相當的簡潔, 並且支持回收被view持有, 但被Mem Cache移除的圖片, 減少頁面回退時的閃爍..
  3. view注解模塊僅僅400多行代碼卻靈活的支持了各種View注入和事件綁定, 包括擁有多了方法的listener的支持.

其他特性:

  • 支持超大文件(超過2G)上傳
  • 更全面的http請求協議支持(11種謂詞)
  • 擁有更加靈活的ORM, 和greenDao一致的性能
  • 更多的事件注解支持且不受混淆影響...
  • 圖片綁定支持gif(受系統兼容性影響, 部分gif文件只能靜態顯示), webp; 支持圓角, 圓形, 方形等裁剪, 支持自動旋轉...
  • 從3.5.0開始不再包含libwebpbackport.so, 需要在Android4.2以下設備兼容webp的請使用3.4.0版本.

總的來說。xutils主要有4個模塊:注解模塊,網絡模塊,圖片加載模塊,數據庫模塊。

二、使用前配置

1.使用Gradle構建時添加一下依賴即可:
compile 'org.xutils:xutils:3.4.0' 
或在直接在android studio引入xutils3

2.需要的權限:

<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />

三、初始化過程:

新建一個類MyApplication繼承Application:
//初始化
public class MyApplication extends Application {
   public void onCreate() {
    super.onCreate();
    x.Ext.init(this);
    x.Ext.setDebug(true); //是否輸出debug日志,開啟debug會影響性能。
	}
}
在Manifest文件中注冊MyApplication
<application

android:name=".MyApp" //注冊MyApplication
...
</application

四、注解模塊

注解(Annotation)為我們在代碼中添加信息提供了一種形式化的方法,是我們可以在稍后某個時刻方便地使用這些數據(通過 解析注解 來使用這些數據)

1.@ContentView:

加載當前的Activity布局時 將@ContentView加入到Activity的上方

2.@ViewInject

View注解的作用是代替我們寫了findViewById這行代碼,一般用於敏捷開發。

3.@Event事件注解

處理控件的各種響應事件,需要注意的是:


 * 1. 方法必須私有限定,
 * 2. 方法參數形式必須和type對應的Listener接口一致.
 * 3. 注解參數value支持數組: value={id1, id2, id3}
 * 4. type默認View.OnClickListener.class,即可故可以不寫,直接寫@Event(R.id.bt1)如果你想實現其余點擊事件效果,只需要把type值進行修改

例:MainActivity

@ContentView(R.layout.activity_main)//加載布局xml
public class MainActivity extends AppCompatActivity {
	// view注解要求必須提供id,以使代碼混淆不受影響。
	// 代價是增加了一次反射,每個控件都會。而反射是比較犧牲性能的做法,所以使用View注解算是有利有弊吧。
	@ViewInject(R.id.tv1)
	private TextView tv1;


	protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    x.view().inject(this); //綁定注解
	}
	
	//Event事件注解 ,點擊bt1后彈出bt1測試
	@Event(value = {R.id.bt1},type = View.OnClickListener.class) 
	//方法需要用private
	private void onTest1click(View view){

    Toast.makeText(this,"bt1測試",Toast.LENGTH_LONG).show();
	}
	//長按事件
	@Event(value = R.id.Long,type = View.OnLongClickListener.class)
	private boolean testOnLongClickListener(View v){
	Toast.makeText(this,"btLong測試",Toast.LENGTH_LONG).show();  
	return true;
	}
}

例:fragment

@ContentView(R.layout.fragment_base)
public class BaseFragment extends Fragment {
	@Nullable
	@Override
	public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
    return x.view().inject(this, inflater, container);
	}
	@Override
	public void onViewCreated(View v, @Nullable Bundle savedInstanceState) {
    super.onViewCreated(v, savedInstanceState);
	}
}

五、網絡模塊

xUtils3網絡模塊大大方便了在實際開發中網絡模塊的開發,xUtils3網絡模塊大致包括GET請求、POST請求、如何使用其他請求方式、上傳文件、下載文件、使用緩存等功能。
Get請求
@Event(value = {R.id.bt2},type = View.OnClickListener.class)//注解
private void onTestGet(View view){
	String url ="http://10.203.0.4:8080/login"
    RequestParams params = new RequestParams(url);
    //params.setSslSocketFactory(...); // 設置ssl
    
    params.addQueryStringParameter("username","abc");
    params.addQueryStringParameter("password","123");
    x.http().get(params, new Callback.CommonCallback<String>() {

        public void onSuccess(String result) {
            Toast.makeText(x.app(), result, Toast.LENGTH_LONG).show();
            Log.i("JAVA", "onSuccess result:" + result);

        }
        //請求異常后的回調方法
        @Override
        public void onError(Throwable ex, boolean isOnCallback) {
        }
        //主動調用取消請求的回調方法
        @Override
        public void onCancelled(CancelledException cex) {
        }
        @Override
        public void onFinished() {

        }
    });
   
}
Post請求
@Event(R.id.bt2)
private void onTestPost(View v) {
    String url = "http://10.203.0.4:8080/login";
    RequestParams params = new RequestParams(url);
    params.addParameter("username", "abc");
	params.addParameter("password", "123");
    x.http().request(HttpMethod.PUT, params, new Callback.CommonCallback<String>() {
        @Override
        public void onSuccess(String result) {
		Toast.makeText(x.app(),result,Toast.LENGTH_LONG).show();
        }
        @Override
        public void onError(Throwable ex, boolean isOnCallback) {
        }
        @Override
        public void onCancelled(CancelledException cex) {
        }
        @Override
        public void onFinished() {
        }
    });
}
使用緩存
@Event(R.id.cache)
private void cache(View v) {
RequestParams params = new RequestParams(url);
params.setCacheMaxAge(1000*60); //為請求添加緩存時間
Callback.Cancelable cancelable = x.http().get(params, new Callback.CacheCallback<string>() {
    @Override
    public void onSuccess(String result) {
        Log.i("JAVA","onSuccess:"+result);
    }
    @Override
    public void onError(Throwable ex, boolean isOnCallback) {
    }
    @Override
    public void onCancelled(CancelledException cex) {
    }
    @Override
    public void onFinished() {
    }
    //result:緩存內容
    @Override
    public boolean onCache(String result) {
        //在setCacheMaxAge設置范圍(上面設置的是60秒)內,如果再次調用GET請求,
        //返回true:緩存內容被返回,相信本地緩存,返回false:緩存內容被返回,不相信本地緩存,仍然會請求網絡
        Log.i("JAVA","cache:"+result);
        return true;
    }
});
上傳文件
@Event(R.id.upload)
private void upload(View v){
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>() {
    @Override
    public void onSuccess(String result) {
    }
    @Override
    public void onError(Throwable ex, boolean isOnCallback) {
    }
    @Override
    public void onCancelled(CancelledException cex) {
    }
    @Override
    public void onFinished() {
    }
});
下載文件
@Event(R.id.download)
private void download(View v){
url = "http://10.203.0.4:8080/server/nfctest.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>() {
    @Override
    public void onSuccess(File result) {
        //apk下載完成后,調用系統的安裝方法
        Intent intent = new Intent(Intent.ACTION_VIEW);
        intent.setDataAndType(Uri.fromFile(result), "application/vnd.android.package-archive");
        startActivity(intent);
    }
    @Override
    public void onError(Throwable ex, boolean isOnCallback) {
    }
    @Override
    public void onCancelled(CancelledException cex) {
    }
    @Override
    public void onFinished() {
    }
    //網絡請求之前回調
    @Override
    public void onWaiting() {
    }
    //網絡請求開始的時候回調
    @Override
    public void onStarted() {
    }
    //下載的時候不斷回調的方法
    @Override
    public void onLoading(long total, long current, boolean isDownloading) {
        //當前進度和文件總大小
        Log.i("JAVA","current:"+ current +",total:"+total); 
    }
});
### 六、圖片加載模塊 xUtils3圖片模塊,重點在於加載圖片的4個bind方法,loadDrawable與loadFIle用法和ImageOptions用法 ### bind的幾個方法
void bind(ImageView view, String url);

void bind(ImageView view, String url, ImageOptions options);

void bind(ImageView view, String url, Callback.CommonCallback<Drawable> callback);

void bind(ImageView view, String url, ImageOptions options, Callback.CommonCallback<Drawable> callback);

Callback.Cancelable loadDrawable(String url, ImageOptions options, Callback.CommonCallback<Drawable> callback);

Callback.Cancelable loadFile(String url, ImageOptions options, Callback.CacheCallback<File> callback);
1.首先獲取ImageView控件
@ViewInject(R.id.iv1)
ImageView image01;
@ViewInject(R.id.iv2)
ImageView image02;
...
2.定義圖片網絡地址或本地地址
String[] urls = {
        "http://img4.imgtn.bdimg.com/it/u=3182769660,1810895318&fm=23&gp=0.jpg",
        "http://img2.imgtn.bdimg.com/it/u=1278435851,1308167727&fm=23&gp=0.jpg",
        "http://img2.3lian.com/2014/f4/199/d/6.jpg",
        "http://pic1.win4000.com/wallpaper/4/584b9ea3a511c.jpg"
		...


};	
3,通過ImageOptions.Builder().set方法設置圖片的屬性 然后通過bind方法加載圖片,顯示圖片方法setImg()如下:
private void setImg() {
    /**
     * 通過ImageOptions.Builder().set方法設置圖片的屬性
     */
    ImageOptions options = 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

    /**
     * 加載圖片的4個bind方法
     */
    x.image().bind(image01, urls[0]);

    x.image().bind(image02, urls[1], options);

    x.image().bind(image03, urls[2], options, new Callback.CommonCallback<Drawable>() {
        @Override
        public void onSuccess(Drawable result) {
        }
        @Override
        public void onError(Throwable ex, boolean isOnCallback) {
        }
        @Override
        public void onCancelled(CancelledException cex) {
        }
        @Override
        public void onFinished() {
        }
    });
    x.image().bind(image04, urls[3], options, new Callback.CommonCallback<Drawable>() {
        @Override
        public void onSuccess(Drawable result) {
        }
        @Override
        public void onError(Throwable ex, boolean isOnCallback) {
        }
        @Override
        public void onCancelled(CancelledException cex) {
        }
        @Override
        public void onFinished() {
        }
    });

    /**
     * loadDrawable()方法加載圖片
     */
    Callback.Cancelable cancelable = x.image().loadDrawable(urls[4], options, new Callback.CommonCallback<Drawable>() {
        @Override
        public void onSuccess(Drawable result) {
            image05.setImageDrawable(result);
        }
        @Override
        public void onError(Throwable ex, boolean isOnCallback) {
        }
        @Override
        public void onCancelled(CancelledException cex) {
        }
        @Override
        public void onFinished() {
        }
    });
    //主動取消loadDrawable()方法
    //cancelable.cancel();

    /**
     * loadFile()方法
     * 應用場景:當我們通過bind()或者loadDrawable()方法加載了一張圖片后,
     * 它會保存到本地文件中,那當我需要這張圖片時,就可以通過loadFile()方法進行查找。
     * urls[0]:網絡地址
     */
    x.image().loadFile(urls[0],options,new Callback.CacheCallback<File>(){
        @Override
        public boolean onCache(File result) {
            //在這里可以做圖片另存為等操作
            Log.i("JAVA","file:"+result.getPath()+result.getName());
            return true; //相信本地緩存返回true
        }
        @Override
        public void onSuccess(File result) {
            Log.i("JAVA","file");
        }
        @Override
        public void onError(Throwable ex, boolean isOnCallback) {
        }
        @Override
        public void onCancelled(CancelledException cex) {
        }
        @Override
        public void onFinished() {
        }
    });
}
###七:數據庫模塊的使用 ### 首先進行配置DaoConfig:
DbManager.DaoConfig daoConfig = new DbManager.DaoConfig()
        //設置數據庫名,默認xutils.db
        .setDbName("myapp.db")
        // 不設置dbDir時, 默認存儲在app的私有目錄.
        .setDbDir(new File("/sdcard")) // "sdcard"的寫法並非最佳實踐, 這里為了簡單, 先這樣寫了.
        .setDbVersion(1)//數據庫版本

        //設置是否允許事務,默認true
        //.setAllowTransaction(true)

        //設置表創建的監聽
        .setTableCreateListener(new DbManager.TableCreateListener(){

            @Override
            public void onTableCreated(DbManager db, TableEntity<?> table) {
                Log.i("JAVA", "onTableCreated:" + table.getName());
            }
        })

        //設置數據庫更新的監聽
        .setDbUpgradeListener(new DbManager.DbUpgradeListener() {
            @Override
            public void onUpgrade(DbManager db, int oldVersion, int newVersion) {

            }
        })
        //設置數據庫打開的監聽
        .setDbOpenListener(new DbManager.DbOpenListener() {
            @Override
            public void onDbOpened(DbManager db) {
                //開啟數據庫支持多線程操作,提升性能
                db.getDatabase().enableWriteAheadLogging();
            }
        });
DbManager db = x.getDb(daoConfig);
然后創建數據庫表Person的實體類:
/**
 * onCreated = "sql" sql:當第一次創建表需要插入數據時候在此寫sql語句例:CREATE UNIQUE INDEX index_name ON person(id,name)
 */
@Table(name ="person",onCreated = "")
public class Person {
	/**
 	* 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 name;

	public Person(String name) {
    	this.name = name;
	}

	//默認的構造方法必須寫出,如果沒有,這張表是創建不成功的
	public Person() {

	}

	public int getId() {
    	return id;
	}
	public void setId(int id) {
    	this.id = id;
	}

	public String getName() {
    	return name;
	}

	public void setName(String name) {
    	this.name = name;
	}
	@Override
	public String toString() {
    	return "Person{" +
            	"id=" + id +
            	", name='" + name + '\'' +
            	'}';
	}
}
數據庫的創建與刪除以及數據的增刪改查
數據庫的創建
//數據庫的創建
@Event(R.id.create_db)
private void createDB(View v) throws DbException {
    //用集合向Person表中插入多條數據
    ArrayList<Person> person = new ArrayList<>();
    person.add(new Person("張三"));
    person.add(new Person("李四"));
    person.add(new Person("趙六"));

    //db.save()方法不僅可以插入單個對象,還能插入集合
    db.save(person);
}
數據庫的刪除
//刪除數據庫
@Event(R.id.del_db)
private void delDB(View v) throws DbException {

    db.dropDb();
}
表的刪除
@Event(R.id.del_table)
private void delTable(View v) throws DbException {
    db.dropTable(Person.class);
}
查詢數據
@Event(R.id.select_table)
private void selelctDB(View v) throws DbException {
    //查詢數據庫表中第一條數據
    Person first = db.findFirst(Person.class);
    Log.i("JAVA",first.toString());

    //findAll():查詢所有結果
    List<Person> personAll =db.findAll(Person.class);
    List<String > list = new ArrayList<String>();
    for(int i=0;i<personAll.size();i++){
        list.add(personAll.get(i).toString());
    }
    ArrayAdapter<String> adapter = new ArrayAdapter<String>(MainActivity.this,android.R.layout.simple_list_item_1,list);
    lv1.setAdapter(adapter); 

	//添加查詢條件進行查詢
    WhereBuilder b = WhereBuilder.b();
    b.and("id",">",2); //構造修改的條件
    b.and("id","<",4);
    List<Person> all = db.selector(Person.class).where(b).findAll();
    //第二種寫法:
    List<Person> all2 = db.selector(Person.class).where("id",">",2).and("id","<",4).findAll();
    for(Person person :all){
        Log.i("JAVA",person.toString());
    }
}
修改數據
//修改表中數據
@Event(R.id.update_table)
private void updateTable(View v) throws DbException {
    //第一種寫法:
    Person first = db.findFirst(Person.class);
    first.setName("張三01");
    db.update(first, "c_name"); //c_name:表中的字段名
    //第二種寫法:
    WhereBuilder b = WhereBuilder.b();
    b.and("id", "=", first.getId()); //構造修改的條件
    KeyValue name = new KeyValue("c_name", "張三02");
    db.update(Person.class, b, name);

    //第三種寫法:
    first.setName("張三修改");
    db.saveOrUpdate(first);
	Toast.makeText(this,"修改成功",Toast.LENGTH_LONG).show();
}
刪除數據
@Event(R.id.del_table_data)
private void delTableData(View v) throws DbException {
    //第一種寫法:
    db.delete(Person.class); //child_info表中數據將被全部刪除
    //第二種寫法,添加刪除條件:
    WhereBuilder b = WhereBuilder.b();
    b.and("id",">",2); //構造修改的條件
    b.and("id","<",4);
    db.delete(Person.class, b);
}



免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM