1. 程式人生 > >Android 最火的快速開發框架XUtils

Android 最火的快速開發框架XUtils

最近搜了一些框架供初學者學習,比較了一下XUtils是目前git上比較活躍 功能比較完善的一個框架,是基於afinal開發的,比afinal穩定性提高了不少,下面是介紹:

xUtils簡介

  • xUtils 包含了很多實用的android工具。
  • xUtils 最初源於Afinal框架,進行了大量重構,使得xUtils支援大檔案上傳,更全面的http請求協議支援(10種謂詞),擁有更加靈活的ORM,更多的事件註解支援且不受混淆影響...
  • xUitls最低相容android 2.2 (api level 8)
  • 目前xUtils主要有四大模組:
    • DbUtils模組:

      • android中的orm框架,一行程式碼就可以進行增刪改查;
      • 支援事務,預設關閉;
      • 可通過註解自定義表名,列名,外來鍵,唯一性約束,NOT NULL約束,CHECK約束等(需要混淆的時候請註解表名和列名);
      • 支援繫結外來鍵,儲存實體時外來鍵關聯實體自動儲存或更新;
      • 自動載入外來鍵關聯實體,支援延時載入;
      • 支援鏈式表達查詢,更直觀的查詢語義,參考下面的介紹或sample中的例子。
    • ViewUtils模組:

      • android中的ioc框架,完全註解方式就可以進行UI,資源和事件繫結;
      • 新的事件繫結方式,使用混淆工具混淆後仍可正常工作;
      • 目前支援常用的20種事件繫結,參見ViewCommonEventListener類和包com.lidroid.xutils.view.annotation.event。
    • HttpUtils模組:

      • 支援同步,非同步方式的請求;
      • 支援大檔案上傳,上傳大檔案不會oom;
      • 支援GET,POST,PUT,MOVE,COPY,DELETE,HEAD,OPTIONS,TRACE,CONNECT請求;
      • 下載支援301/302重定向,支援設定是否根據Content-Disposition重新命名下載的檔案;
      • 返回文字內容的請求(預設只啟用了GET請求)支援快取,可設定預設過期時間和針對當前請求的過期時間。
    • BitmapUtils模組:

      • 載入bitmap的時候無需考慮bitmap載入過程中出現的oom和android容器快速滑動時候出現的圖片錯位等現象;
      • 支援載入網路圖片和本地圖片;
      • 記憶體管理使用lru演算法,更好的管理bitmap記憶體;
      • 可配置執行緒載入執行緒數量,快取大小,快取路徑,載入顯示動畫等...

    使用xUtils快速開發框架需要有以下許可權:

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

    混淆時注意事項:

    • 新增Android預設混淆配置${sdk.dir}/tools/proguard/proguard-android.txt
    • 不要混淆xUtils中的註解型別,新增混淆配置:-keep class * extends java.lang.annotation.Annotation { *; }
    • 對使用DbUtils模組持久化的實體類不要混淆,或者註解所有表和列名稱@Table(name="xxx"),@Id(column="xxx"),@Column(column="xxx"),@Foreign(column="xxx",foreign="xxx");

    DbUtils使用方法:

    DbUtils db = DbUtils.create(this);
    User user = new User(); //這裡需要注意的是User物件必須有id屬性,或者有通過@ID註解的屬性
    user.setEmail("[email protected]");
    user.setName("wyouflf");
    db.save(user); // 使用saveBindingId儲存實體時會為實體的id賦值
    
    ...
    // 查詢
    Parent entity = db.findById(Parent.class, parent.getId());
    List<Parent> list = db.findAll(Parent.class);//通過型別查詢
    
    Parent Parent = db.findFirst(Selector.from(Parent.class).where("name","=","test"));
    
    // IS NULL
    Parent Parent = db.findFirst(Selector.from(Parent.class).where("name","=", null));
    // IS NOT NULL
    Parent Parent = db.findFirst(Selector.from(Parent.class).where("name","!=", null));
    
    // WHERE id<54 AND (age>20 OR age<30) ORDER BY id LIMIT pageSize OFFSET pageOffset
    List<Parent> list = db.findAll(Selector.from(Parent.class)
                                       .where("id" ,"<", 54)
                                       .and(WhereBuilder.b("age", ">", 20).or("age", " < ", 30))
                                       .orderBy("id")
                                       .limit(pageSize)
                                       .offset(pageSize * pageIndex));
    
    // op為"in"時,最後一個引數必須是陣列或Iterable的實現類(例如List等)
    Parent test = db.findFirst(Selector.from(Parent.class).where("id", "in", new int[]{1, 2, 3}));
    // op為"between"時,最後一個引數必須是陣列或Iterable的實現類(例如List等)
    Parent test = db.findFirst(Selector.from(Parent.class).where("id", "between", new String[]{"1", "5"}));
    
    DbModel dbModel = db.findDbModelAll(Selector.from(Parent.class).select("name"));//select("name")只取出name列
    List<DbModel> dbModels = db.findDbModelAll(Selector.from(Parent.class).groupBy("name").select("name", "count(name)"));
    ...
    
    List<DbModel> dbModels = db.findDbModelAll(sql); // 自定義sql查詢
    db.execNonQuery(sql) // 執行自定義sql
    ...

    ViewUtils使用方法

    • 完全註解方式就可以進行UI繫結和事件繫結。
    • 無需findViewById和setClickListener等。
    // xUtils的view註解要求必須提供id,以使程式碼混淆不受影響。
    @ViewInject(R.id.textView)
    TextView textView;
    
    //@ViewInject(vale=R.id.textView, parentId=R.id.parentView)
    //TextView textView;
    
    @ResInject(id = R.string.label, type = ResType.String)
    private String label;
    
    // 取消了之前使用方法名繫結事件的方式,使用id繫結不受混淆影響
    // 支援繫結多個id @OnClick({R.id.id1, R.id.id2, R.id.id3})
    // or @OnClick(value={R.id.id1, R.id.id2, R.id.id3}, parentId={R.id.pid1, R.id.pid2, R.id.pid3})
    // 更多事件支援參見ViewCommonEventListener類和包com.lidroid.xutils.view.annotation.event。
    @OnClick(R.id.test_button)
    public void testButtonClick(View v) { // 方法簽名必須和介面中的要求一致
        ...
    }
    ...
    //在Activity中注入:
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        ViewUtils.inject(this); //注入view和事件
        ...
        textView.setText("some text...");
        ...
    }
    //在Fragment中注入:
    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        View view = inflater.inflate(R.layout.bitmap_fragment, container, false); // 載入fragment佈局
        ViewUtils.inject(this, view); //注入view和事件
        ...
    }
    //在PreferenceFragment中注入:
    public void onActivityCreated(Bundle savedInstanceState) {
        super.onActivityCreated(savedInstanceState);
        ViewUtils.inject(this, getPreferenceScreen()); //注入view和事件
        ...
    }
    // 其他過載
    // inject(View view);
    // inject(Activity activity)
    // inject(PreferenceActivity preferenceActivity)
    // inject(Object handler, View view)
    // inject(Object handler, Activity activity)
    // inject(Object handler, PreferenceGroup preferenceGroup)
    // inject(Object handler, PreferenceActivity preferenceActivity)

    HttpUtils使用方法:

    普通get方法

    HttpUtils http = new HttpUtils();
    http.send(HttpRequest.HttpMethod.GET,
        "http://www.lidroid.com",
        new RequestCallBack<String>(){
            @Override
            public void onLoading(long total, long current, boolean isUploading) {
                testTextView.setText(current + "/" + total);
            }
    
            @Override
            public void onSuccess(ResponseInfo<String> responseInfo) {
                textView.setText(responseInfo.result);
            }
    
            @Override
            public void onStart() {
            }
    
            @Override
            public void onFailure(HttpException error, String msg) {
            }
    });

    使用HttpUtils上傳檔案 或者 提交資料 到伺服器(post方法)

    RequestParams params = new RequestParams();
    params.addHeader("name", "value");
    params.addQueryStringParameter("name", "value");
    
    // 只包含字串引數時預設使用BodyParamsEntity,
    // 類似於UrlEncodedFormEntity("application/x-www-form-urlencoded")。
    params.addBodyParameter("name", "value");
    
    // 加入檔案引數後預設使用MultipartEntity("multipart/form-data"),
    // 如需"multipart/related",xUtils中提供的MultipartEntity支援設定subType為"related"。
    // 使用params.setBodyEntity(httpEntity)可設定更多型別的HttpEntity(如:
    // MultipartEntity,BodyParamsEntity,FileUploadEntity,InputStreamUploadEntity,StringEntity)。
    // 例如傳送json引數:params.setBodyEntity(new StringEntity(jsonStr,charset));
    params.addBodyParameter("file", new File("path"));
    ...
    
    HttpUtils http = new HttpUtils();
    http.send(HttpRequest.HttpMethod.POST,
        "uploadUrl....",
        params,
        new RequestCallBack<String>() {
    
            @Override
            public void onStart() {
                testTextView.setText("conn...");
            }
    
            @Override
            public void onLoading(long total, long current, boolean isUploading) {
                if (isUploading) {
                    testTextView.setText("upload: " + current + "/" + total);
                } else {
                    testTextView.setText("reply: " + current + "/" + total);
                }
            }
    
            @Override
            public void onSuccess(ResponseInfo<String> responseInfo) {
                testTextView.setText("reply: " + responseInfo.result);
            }
    
            @Override
            public void onFailure(HttpException error, String msg) {
                testTextView.setText(error.getExceptionCode() + ":" + msg);
            }
    });

    使用HttpUtils下載檔案:

    • 支援斷點續傳,隨時停止下載任務,開始任務
    HttpUtils http = new HttpUtils();
    HttpHandler handler = http.download("http://apache.dataguru.cn/httpcomponents/httpclient/source/httpcomponents-client-4.2.5-src.zip",
        "/sdcard/httpcomponents-client-4.2.5-src.zip",
        true, // 如果目標檔案存在,接著未完成的部分繼續下載。伺服器不支援RANGE時將從新下載。
        true, // 如果從請求返回資訊中獲取到檔名,下載完成後自動重新命名。
        new RequestCallBack<File>() {
    
            @Override
            public void onStart() {
                testTextView.setText("conn...");
            }
    
            @Override
            public void onLoading(long total, long current, boolean isUploading) {
                testTextView.setText(current + "/" + total);
            }
    
            @Override
            public void onSuccess(ResponseInfo<File> responseInfo) {
                testTextView.setText("downloaded:" + responseInfo.result.getPath());
            }
    
    
            @Override
            public void onFailure(HttpException error, String msg) {
                testTextView.setText(msg);
            }
    });
    
    ...
    //呼叫cancel()方法停止下載
    handler.cancel();

    BitmapUtils 使用方法

    BitmapUtils bitmapUtils = new BitmapUtils(this);
    
    // 載入網路圖片
    bitmapUtils.display(testImageView, "http://bbs.lidroid.com/static/image/common/logo.png");
    
    // 載入本地圖片(路徑以/開頭, 絕對路徑)
    bitmapUtils.display(testImageView, "/sdcard/test.jpg");
    
    // 載入assets中的圖片(路徑以assets開頭)
    bitmapUtils.display(testImageView, "assets/img/wallpaper.jpg");
    
    // 使用ListView等容器展示圖片時可通過PauseOnScrollListener控制滑動和快速滑動過程中時候暫停載入圖片
    listView.setOnScrollListener(new PauseOnScrollListener(bitmapUtils, false, true));
    listView.setOnScrollListener(new PauseOnScrollListener(bitmapUtils, false, true, customListener));

    輸出日誌 LogUtils

                
               

    相關推薦

    Android 快速開發框架XUtils

    最近搜了一些框架供初學者學習,比較了一下XUtils是目前git上比較活躍 功能比較完善的一個框架,是基於afinal開發的,比afinal穩定性提高了不少,下面是介紹: xUtils簡介 xUtils 包含了很多實用的android工具。xUtils

    Android 框架XUtils之註解機制具體解釋

    lean uci 修飾 row 多個 mes 數組 1.2 sans 在上一篇文章Android 最火的高速開發框架XUtils中簡介了xUtils的基本用法,這篇文章說一下xUtils裏面的註解原理。 先來看一下xUtils裏面demo的代碼

    Android框架XUtils的使用詳解

    新增Android預設混淆配置${sdk.dir}/tools/proguard/proguard-android.txt不要混淆xUtils中的註解型別,新增混淆配置:-keep class * extends java.lang.annotation.Annotation { *; }對使用DbUti

    android懸浮球實現各種功能、快速開發框架、單詞、筆記本、應用市場應用等源碼

    jpeg 源碼 新聞 thread 並不是 類型 and 所有 大小 Android精選源碼 懸浮球,實現一鍵靜音,一鍵鎖頻,一鍵截屏等功能 一個Android快速開發框架,MVP架構 Android QQ小紅點的實現源碼 android一款單詞應用完整app源碼

    新版力軟learun快速開發框架6.1.6.2源碼下載地址

    AC sqlsever echarts ron webapp 增加 abc 測試 使用 QQ153545892 力軟敏捷開發框架 6.1.6.2 版本發布 新增手機流程-我的流程(可查看流程進度和表單內容) 新增手機流程-待辦任務(可查看流程進度和表單內容,審

    力軟信息化快速開發框架源碼learun新版6.3下載

    開發 聯網 集成 人員 後臺 6.2 com TE ref QQ194633530 力軟敏捷開發框架 6.1.6.2 版本發布 新增手機流程-我的流程(可查看流程進度和表單內容) 新增手機流程-待辦任務(可查看流程進度和表單內容,審核) 新增手機流程-已辦任務(可查看

    力軟快速開發框架6.3新版下載地址

    協同 con 會有 app 面向對象 最新版 組件 使用 下載地址 QQ194633530 力軟敏捷開發框架 6.1.6.2 版本發布 力軟敏捷開發框架能幫您開發什麽軟件 力軟小課堂|來自常見問題 一、業務管理軟件ERP、MIS、CRM、WMS、MES

    Android annotations快速開發框架使用,Android Studio與Eclipse配置

    Androidannotations框架是目前最火的Andorid端快速開發框架,通過註解方式挺高開發效率,減少重複編寫沒有技術含量的程式碼。       使用AndoridAnnotations框架的理由:      

    Android BLE 藍芽快速開發框架

    FastBle 專案地址:Jasonchenlijian/FastBle  簡介:Android BLE 藍芽快速開發框架。 更多:作者   提 Bug    標籤: 藍芽- Thanks to th

    Android 專案中用得的第三方框架可能都在這裡了!你有沒有錯過?

    平時讀部落格搜 GitHub 多了,總會發現一些大家都在比較推崇的第三方框架,覺得非常不錯暫時又用不到,於是就打算把它們都收藏起來,需要用到的時候就不用到處問到處搜了。收藏得多了,本著熱愛分享擁抱開源的思想,於是貼出來給大家分享交流。如有紕漏,敬請拍磚指正。 歡迎眾收藏愛好

    Android快速開發框架

    Afinal簡介 Afinal 是一個android的sqlite orm 和 ioc 框架。同時封裝了android中的http框架,使其更加簡單易用; 使用finalBitmap,無需考慮bitmap在android中載入的時候oom的問題和快速滑動的時候

    Android 快速開發框架:推薦10個框架

    一、  Afinal 官方介紹: Afinal是一個Android的ioc,orm框架,內建了四大模組功能:FinalAcitivity,FinalBitmap,FinalDb,FinalHttp。通過finalActivity,我們可以通過註解的方式進行繫結ui和事

    Android框架--Retrofit網路請求庫一

    PS:對於Android框架有很多,但一般人都不瞭解,就像網路這一塊,你是不是還在HttpURLConnection,或者HttpClient,這是原始的,而且一般人也都會,這裡我介紹一個網路請求庫,

    android快速開發框架--快速實現 頁面 載入中 載入失敗 無資料等狀態以及下拉重新整理和自動載入

    RapidDevelop-Android快速開發框架 框架持續更新中 這個框架是從平時專案裡用的比較多的框架裡整合而來 對本專案感興趣的可以一起研究喜歡的朋友歡迎star 同時也歡迎大家的寶貴意見issues 如果大家對MVP模式的開發 網路爬蟲以及快取策略

    android mvp快速開發框架介紹(繼續dileber)

    繼續為大家介紹android mvp開源框架 dileber 官方交流qq群:171443726 我個人qq:297165331~~有什麼問題也可以諮詢~~ 這節5主要介紹 主要功能  presenter 和 delegate的使用 寫一個類繼承於AppVie

    Android 快速開發框架:推薦10個框架:afinal、ThinkAndroid ...

           下面轉載這10個框架的介紹:(按順序來吧沒有什麼排名)。 一、  Afinal 官方介紹: Afinal是一個android的ioc,orm框架,內建了四大模組功能:FinalAcitivity,FinalBitmap,FinalDb,FinalHttp。通過finalActivity

    搭建自己的 Android MVP 快速開發框架

    Android 開發進入「死丟丟」的時代後,引用三方庫在 Gradle 的支援下變得十分輕鬆。各種高手寫的開源框架,極大程度降低了新手入行(坑)的門檻,「一週開發一款 App 並上線」也不再遙不可及。關於快速開發,筆者本人的意見是不一定什麼功能都自己寫,但框架最好是自己搭。雖

    Android 快速開發框架

    浪費了“黃金五年”的Java程式設計師,還有救嗎? >>>   

    CRL快速開發框架4.4版發布,支持主從讀寫分離

    需求 生產 由於 logs else gety img 分離 dap 經過一些調整和優化,4.3已經運行在生產環境,對於不久將會遇到的查詢性能,讀寫分離需求列上日程 讀寫分離需求 對於一個數據庫作了主從發布/訂閱,主庫為DB1,從庫為DB2 所有寫入通過DB1,所有查詢通過

    .net快速開發框架(工作流引擎篇)

    整合 現在 效果 也會 ear workflow tar 流程設計 人員 .net快速開發框架(工作流引擎篇) 現在辦公要流程化,營銷也有流程,流程現在已經是各種生活活動不可缺少的一部分了。就像這句耳熟能詳的話:“凡事,我們先走個流程嘛!”,在信息化、流程化的背景下。工