xUtils更新到3.0後的基本使用規則
說實話,對於xUtils,是我最近才用到的開發框架(也是剛接觸),對於其功能不得不說,簡化了很多的開發步驟,可以說是非常好的開發工具,但是其最近更新到3.0也沒有解決載入自定義ImageView報錯的問題。
我總是喜歡用一些最新的東西,xUtils 3.0才剛更新,是一次比較大的重構,對於百度到的使用規則,基本都是3.0以前的,使得用3.0的開發者需要求解用法的時候,遇到許多阻礙,故此在這裡簡單介紹xUtils 3.0的使用規則。關於怎麼匯入功能,其實並不是本文的內容,不過在此文最後一節簡單講解了一下匯入的方式。
1.xUtils中的IOC框架
使用xUtils的第一步就是必須建立自己的Application類,程式碼如下:
public class LYJApplication extends Application { @Override public void onCreate() { super.onCreate(); x.Ext.init(this);//Xutils初始化 } }
在AndroidManifest.xml的application標籤中新增如下程式碼:
android:name=".LYJApplication"
這樣初始化就算完成了。
使用IOC框架的程式碼如下:
import org.xutils.view.annotation.ContentView; import org.xutils.view.annotation.Event; import org.xutils.view.annotation.ViewInject; import org.xutils.x; @ContentView(value = R.layout.activity_main) public class MainActivity extends AppCompatActivity { @ViewInject(value = R.id.mybut) private Button mybut; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); x.view().inject(this); } @Event(value = R.id.mybut,type = View.OnClickListener.class) private void onButtonClick(View v){ switch (v.getId()){ case R.id.mybut: Toast.makeText(this,"你好我是Xutils的IOC功能",Toast.LENGTH_SHORT).show(); break; } } }
需要解釋的以下幾點:
其一:使用IOC必須全部為私有,不然無效,這裡就做演示了,不信你可以把用到IOC框架的註解的成員變數及方法全部換成public ,那麼全部會無效,當然除了ContentView例外。
其二,所有用到IOC成員變數,使用的時候,必須在x.view().inject(this)後,如果寫在前面,那麼程式會崩潰。
2.xUtils載入圖片功能
現在我們需要設定兩個許可權,如下:
<uses-permission android:name="android.permission.INTERNET" /> <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
接下來就是載入網路圖片到imageView中:
也可以設定引數:
ImageOptions imageOptions = new ImageOptions.Builder() .setSize(DensityUtil.dip2px(120), DensityUtil.dip2px(120))//圖片大小 .setRadius(DensityUtil.dip2px(5))//ImageView圓角半徑 .setCrop(true)// 如果ImageView的大小不是定義為wrap_content, 不要crop. .setImageScaleType(ImageView.ScaleType.CENTER_CROP) .setLoadingDrawableId(R.mipmap.ic_launcher)//載入中預設顯示圖片 .setFailureDrawableId(R.mipmap.ic_launcher)//載入失敗後預設顯示圖片 .build(); x.image().bind(image, "http://pic.baike.soso.com/p/20090711/20090711101754-314944703.jpg",imageOptions);
你也可以將第2個引數設定為圖片檔案路徑,那麼將從SD卡中載入圖片。
3.xUtils操作資料庫
我們都知道,一個App中操作資料庫的地方有很多,就像是否登入一樣,有些地方必須登入後才能操作,那麼肯定是全域性變數,所以,必須將資料庫的初始化放在Application,且必須提供獲取資料庫的方法,使得在應用程式的任何地方都可以直接獲取資料庫,並操作資料庫,不然重複的獲取與釋放只能增加記憶體無謂的消耗。
初始化資料庫:
public class LYJApplication extends Application { private DbManager.DaoConfig daoConfig; public DbManager.DaoConfig getDaoConfig() { return daoConfig; } @Override public void onCreate() { super.onCreate(); x.Ext.init(this);//Xutils初始化 daoConfig = new DbManager.DaoConfig() .setDbName("lyj_db")//建立資料庫的名稱 .setDbVersion(1)//資料庫版本號 .setDbUpgradeListener(new DbManager.DbUpgradeListener() { @Override public void onUpgrade(DbManager db, int oldVersion, int newVersion) { // TODO: ... // db.addColumn(...); // db.dropTable(...); // ... } });//資料庫更新操作 } }
上面的註釋明瞭,有必要說明的一點是setDbDir(new File("/sdcard")),可以將資料庫儲存在你想儲存的地方,如果不設定,那麼資料庫預設儲存在/data/data/你的應用程式/database/xxx.db下。這裡我們就預設放在應用程式下。
我們首先建立一個實體類,如下:
@Table(name="lyj_person") public class LYJPerson { @Column(name = "id", isId = true) private int id; @Column(name = "name") private String name; @Column(name = "age") private String age; public String getAge() { return age; } public void setAge(String age) { this.age = age; } 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; } }
通過實體類可以直接操作資料庫。
我們在Application中加入如下程式碼,向資料庫新增資料:
DbManager db = x.getDb(daoConfig); LYJPerson person1=new LYJPerson(); person1.setName("liyuanjinglyj"); person1.setAge("23"); LYJPerson person2=new LYJPerson(); person2.setName("xutilsdemo"); person2.setAge("56"); try { db.save(person1); db.save(person2); } catch (DbException e) { e.printStackTrace(); }
在Activity中操作獲取資料庫資料的程式碼如下:
DbManager db = x.getDb(((LYJApplication)getApplicationContext()).getDaoConfig()); try { List<LYJPerson> lyjPersons=db.selector(LYJPerson.class).findAll(); for (int i=0;i<lyjPersons.size();i++){ Log.i("liyuanjinglyj","LYJPerson"+i+".name="+lyjPersons.get(i).getName()); Log.i("liyuanjinglyj","LYJPerson"+i+".name="+lyjPersons.get(i).getAge()); } } catch (DbException e) { e.printStackTrace(); }
那麼肯定會得到如下結果:
4.xUtils的網路請求
Android規定UI執行緒是不能涉及網路任務的,所以,這裡主要簡單介紹Xutils的非同步網路請求,同步的自行探究。
使用格式如下:
RequestParams params = new RequestParams("http://blog.csdn.net/mobile/experts.html"); x.http().get(params, new Callback.CommonCallback<String>() { @Override public void onSuccess(String result) { Document doc = Jsoup.parse(result); Element div = doc.select("div.list_3").get(0); Elements imgs = div.getElementsByTag("img"); for (int i = 0; i < imgs.size(); i++) { Element img = imgs.get(i); Log.i("liyuanjinglyj",img.attr("alt")); } } @Override public void onError(Throwable ex, boolean isOnCallback) { } @Override public void onCancelled(Callback.CancelledException cex) { } @Override public void onFinished() { } });
這裡獲取的是CSDN移動部落格專家的HTML頁面資訊,看看下面的日誌,就知道Xutils網路功能還是很強大的。
本文最後附帶了一下粗略模仿CSDN APP的原始碼,有意者可以下載看看,裡面用到另一個開發框架,我用來專門處理圖片的(afinal)。都說xUtils是afinal的進化版,不過在圖片方面,我們覺得xUtils還有點不足。
5..匯入xUtils工程到Android Studio
下載地址如下:
㈠將下載的工程複製到Project目錄下:
㈡新增到settings.gradle檔案:
include ':app',':xutils'
㈢編譯到工程中
dependencies { compile fileTree(dir: 'libs', include: ['*.jar']) compile 'com.android.support:appcompat-v7:23.0.1' compile project(':xutils') }
㈣將xutils資料夾下的build.gradle中的版本與最低版本調整到與建立工程一致
compileSdkVersion 23 buildToolsVersion "23.0.1" defaultConfig { minSdkVersion 15 targetSdkVersion 23 versionCode 20151224 versionName version }
㈤新增如下程式碼到build.gradle(Project:XutilsDemo)中
dependencies { classpath 'com.android.tools.build:gradle:1.3.0' classpath 'com.jfrog.bintray.gradle:gradle-bintray-plugin:1.2' classpath 'com.github.dcendents:android-maven-gradle-plugin:1.3' // NOTE: Do not place your application dependencies here; they belong // in the individual module build.gradle files }
其中紅色標記為新增的程式碼。
點選Sync now就可以使用xUtils了。