Android開發(fā)框架Collection

Collection聚合了項目搭建的一些基本模塊蟹地,節(jié)約開發(fā)者時間态坦,協(xié)助項目的快速搭建,RecyclerView+Adapter+Retrofit+RxJava+MVP+DataManager+基本Base,能夠滿足一個項目的基本實現(xiàn)。

github地址:https://github.com/usernameyangyan/Collection-Android

更新說明

v1.3.9

1.上傳下載增加進度條
2.Fragment增加布局和數(shù)據(jù) 初始化懶加載
3.網(wǎng)絡請求優(yōu)化(解決內(nèi)存泄露問題)
4.增加文件斷點下載
5.增加MVP注解生成文件(https://github.com/usernameyangyan/MvpAnnotationProject
6.增加網(wǎng)絡請求通過同步上傳文件

v1.3.8

1.DialogFragment替換AlertDialog
2.SharePreference統(tǒng)一初始化
3.簡化Fragment的跳轉(zhuǎn)邏輯
4.DataManager.DataForHttp增加文件下載

v1.3.4

1.修復SQLite沒有創(chuàng)建表查詢異常
2.SQLite增加按條件查詢List
3.增加PopupWindow顯示位置設置
4.解決SQLit內(nèi)容為null報錯
5.狀態(tài)欄修改:增加設置狀態(tài)欄透明+黑色字體

v1.2.9

1.去掉Relam數(shù)據(jù)模塊,安裝包大小減少
2.對原生SQLite數(shù)據(jù)庫進行封裝,使用更加方便
3.對DataManager的使用進行修整
4.增加AutoLineLayout/TagView
5.增加LinkedMultiValueMap
6.增加RxJavaUtils,可進行子/主線程數(shù)據(jù)處理切換

v1.2.8

1.更新Realm數(shù)據(jù)庫依賴。
2.更新RxJava册烈、rxandroid、retrofit婿禽、converter-gson赏僧、adapter-rxjava2依賴。
3.封裝好Fragment之間的交互扭倾,項目中可以選擇使用一個Activity來作為跟容器淀零,其它實現(xiàn)頁面統(tǒng)一使用fragment來實現(xiàn)。
4.collectionLibary中的Config配置類增加json字段過濾膛壹、網(wǎng)絡請求超時設置驾中、網(wǎng)絡請求頭設置(全局請求頭)。
5.增加自動換行布局模聋。
6.Realm增加按數(shù)據(jù)字段查詢和刪除接口肩民。
7.網(wǎng)絡請求類型HttpType增加json類型請求參數(shù)。
8.網(wǎng)絡請求增加個別接口請求頭設置链方。
9.增加適配不同手機像素持痰。

v1.2.7

1.增加自定義控件TabLayout。

v1.2.6

1.RxJava的依賴更新祟蚀。
2.修正RecyclerView頭部布局不能鋪滿問題共啃。
3.PopupWindow的使用。
4.DisplayUtils工具類對狀態(tài)欄的修改暂题。

v1.2.5

1.修正Retrofit DEFAULT_POST請求方式指向錯誤。
2.Retrofit 數(shù)據(jù)解析兼容沒有公用been類究珊,可以指定公用been類和不指定公用been類薪者、或者混合使用。
3.Realm增加數(shù)據(jù)遷移(數(shù)據(jù)庫字段增加或移除)剿涮。
4.增加幾種通用的Dialog彈窗言津,提供方法自定義攻人。
5.提供幾種比較常用的Utils工具類

v1.2.4

1.增加DataManager用來統(tǒng)一管理數(shù)據(jù)請求,包括Retrofit的請求悬槽、SharePreference以及Realm的數(shù)據(jù)請求怀吻。
2.Retrofit的請求的整合。
3.PullToRefreshRecyclerView的空布局bug修改初婆。

框架的引入

implementation 'com.youngman:collectionlibrary:1.3.8'

Error:Could not find com.android.support:appcompat-v7:27.x.x.
因為library的Support Repository是27.x.x,可能跟項目有所沖突蓬坡,如果sdk已經(jīng)裝了27還是會出現(xiàn)同樣的錯誤。
解決辦法:在項目根build.gradle中加入 maven { url "https://maven.google.com" }

一磅叛、框架整體模塊

效果圖

二屑咳、PullToRefreshRecyclerView的使用

屬性 作用
addHeaderView 增加頭部布局, 暫時只能添加一個頭布局
setEmptyView 設置自定義的加載布局和空布局
setRefreshView 自定義刷新View
setDefaultLoadingMoreNoDataMessage 設置默認沒有數(shù)據(jù)的內(nèi)容
setLoadMoreView 自定義加載更多View
setNoMoreDate 顯示沒有更多數(shù)據(jù)
setAutoRefresh 自動刷新
refreshComplete 刷新數(shù)據(jù)完成
loadMoreComplete 加載更多數(shù)據(jù)完成
setPullRefreshEnabled 是否允許刷新
setLoadMoreEnabled 是否允許加載更多
setRefreshTimeVisible 顯示加載更新時間
isLoading 是否正在loading數(shù)據(jù)
isRefreshing 正在refreshing數(shù)據(jù)
setRefreshAndLoadMoreListener 刷新和加載更多回調(diào)
destroy 內(nèi)存回收

1.框架默認下拉刷新弊琴、上拉加載更多樣式

效果圖
(1)布局文件
 <com.youngmanster.collection_kotlin.recyclerview.PullToRefreshRecyclerView
    android:id="@+id/recycler_rv"
    android:layout_width="match_parent"
    android:layout_height="match_parent" />
(2)代碼設置
 recycler_rv.setPullRefreshEnabled(true);
 recycler_rv.setLoadMoreEnabled(true);

2兆龙、自定義下拉刷新、上拉加載更多樣式

效果圖
刷新幾種狀態(tài):
屬性 作用
STATE_PULL_DOWN 拉的狀態(tài)(還沒到下拉到固定的高度時)
STATE_RELEASE_REFRESH 下拉到固定高度提示釋放刷新的狀態(tài)
STATE_REFRESHING 正在刷新狀態(tài)
STATE_DONE 刷新完成
加載更多幾種狀態(tài):
屬性 作用
STATE_LOADING 正在加載
STATE_COMPLETE 加 載完成
STATE_NODATA 沒有數(shù)據(jù)
(1)代碼設置
recycler_rv.setPullRefreshEnabled(true);
recycler_rv.setLoadMoreEnabled(true);
recycler_rv.setRefreshAndLoadMoreListener(this);
recycler_rv.setRefreshView(new DefinitionAnimationRefreshHeaderView(getActivity()));
recycler_rv.setLoadMoreView(new DefinitionAnimationLoadMoreView(getActivity()));
自定義刷新的步驟:
①自定義View繼承BasePullToRefreshView敲董,重寫initView()紫皇、setRefreshTimeVisible(boolean show)、destroy()方法:

1.在initView()做自定義布局腋寨、相關動畫的初始化聪铺,最后在initView()方法的最后面添加以下代碼即可。

    mContainer = LayoutInflater.from(context).inflate(R.layout.collection_library_layout_default_arrow_refresh, null);
   //把刷新頭部的高度初始化為0
    LayoutParams lp = new LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.WRAP_CONTENT);
    lp.setMargins(0, 0, 0, 0);
    this.setLayoutParams(lp);
    this.setPadding(0, 0, 0, 0);
    addView(mContainer, new LayoutParams(LayoutParams.MATCH_PARENT, 0));
    setGravity(Gravity.BOTTOM);
    //測量高度
    measure(ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.WRAP_CONTENT);
    mMeasuredHeight = getMeasuredHeight();

2.setRefreshTimeVisible(boolean show)是用來設置是否顯示刷新時間控件精置,在默認刷新樣式中通過mRecyclerView.setRefreshTimeVisible(false)即可隱藏刷新時間计寇,如果在自定義的布局中沒有這項這個方法就可以忽略。

3.destroy()是用來關掉改頁面時把刷新View的一些動畫等釋放脂倦,防止內(nèi)存泄漏番宁。

②實現(xiàn)BasePullToRefreshView.OnStateChangeListener監(jiān)聽(重點,主要是進行狀態(tài)切換后的相關操作邏輯)

1.在構造函數(shù)中設置 onStateChangeListener=this
2.onStateChange的模板樣式

@Override
public void onStateChange(int state) {
    //下拉時狀態(tài)相同不做繼續(xù)保持原有的狀態(tài)
    if (state == mState) return ;
    //根據(jù)狀態(tài)進行動畫顯示
    switch (state){
        case STATE_PULL_DOWN:
            clearAnim();
            startAnim();
            break;
        case STATE_RELEASE_REFRESH:
            break;
        case STATE_REFRESHING:
            clearAnim();
            startAnim();
            scrollTo(mMeasuredHeight);
            break;
        case STATE_DONE:
            break;
    }
    mState = state;
}
自定義加載更多的步驟(包括沒有更多數(shù)據(jù)顯示的操作):
①自定義View繼承BaseLoadMoreView赖阻,重寫initView()蝶押、setState()、destroy()方法:

1.在initView()做自定義布局火欧、相關動畫的初始化棋电,最后在initView()方法的最后面添加以下代碼即可

   mContainer = LayoutInflater.from(context)
        .inflate(R.layout.layout_definition_animation_loading_more, null)
    addView(mContainer)
    gravity = Gravity.CENTER

2.destroy()是用來關掉改頁面時把刷新View的一些動畫等釋放,防止內(nèi)存泄漏苇侵。
3.在setState()進行狀態(tài)切換后的相關操作邏輯赶盔,模板樣式

@Override
public void setState(int state) {

    if(isDestroy){
        return;
    }
    switch (state){
        case STATE_LOADING:
            loadMore_Ll.setVisibility(VISIBLE);
            noDataTv.setVisibility(INVISIBLE);
            animationDrawable= (AnimationDrawable) loadingIv.getDrawable();
            animationDrawable.start();
            this.setVisibility(VISIBLE);
            break;
        case STATE_COMPLETE:
            if(animationDrawable!=null){
                animationDrawable.stop();
            }
            this.setVisibility(GONE);
            break;
        case STATE_NODATA:
            loadMore_Ll.setVisibility(INVISIBLE);
            noDataTv.setVisibility(VISIBLE);
            animationDrawable= (AnimationDrawable) loadingIv.getDrawable();
            animationDrawable.start();
            this.setVisibility(VISIBLE);
            break;
    }

    mState = state;

}

4.注意:在自定義加載更多樣式時,如果需要有沒有更多加載更多數(shù)據(jù)提示同樣需要在布局中寫好榆浓,然后在onSatae中根據(jù)狀態(tài)對加載和沒有跟多顯示提示進行顯示隱藏操作于未。

3、上拉加載更多配合SwipeRefreshLayout使用

效果圖
(1)布局文件
 <androidx.swiperefreshlayout.widget.SwipeRefreshLayout
    android:id="@+id/swipeRefreshLayout"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

     <com.youngmanster.collection_kotlin.recyclerview.PullToRefreshRecyclerView
        android:id="@+id/recycler_rv"
        android:layout_width="match_parent"
        android:layout_height="match_parent"/>

</androidx.swiperefreshlayout.widget.SwipeRefreshLayout>
(2)代碼設置
recycler_rv.setLoadMoreEnabled(true);
recycler_rv.setRefreshAndLoadMoreListener(this);
recycler_rv.setLoadMoreView(DefinitionAnimationLoadMoreView(activity));
swipeRefreshLayout.setColorSchemeResources(R.color.colorAccent);
swipeRefreshLayout.setOnRefreshListener(this);
(3)注意的問題

由于PullToRefreshRecyclerView的下拉刷新和下拉加載更多完成時會自動刷新Adapter,而SwipeRefreshLayout刷新完成時需要手動進行notifyDataSetChanged刷新適配器。

4烘浦、RecyclerView添加頭部抖坪、空布局

效果圖
效果圖
View emptyView = LayoutInflater.from(getActivity()).inflate(R.layout.layout_empty,null);
    mRecyclerView.setEmptyView(emptyView);
    emptyView.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            for(int i=0;i<10;i++){
                mDatas.add("item"+i);
            }
            definitionRefreshAdapter.notifyDataSetChanged();
        }
    });

5、上拉加載更多實現(xiàn)NoMoreData闷叉、自動刷新

效果圖
(1)上拉加載更多數(shù)據(jù)的布局設置在上面的自定義LoadingMoreView中有介紹擦俐,如果要顯示沒有更多數(shù)據(jù)提示只需要在LoadMore返回數(shù)據(jù)之后設置:
mRecyclerView.setNoMoreDate(true)
(2)自動刷新需要列表已經(jīng)填充了數(shù)據(jù)之后再做自動刷新操作才會生效:
mRecyclerView.setAutoRefresh()

6.Collection庫的刷新加載文本已經(jīng)適配了中文、英文握侧、繁體蚯瞧,如果對默認刷新加載顯示文本進行修改,通過LoadingTextConfig設置藕咏,可在Application全局設置

LoadingTextConfig textConfig=LoadingTextConfig.getInstance(getApplicationContext());
textConfig
            .setCollectionLoadingMore("加載更多")
            .setCollectionLastRefreshTimeTip("更新時間:")
            .setCollectionNoMoreData("沒有更多數(shù)據(jù)")
            .setCollectionPullReleaseText("釋放刷新")
            .setCollectionRefreshing("正在刷新")
            .setCollectionPullDownRefreshText("下拉刷新")
            .setCollectionRefreshDone("加載完成");                                                      
PullToRefreshRecyclerViewUtils.loadingTextConfig=textConfig;

7状知、PullToRefreshRecyclerView的其他使用以及注意問題

1.下面是下拉刷新上拉加載更多的一些操作模板

public void refreshUI() {
    if (defaultRefreshAdapter == null) {
        defaultRefreshAdapter = new DefaultRecyclerAdapter(getActivity(), mDatas, mRecyclerView);
        mRecyclerView.setAdapter(defaultRefreshAdapter);
    } else {
        if (mRecyclerView != null) {
            if (mRecyclerView.isLoading()) {
                mRecyclerView.loadMoreComplete();
            } else if (mRecyclerView.isRefreshing()) {
                mRecyclerView.refreshComplete();
            }
        }
    }
}

2.注意問題

①在設置RecyclerView是要設LayoutManager
②如果使用PullToRefreshRecyclerView在Activty/Fragment中的onDestroy()調(diào)用mRecyclerView.destroy()防止內(nèi)存泄漏。
@Override
public void onDestroy() {
    super.onDestroy();
    mRecyclerView.destroy()
}
③設置refreshRv.setLoadMoreEnabled(true)孽查,當填充的數(shù)據(jù)的列表size為0的同時還通過RecyclerView設置分割線底部就會出現(xiàn)一個空白的item饥悴,這個item就是加載更多顯示的Item。
解決辦法:不通過RecyclerView設置分割線盲再,直接在布局自定義分割線西设。

三、BaseRecyclerViewAdapter的使用

1.BaseRecyclerViewAdapter的比原始Adapter的代碼量減小

在BaseRecyclerViewAdapter中的BaseViewHolder進行布局轉(zhuǎn)化答朋,同時定義了一些比較基本的View操作贷揽,使用簡單。

(1)使用代碼:
public class DefinitionRecyclerAdapter extends BaseRecyclerViewAdapter<String> {

  public DefinitionRecyclerAdapter(Context mContext, List<String> mDatas, PullToRefreshRecyclerView pullToRefreshRecyclerView) {
    super(mContext, R.layout.item_pull_refresh, mDatas, pullToRefreshRecyclerView);
  }

  @Override
  protected void convert(BaseViewHolder baseViewHolder, String s) {
      baseViewHolder.setText(R.id.title,s);
  }
}
①使用者需要在繼承BaseRecyclerViewAdapter時傳入一個數(shù)據(jù)實體類型梦碗,具體的操作在convert()方法中操作禽绪。
②BaseViewHolder提供了一些常用View的基本操作,通過baseViewHolder.getView()可得到布局中的控件洪规。
(2)BaseRecyclerViewAdapter提供了兩個構造函數(shù)
public BaseRecyclerViewAdapter(Context mContext, int mLayoutResId, List<T> mDatas, PullToRefreshRecyclerView pullToRefreshRecyclerView) {
    this.mContext = mContext;
    this.mLayoutResId = mLayoutResId;
    this.mDatas = mDatas;
    this.mRecyclerView=pullToRefreshRecyclerView;
}

public BaseRecyclerViewAdapter(Context mContext, int mLayoutResId, List<T> mDatas) {
    this.mContext = mContext;
    this.mLayoutResId = mLayoutResId;
    this.mDatas = mDatas;
}
主要是對PullToRefreshRecyclerView和RecyclerView的適配印屁,使用時適配器根據(jù)需要使用對應的構造函數(shù)。

2.添加Item的點擊和長按事件

效果圖
(1) Item點擊事件實現(xiàn)
itemClickAdapter.setOnItemLongClickListener(new BaseRecyclerViewAdapter.onItemLongClickListener() {
    @Override
    public boolean onItemLongClick(View view, int position) {
        showToast("進行長按操作");
        return true;
    }
});

3.多布局的使用

效果圖
BaseRecyclerViewAdapter的多布局實現(xiàn)需要注意的四步:
①自定義Adapter需要繼承BaseRecyclerViewMultiItemAdapter斩例。
② 數(shù)據(jù)實體類需要繼承BaseMultiItemEntity雄人,在getItemViewType()返回布局類型。
③ 在自定義Adapter中的構造函數(shù)中通過addItemType()傳入不同類型對應的布局念赶。
④在自定義Adapter中的convert進行類型判斷础钠,做相對應的操作。
public class MultipleAdapter extends BaseRecyclerViewMultiItemAdapter<MultiItem> {

    private int mHeight;

    public MultipleAdapter(Context mContext, List<MultiItem> mDatas) {
        super(mContext, mDatas);
        mHeight = DisplayUtil.dip2px(mContext, 100);
        addItemType(MultiItem.TYPE_TEXT, R.layout.item_main);
        addItemType(MultiItem.TYPE_IMG, R.layout.item_img);
        addItemType(MultiItem.TYPE_TEXT_IMG, R.layout.item_click);
    }

    @Override
    protected void convert(BaseViewHolder baseViewHolder, MultiItem multiItem) {
        switch (baseViewHolder.getItemViewType()) {
            case MultiItem.TYPE_TEXT:
                baseViewHolder.getView(R.id.card_view).getLayoutParams().height = mHeight;
                baseViewHolder.setText(R.id.title, multiItem.getTitle());
                break;
            case MultiItem.TYPE_IMG:
                baseViewHolder.setImageResource(R.id.ivImg, multiItem.getRes());
                break;
            case MultiItem.TYPE_TEXT_IMG:
                baseViewHolder.setImageResource(R.id.ivImg, multiItem.getRes());
                baseViewHolder.setText(R.id.titleTv, multiItem.getTitle());
                break;

        }

    }

4.添加拖拽叉谜、滑動刪除

效果圖
局限:只針對RecyclerView旗吁,對本框架封裝的PullToRefreshRecyclerView會出現(xiàn)混亂。
①BaseRecyclerViewAdapter和BaseRecyclerViewMultiItemAdapter都已經(jīng)封裝支持拖拽停局、滑動阵漏,適配器只需要根據(jù)需求繼承其中一個即可驻民。
②框架提供了一個BaseRecycleItemTouchHelper,對于普通的左右滑動刪除履怯、拖拽已經(jīng)實現(xiàn),如果想自定義可以繼承BaseRecycleItemTouchHelper類裆泳,再重寫相對應的方法進行實現(xiàn)叹洲。
④在Activity/Fragment中需要實現(xiàn)以下代碼:
ItemTouchHelper.Callback callback=new BaseRecycleItemTouchHelper(dragAndDeleteAdapter);
ItemTouchHelper itemTouchHelper=new ItemTouchHelper(callback);
itemTouchHelper.attachToRecyclerView(mRecyclerView);
⑤BaseRecyclerViewAdapter.OnDragAndDeleteListener進行操作動作完成之后的回調(diào)。
@Override
public void onMoveComplete() {
    ToastUtils.showToast(this, "移動操作完成");
}

@Override
public void onDeleteComplete() {
    ToastUtils.showToast(this, "刪除操作完成");
}

四工禾、MVP+RxJava+Retrofit的封裝使用

效果圖

1.在使用Retrofit請求網(wǎng)絡之前需要進行配置运提,在框架中提供了了Config配置類

屬性 作用
DEBUG 是否為BuildConfig.DEBUG,日志輸出需要
CONTEXT 設置Context,必填項
URL_DOMAIN 網(wǎng)絡請求的域名,需要以“/”結(jié)尾
URL_CACHE 網(wǎng)絡緩存地址闻葵,需要設置緩存才可以成功
MAX_CACHE_SECONDS 設置OkHttp的緩存機制的最大緩存時間,默認為一天
MAX_MEMORY_SIZE 緩存最大的內(nèi)存,默認為10M
MClASS 設置網(wǎng)絡請求json通用解析類
EXPOSEPARAM Json數(shù)據(jù)某些字段在沒有數(shù)據(jù)是會不返回來民泵,可通過這個屬性設置過濾
USER_CONFIG SharePreference保存的名稱
CONNECT_TIMEOUT_SECONDS 請求接口超時設定
READ_TIMEOUT_SECONDS 請求接口超時設定
HEADERS 設置Http全局請求頭
SQLITE_DB_NAME 數(shù)據(jù)庫名稱
SQLITE_DB_VERSION 數(shù)據(jù)庫版本名
在項目中需要根據(jù)項目需要進行配置,在Application中設置
private void config(){
    //基本配置
    Config.DEBUG= BuildConfig.DEBUG;
    Config.CONTEXT=this;
    //Retrofit配置
    Config.URL_CACHE=AppConfig.URL_CACHE;
    Config.MClASS= Result.class;
    Config.URL_DOMAIN="https://api.apiopen.top/";
    //SharePreference配置
    Config.USER_CONFIG="Collection_User";
    Config.SQLITE_DB_VERSION=0;
}
根據(jù)項目需要定義一個通用的數(shù)據(jù)實體類槽畔,這是本例通用實體類栈妆,這個類需要設置到Applicatin中
public class Result<T> implements Serializable {

    private int code;
    private String msg;
    private T newslist;

    public int getCode() {
        return code;
    }

    public void setCode(int code) {
        this.code = code;
    }

    public String getMsg() {
        return msg;
    }

    public void setMsg(String msg) {
        this.msg = msg;
    }

    public T getNewslist() {
        return newslist;
    }

    public void setNewslist(T newslist) {
        this.newslist = newslist;
    }
}
注意:由于每個項目返回來的json數(shù)據(jù)格式有所不同,如果Result中代表的字段例如newslist沒有內(nèi)容返回來的時候這個字段需要后臺控制不返回厢钧,如果不做處理會報解析錯誤,可以通過設置Config.EXPOSEPARAM屬性過濾字段鳞尔。

2.RxJava+Retrofit+OkHttp

(1)RequestBuilder的設置(網(wǎng)絡請求的配置)

屬性 作用
ReqType 數(shù)據(jù)處理的方式,默認DEFAULT_CACHE_LIST,使用到OkHttp緩存的需要需要設置Config.URL_CACHE
NO_CACHE_MODEL 不設置緩存早直,返回model
NO_CACHE_LIST 不設置緩存,返回list
DEFAULT_CACHE_MODEL 使用Okttp默認緩存寥假,返回model
DEFAULT_CACHE_LIST 使用Okttp默認緩存,返回list
DISK_CACHE_LIST_LIMIT_TIME 限時使用自定義磁盤緩存霞扬,返回List
DISK_CACHE_MODEL_LIMIT_TIME 限時使用自定義磁盤緩存糕韧,返回model
DISK_CACHE_NO_NETWORK_LIST 自定義磁盤緩存,沒有網(wǎng)絡返回磁盤緩存喻圃,返回List
DISK_CACHE_NO_NETWORK_MODEL /自定義磁盤緩存萤彩,沒有網(wǎng)絡返回磁盤緩存,返回Model
DOWNLOAD_FILE_MODEL 文件下載模式级及,返回Model
HttpType 網(wǎng)絡請求方式,默認DEFAULT_GET
DEFAULT_GET GET請求
DEFAULT_POST POST請求
FIELDMAP_POST 如果請求URL出現(xiàn)中文亂碼乒疏,可選擇這個
JSON_PARAM_POST json格式請求參數(shù)
ONE_MULTIPART_POST 上傳一張圖片
MULTIPLE_MULTIPART_POST 上傳多張圖片
DOWNLOAD_FILE_GET 下載文件
ReqMode 請求模式,默認ASYNCHRONOUS
ASYNCHRONOUS 異步請求
SYNCHRONIZATION 同步請求
其它參數(shù)
setTransformClass 設置請求轉(zhuǎn)化Class
setUrl 設置請求url,如果不設置完全連接則會使用Config.URL_DOMIN進行拼接
setFilePathAndFileName 設置自定義緩存時的路徑和文件名
setLimtHours 設置自定義緩存的有效時間
setHeader 設置請求頭
setHeaders 設置請求頭集合
setHttpTypeAndReqType 設置請求數(shù)據(jù)類型和請求方式
setImagePath 設置上傳圖片路徑
setImagePaths 設置多張圖片路徑
isUserCommonClass 設置是否使用公用類轉(zhuǎn)化
setReqMode 設置同步異步
isOpenBreakpointDownloadOrUpload 是否開啟斷點下載

(2)使用模塊

RequestBuilder<Result<List<WeChatNews>>> resultRequestBuilder = new RequestBuilder<>(new RxObservableListener<Result<List<WeChatNews>>>() {
        @Override
        public void onNext(Result<List<WeChatNews>> result) {
            mView.refreshUI(result.getResult());
        }
    });

    resultRequestBuilder
            .setUrl(ApiUrl.URL_WETCHAT_FEATURED)
            .setTransformClass(WeChatNews.class)
            .setParam("page",page)
            .setParam("type","video")
            .setParam("count",num);


rxManager.addObserver(DataManager.DataForHttp.httpRequest(resultRequestBuilder));
(3)Retrofit的擴展
如果存在DataManager提供的方法滿足不了的請求可以通過RetrofitManager提供的getCustomizeRequest進行自定義ApiService以及OkHttp饮焦,然后通過RxSubscriber進行回調(diào)怕吴。
Observable<WeChatAccessToken> observable =  RetrofitManager.getCustomizeRequest().getCustomizeApiService(ApiService.class)
            .getWeChatStr(ApiUrl.URL_WECHAT_HOST + ApiUrl.ACCESS_TOKEN, reqParams);

    DisposableObserver<WeChatAccessToken> observer = observable
            .compose(RxSchedulers.<WeChatAccessToken>io_main())
            .subscribeWith(new RxSubscriber<WeChatAccessToken>() {
                @Override
                public void _onNext(WeChatAccessToken weChatAccessToken) {
                    getUserInfo(weChatAccessToken);
                }

                @Override
                public void _onError(NetWorkCodeException.ResponseThrowable responseThrowable) {
                    showToast(R.string.wx_LoginResultEmpty);
                    hideLoadingDialog();
                    finish();
                }

                @Override
                public void _onComplete() {

                }
            });

    rxManager.addObserver(observer);
定義一個ApiService類
public interface ApiService {
    /**
    * 微信精選
    * @param url
    * @param map
    * @return
    */
    @GET
    Observable<Result<List<WeChatNews>>> getWeChatFeaturedNews(@Url String url, @QueryMap Map<String,Object> map);
}
注意:
(1)RxObservableListener有三個回調(diào)方法
void onNext(T result);
void onComplete();
void onError(NetWorkCodeException.ResponseThrowable e);
只會重寫onNext方法,其它兩個方法可以自行選擇重寫县踢。
這兩個構造函數(shù)主要主要是為了統(tǒng)一處理onError的转绷,如果要自定義錯誤提醒,則可以選擇第二個構造函數(shù)硼啤。
(3)通過DataManager的網(wǎng)絡請求方式會返回來一個DisposableObserver议经,需要把它通過rxManager.addObserver()添加進CompositeDisposable才能正常執(zhí)行,方便對網(wǎng)絡請求的銷毀管理。
(4)如果項目沒有統(tǒng)一的解析been類,那么Config的公用類就不用設置了煞肾,在Retrofit請求的時候直接setTransformClass指定一個解析類就可以了
(5)如果項目想兩種方式共存咧织,那么在請求的時候需要通過setUserCommonClass(false)設置才能不使用統(tǒng)一解析類進行解析
(6)請求的域名已經(jīng)在Application設置好了,setUrl不需要填完整的url
②要區(qū)分清楚接口返回的數(shù)據(jù)時List還是Model籍救,從而選擇對應的ReqType
(7)setRequestParam可以設置參數(shù)集合习绢,setParam可以單個設置
(8)使用DISK_CACHE_LIST_LIMIT_TIME/DISK_CACHE_MODEL_LIMIT_TIME這兩個顯示限時緩存時需要通過setFilePathAndFileName()設置保存路徑setLimtHours()設置緩存時間(單位為:小時)
(9)如果要上傳單張圖片需要用到HttpType.ONE_MULTIPART_POST的請求方式,同時通過RequestBuilder設置MultipartBody.Part

3.MVP

1.寫一個Contract類對Presenter和View進行統(tǒng)一管理(View需要實現(xiàn)BaseView,Presenter需要實現(xiàn)BasePresenter<T>

public interface WeChatFeaturedContract {

  interface View extends BaseView {
    void refreshUI(List<WeChatNews> newsList);
  }

  abstract class Presenter extends BasePresenter<View> {
    public abstract void requestFeaturedNews(int page, int num);
  }

}

2.寫一個具體的Presenter類實現(xiàn)WeChatChinaNewsContract.Presenter,在里面做具體的邏輯處理蝙昙,處理完成再通過mView進行View的處理

3.Activity/Fragment實現(xiàn)IBaseActivity<T extends BasePresenter>/IBaseFragment<T extends BasePresenter>以及定義好的WeChatChinaNewsContract.View

4.缺陷:View在使用時需要轉(zhuǎn)化成在具體的子類才能調(diào)用相關方法闪萄。

5.具體使用可以參照demo

五、DataManager的使用(Http奇颠、Sharepreference败去、SQLite)

效果圖

(1)DataManager基本屬性

屬性 作用
DataForSqlite 數(shù)據(jù)庫模塊
insert 插入bean數(shù)據(jù)
insertList 插入List數(shù)據(jù)
insertListBySync 異步插入List數(shù)據(jù)
queryByFirstByWhere 根據(jù)條件查詢
queryAll 查詢某個bean類的全部數(shù)據(jù)
queryAllBySync 異步查詢某個bean類的全部數(shù)據(jù)
queryByFirst 查詢某個bean類的第一條數(shù)據(jù)
delete 根據(jù)條件刪除數(shù)據(jù)
deleteAll 刪除某個bean類的所有數(shù)據(jù)
deleteTable 刪除數(shù)據(jù)表
update 更新某個bean類的
queryOfPageByWhere 根據(jù)條件分頁查詢,實體類必須包含PrimaryKey
queryOfPage 分頁查詢烈拒,實體類必須包含PrimaryKey
updateTable 更新數(shù)據(jù)表圆裕,用于增加字段
execQuerySQL Sql語句查詢
DataForHttp Http模塊
httpRequest 網(wǎng)絡請求,傳入RequestBuilder
DataForSharePreferences SharePreference模塊
saveObject 保存基本類型數(shù)據(jù)
getObject 獲取基本類型數(shù)據(jù)

(2)DataForSqlite
1.插入一條數(shù)據(jù)

user=new User();
user.setId(0);
user.setName("Young1");
user.setAge(14);
user.setAddress("山東省");
user.setStr("eeeee");
DataManager.DataForSqlite.insert(user);

showToast("保存成功");

2.查詢數(shù)據(jù)

user=DataManager.DataForSqlite.queryByFirst(User.class);
String showContent="用戶Id:"+user.getId()+"\n"+"用戶姓名:"+user.getName()+"\n"+"用戶年齡:"+user.getAge()+"\n"+"用戶地址:"+user.getAddress();
showToast(showContent);

3.批量插入數(shù)據(jù)(可同步可異步)

List<User> users=new ArrayList<>();
for(int i=0;i<10000;i++){
   user=new User();
   user.setId(i);
   user.setName("Young1");
   user.setAge(14);
   user.setAddress("廣州市");
                
   users.add(user);
  }


DataManager.DataForSqlite.insertListBySync(User.class, users, new SQLiteDataBase.InsertDataCompleteListener() {
    @Override
    public void onInsertDataComplete(boolean isInsert) {
        if(isInsert){
            ToastUtils.showToast(getActivity(),"保存成功");
        }else{
            ToastUtils.showToast(getActivity(),"保存失敗");
            }
        }
});

4.bean類的定義

public class User {
  @Column(isPrimaryKey =true)
  private int id;
  private String name;
  private int age;
  private String address;
  private String str;

  public String getStr() {
    return str;
  }

  public void setStr(String str) {
    this.str = str;
  }

  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;
  }

  public int getAge() {
    return age;
  }

  public void setAge(int age) {
    this.age = age;
  }

  public String getAddress() {
    return address;
  }

  public void setAddress(String address) {
    this.address = address;
  }
}

其中可以通過Column進行注解定義(isPrimaryKey缺菌、isNull葫辐、isUnique)

5.數(shù)據(jù)表格變化(只支持增加字段)

  • 修改數(shù)據(jù)庫版本號Config.SQLITE_DB_VERSION,往上遞增

  • 在Application中對版本號進行監(jiān)聽伴郁,并對數(shù)據(jù)表進行更新

    SQLiteVersionMigrate sqLiteVersionMigrate=new SQLiteVersionMigrate();
      sqLiteVersionMigrate.setMigrateListener(new SQLiteVersionMigrate.MigrateListener() {
          @Override
          public void onMigrate(int oldVersion, int newVersion) {
              for (int i=oldVersion;i<=newVersion;i++){
                  if(i==2){
    
                  }
    
              }
          }
      });
    

(3)DataForHttp

RequestBuilder<Result<List<WeChatNews>>> resultRequestBuilder = new RequestBuilder<>(new RxObservableListener<Result<List<WeChatNews>>>(mView) {
        @Override
        public void onNext(Result<List<WeChatNews>> result) {
            mView.refreshUI(result.getResult());
        }
    });

    resultRequestBuilder
            .setUrl(ApiUrl.URL_WETCHAT_FEATURED)
            .setTransformClass(WeChatNews.class)
            .setParam("page",page)
            .setParam("type","video")
            .setParam("count",num);


rxManager.addObserver(DataManager.DataForHttp.httpRequest(resultRequestBuilder));

(4)DataForSharePreferences

1.插入基本數(shù)據(jù)

DataManager.DataForSharePreferences.saveObject("user","這是一條測試的內(nèi)容")
ToastUtils.showToast(activity,"保存成功")

2.查詢基本類型數(shù)據(jù)

val con=DataManager.DataForSharePreferences.getObject("user","")
ToastUtils.showToast(activity,con)

六.Base的使用

1.為了方便Activity/Fragment設置頂部菜單欄耿战,繼承IBaseActivity/IBaseFragment即可顯示一個簡單的頂部菜單,IBaseFragment的頂部菜單默認隱藏焊傅,下面以IBaseActivity的頂部菜單作為例子
屬性 作用
isShowSystemActionBar 重寫該方法設置實現(xiàn)顯示系統(tǒng)ActionBar
isShowCustomActionBar 重寫該方法設置顯示自定義Bar
setCustomActionBar 重寫該方法設置自定義Bar
  • 如果使用默認自定義Bar可通過DefaultDefineActionBarConfig進行相關設置
屬性 作用
hideBackBtn 隱藏返回按鈕
setBarBackground 設置Bar的背景顏色
setBarHeight 設置Bar的高度
setTitleColor 設置標題顏色
setTitle 設置標題
setBackClick 設置返回按鈕監(jiān)聽
  • 代碼使用
defineActionBarConfig
       .setTitleSize(20f)
       .setBarHeight(DisplayUtils.dip2px(this,60f))
       .setBarBackground(this,R.color.driver_font)
       .setTitle(getString(R.string.tab_Indicator_title))
2.使用Fragment實現(xiàn)交互
屬性 作用
fragmentLayoutId 設置顯示Fragment的根布局id,在Activity中設置
startFragmentForResult(...) 和回調(diào)結(jié)果跳轉(zhuǎn)
onFragmentResult(....) Fragment的結(jié)果回調(diào)
setResult(...) onFragmentResult回調(diào)的結(jié)果設置
startFragment(...) 普通跳轉(zhuǎn)剂陡,具體使用查看IBaseActivity
isRootFragment() 判斷是否是根Fragment
3.StateView(數(shù)據(jù)加載頁面)
效果圖
屬性 作用
STATE_NO_DATA 不顯示加載框狀態(tài)碼
STATE_LOADING 加載數(shù)據(jù)顯示狀態(tài)碼
STATE_EMPTY 沒有數(shù)據(jù)顯示狀態(tài)碼
STATE_DISCONNECT 沒有網(wǎng)絡狀態(tài)碼
setOnDisConnectViewListener 點擊沒有網(wǎng)絡圖標回調(diào)
setOnEmptyViewListener 點擊沒有沒有數(shù)據(jù)圖標回調(diào)
showViewByState 設置顯示狀態(tài)
getmEmptyView 獲取無數(shù)據(jù)狀態(tài)View
布局可設置參數(shù)
loadingViewAnimation 設置加載的drawable動畫
loadingText 加載時的文本
emptyImage 空布局顯示的圖片
emptyText 空布局文本
emptyViewRes 設置自定義空布局
disConnectImage 設置斷網(wǎng)顯示的圖片
disConnectText 設置斷網(wǎng)顯示的文本
tipTextSize 文本字體大小
tipTextColor 文本字體顏色
(1)定義一個通用布局
<com.youngmanster.collection_kotlin.base.stateview.StateView xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:layout_centerInParent="true"
    android:id="@+id/state_view">

</com.youngmanster.collection_kotlin.base.stateview.StateView >
(2)添加到Ui頁面的layout中
<include layout="@layout/layout_state"/>
注意:上面的語句添加的layout最外層最好是LinearLayout以及設置為android:orientation="vertical"
(3)通過以下語句進行狀態(tài)切換
stateView.showViewByState(StateView.STATE_LOADING);
stateView.showViewByState(StateView.STATE_EMPTY);
stateView.showViewByState(StateView.STATE_NO_DATA);
stateView.showViewByState(StateView.STATE_DISCONNECT);

3.三步實現(xiàn)Permission(權限)設置

效果圖
// 項目的必須權限,沒有這些權限會影響項目的正常運行
private static final String[] PERMISSIONS = new String[]{
        Manifest.permission.READ_SMS,
        Manifest.permission.RECEIVE_WAP_PUSH,
        Manifest.permission.READ_CONTACTS
};
(2)權限通過PermissionManager管理
permissionManager=PermissionManager.with(this).
            setNecessaryPermissions(PERMISSIONS);

permissionManager.requestPermissions();
(3)頁面重寫onRequestPermissionsResult
//重寫
@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
    if (requestCode == PermissionManager.PERMISSION_REQUEST_CODE) {//PERMISSION_REQUEST_CODE為請求權限的請求值
        //有必須權限選擇了禁止
        if (permissionManager.getShouldShowRequestPermissionsCode() == PermissionManager.EXIST_NECESSARY_PERMISSIONS_PROHIBTED) {
            ToastUtils.showToast(PermissionActivity.this,"可以在這里設置重新跳出權限請求提示框");
        } //有必須權限選擇了禁止不提醒
        else if (permissionManager.getShouldShowRequestPermissionsCode() == PermissionManager.EXIST_NECESSARY_PERMISSIONS_PROHIBTED_NOT_REMIND) {
            ToastUtils.showToast(PermissionActivity.this,"可以在這里彈出提示框提示去應用設置頁開啟權限");
            permissionManager.startAppSettings();
        }
    }
}
注意:如果有需求先判斷是否所有權限都已經(jīng)允許之后再進入主頁面可以通過permissionManager.isLackPermission()進行判斷狐胎,如果返回true則進行權限請求鸭栖,如果返回false則進入主頁面。
  • 多個權限請求如果其中某一個被禁止提醒握巢,會先把沒有禁止提醒的權限處理完之后再進行處理晕鹊。
  • 如果是必要權限被禁止而沒有選擇禁止提醒退出之后下次會重新請求權限。
  • 如果必要權限被禁止和選擇了禁止提醒重新進入頁面在onRequestPermissionsResult會重新回調(diào)方法暴浦。
  • 使用者可以根據(jù)onRequestPermissionsResult()方法中返回來的標志PermissionManager.EXIST_NECESSARY_PERMISSIONS_PROHIBTED和PermissionManager.EXIST_NECESSARY_PERMISSIONS_PROHIBTED_NOT_REMIND做出對應的顯示和操作(例如彈框提示跳轉(zhuǎn)到設置頁面或者toat提示)溅话。

4.提供幾種比較常用的Dialog彈框

效果圖
(1)提供的常用的CommonDialog
屬性 作用
DIALOG_TEXT_TWO_BUTTON_DEFAULT 默認彈出按鈕提示
DIALOG_TEXT_TWO_BUTTON_CUSTOMIZE 自定義彈出按鈕提示
DIALOG_LOADING_PROGRASSBAR 默認加載彈框
DIALOG_CHOICE_ITEM 沒有數(shù)據(jù)顯示狀態(tài)碼

根據(jù)不同的構造函數(shù)設置不同的參數(shù)

(2)自定義Dialog樣式
  • BaseDialogFragment
屬性 作用
setContentView 設置彈框布局樣式
onViewCreated 初始化完成后的回調(diào),可在此做一些初始化
show(...) 顯示彈框
dismiss 彈框銷毀
setAllCancelable 點擊返回鍵和外部不可取消
setOnlyBackPressDialogCancel 點擊返回鍵可以取消
setDialogInterval 設置彈框和屏幕兩邊的間距
setDialogHeight 設置彈框高度
setOnDismissListener 彈框銷毀回調(diào)
  • 繼承BaseDialogFragment歌焦,通過setContentView(R.layout.dialog_list)設置彈窗布局飞几。
  • 在提供的onViewCreated方法中進行相應的邏輯設置

5.自定義PopupWindow彈框

效果圖
  • BasePopupWindow
屬性 作用
BasePopupWindow(Context context) 調(diào)用該構造函數(shù)默認彈出框鋪滿全屏
BasePopupWindow(Context context, int w, int h) 自定義彈出框高寬
showPopup 在屏幕中央顯示彈框
showPopupAsDropDown 在指定控件底部顯示彈框
showPopup 在屏幕中央顯示彈框
showPopupAsDropDown 在指定控件底部顯示彈框
setShowMaskView 設置是否顯示遮層
dismiss 銷毀彈出框
getPopupLayoutRes 自定義彈出框的布局文件
getPopupAnimationStyleRes 自定義彈出框的動畫文件,不設置動畫返回0
  • 繼承BasePopupWindow独撇。
  • 通過getPopupLayoutRes(R.layout.xxx)設置彈窗布局屑墨。
  • 通過getPopupAnimationStyleRes(R.style.xxx)設置彈窗動畫躁锁,不需要動畫可以設置為0。
  • 如果需要顯示遮層卵史,在構造函數(shù)通過setShowMaskView(true)設置战转。

七、CustomView的使用

效果圖

1.CommonTabLayout的使用

屬性 作用
tab_tabIndicatorWidth 設置下滑線的長度
tab_tabIndicatorHeight 設置下滑線的高度
tab_tabIndicatorColor 下滑線顏色
tab_indicator_marginLeft 設置下滑線外邊距
tab_indicator_marginRight 設置下滑線外邊距
tab_indicator_marginTop 設置下滑線外邊距
tab_indicator_marginBottom 設置下滑線外邊距
tab_tabTextColor 沒選中字體顏色
tab_tabTextSize 字體大小
tab_tabSelectedTextColor 選中字體顏色
tab_padding 下滑線內(nèi)邊距程腹,block樣式時可以通過該屬性設置距離
tab_tabBackground Tab 的背景顏色
tab_indicator_corner 下滑線的圓角大小
tab_indicator_gravity(bottom匣吊、top 設置下滑線顯示的位置,只針對line和triangle
tab_tabMode(scrollable寸潦、fixed) Tab的顯示模式
tab_indicator_style(line、triangle社痛、block) 下滑線的樣式
具體可參照例子使用见转。

2.OutSideFrameTabLayout的使用

效果圖
屬性 作用
tab_tabIndicatorColor 設置Tab顏色
tab_indicator_corner 圓角大小
tab_indicator_marginLeft 下滑線外邊距
tab_indicator_marginRight 下滑線外邊距
tab_indicator_marginTop 下滑線外邊距
tab_indicator_marginBottom 下滑線外邊距
tab_tabTextColor 沒選中字體顏色
tab_tabSelectedTextColor 選中字體顏色
tab_tabTextSize 字體大小
tab_tabSelectedTextColor 選中字體顏色
tab_padding 內(nèi)邊距
tab_bar_color bar的背景顏色
tab_bar_stroke_color 外框的顏色
tab_bar_stroke_width 外框的大小
tab_width bar的長度
具體可參照例子使用。

3.AutoLineLayout的使用

效果圖
  • 在外層布局使用AutoLineLayout
  <com.youngmanster.collection_kotlin.base.customview.wraplayout.AutoLineLayout
    android:layout_width="match_parent"
    android:layout_height="wrap_content">

  </com.youngmanster.collection_kotlin.base.customview.wraplayout.AutoLineLayout>

4.TagView的使用

效果圖
TagViewConfigBuilder
屬性 作用
setTitles 設置TagItem內(nèi)容
setTextSize 設置TagItem字體大小
setTextColor 設置TagItem字體顏色
setTextSelectColor 設置TagItem選擇字體顏色
setPaddingLeftAndRight 設置TagIttem左右內(nèi)邊距
setPaddingTopAndBottom 設置TagIttem上下內(nèi)邊距
setMarginAndTopBottom 設置TagItem上下外邊距
setMarginLeftAndRight 設置TagItem左右外邊距
setackgroudRes 設置background Drawable
setTagViewAlign 設置整體TagItem的Align(LEFT,RIGHT,CENTER)
1.布局
 <com.youngmanster.collection_kotlin.base.customview.tagview.TagView
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:id="@+id/tagView" />
2.代碼設置
String[] list={"werwrw","4545465","金浩","風和日麗",
            "一只蜜蜂叮在掛歷上","陽光","燦爛","1+1","瀏覽器","玲瓏骰子安紅豆蒜哀,入骨相思知不知"};

    TagViewConfigBuilder builder=new TagViewConfigBuilder()
            .setTitles(list);

    tagView.create(builder, new TagView.TagViewPressListener() {
        @Override
        public void onPress(View view, String title, int position) {
            ToastUtils.showToast(TagViewActivity.this,title);
        }
    });

八斩箫、工具類的使用

1.Density(適配不同手機像素)
  • 在Applicaton的onCreate中設置 Density.setDensity(this, 375f)
  • 375f代表設計稿的寬度,以dp為單位撵儿,后面需要以f(浮點型)
2.DisplayUtils
效果圖
屬性 作用
px2dip px值轉(zhuǎn)換為dip或dp值乘客,保證尺寸大小不變(有精度損失)
px2dipByFloat px值轉(zhuǎn)換為dip或dp值,保證尺寸大小不變(無精度損失
dip2px dip或dp值轉(zhuǎn)換為px值淀歇,保證尺寸大小不變(有精度損失)易核,類似Context.getDimensionPixelSize方法(四舍五入
dip2pxByFloat dip或dp值轉(zhuǎn)換為px值,保證尺寸大小不變(無精度損失)浪默,類似Context.getDimension方法
px2sp px值轉(zhuǎn)換為sp值牡直,保證文字大小不變
sp2px sp值轉(zhuǎn)換為px值,保證文字大小不變
getScreenWidthPixels 屏幕寬度
getScreenHeightPixels 屏幕高度
getDisplayInfo 獲取設備信息
setStatusBarBlackFontBgColor 設置黑色字體狀態(tài)的背景顏色
setStatusBarColor 設置狀態(tài)欄背景顏色
setStatusBarFullTranslucent 設置狀態(tài)欄透明
getStatusBarHeight 獲取狀態(tài)欄高度
getActionBarHeight 獲取ActionBar高度
3.ColorUtils
屬性 作用
createColorStateList 獲取ColorStateList
4.FileUtils
屬性 作用
WriterTxtFile 寫文件纳决,其中append可設置是否添加在原內(nèi)容的后邊
ReadTxtFile 讀取文本文件中的內(nèi)容碰逸,strFilePath代表文件詳細路徑
isCacheDataFailure 判斷緩存是否失效
checkFileExists 檢查文件是否存在
checkSaveLocationExists 檢查是否安裝SD卡
deleteDirectory 刪除目錄(包括:目錄里的所有文件)
deleteFile 刪除文件
getFileOrFilesSize 獲取文件指定文件的指定單位的大小,其中sizeType 獲取大小的類型1為B阔加、2為KB饵史、3為MB、4為GB
getFileSize 獲取指定文件大小
5.GetPermissionsUtils
屬性 作用
getAllPermissons 獲取應用用到的所有權限
6.GlideUtils
屬性 作用
loadImg 加載圖片
loadImgBlur Glide實現(xiàn)高斯模糊
loadImgBlur Glide實現(xiàn)高斯模糊胜榔,可設置模糊的程度
7 .ThreadPoolManager:線程池管理類
8.LogUtils:日記工具類
9.NetworkUtils:網(wǎng)絡工具類
10.SoftInputUtils:鍵盤工具類
11.ToastUtils:Toast工具類
12.RxJavaUtil:主/子線程的切換

本文章會根據(jù)需要持續(xù)更新胳喷,建議點贊收藏,便于查看苗分。也歡迎大家提出更多建議厌蔽。

最后編輯于
?著作權歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市摔癣,隨后出現(xiàn)的幾起案子奴饮,更是在濱河造成了極大的恐慌纬向,老刑警劉巖,帶你破解...
    沈念sama閱讀 206,311評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件戴卜,死亡現(xiàn)場離奇詭異逾条,居然都是意外死亡,警方通過查閱死者的電腦和手機投剥,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,339評論 2 382
  • 文/潘曉璐 我一進店門师脂,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人江锨,你說我怎么就攤上這事吃警。” “怎么了啄育?”我有些...
    開封第一講書人閱讀 152,671評論 0 342
  • 文/不壞的土叔 我叫張陵酌心,是天一觀的道長。 經(jīng)常有香客問我挑豌,道長安券,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 55,252評論 1 279
  • 正文 為了忘掉前任氓英,我火速辦了婚禮侯勉,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘铝阐。我一直安慰自己址貌,他們只是感情好,可當我...
    茶點故事閱讀 64,253評論 5 371
  • 文/花漫 我一把揭開白布饰迹。 她就那樣靜靜地躺著芳誓,像睡著了一般。 火紅的嫁衣襯著肌膚如雪啊鸭。 梳的紋絲不亂的頭發(fā)上锹淌,一...
    開封第一講書人閱讀 49,031評論 1 285
  • 那天,我揣著相機與錄音赠制,去河邊找鬼赂摆。 笑死,一個胖子當著我的面吹牛钟些,可吹牛的內(nèi)容都是我干的烟号。 我是一名探鬼主播,決...
    沈念sama閱讀 38,340評論 3 399
  • 文/蒼蘭香墨 我猛地睜開眼政恍,長吁一口氣:“原來是場噩夢啊……” “哼汪拥!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 36,973評論 0 259
  • 序言:老撾萬榮一對情侶失蹤宋距,失蹤者是張志新(化名)和其女友劉穎昂羡,沒想到半個月后虚婿,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 43,466評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡劲腿,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 35,937評論 2 323
  • 正文 我和宋清朗相戀三年打洼,在試婚紗的時候發(fā)現(xiàn)自己被綠了蠢古。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片辕棚。...
    茶點故事閱讀 38,039評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡欲主,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出逝嚎,到底是詐尸還是另有隱情扁瓢,我是刑警寧澤,帶...
    沈念sama閱讀 33,701評論 4 323
  • 正文 年R本政府宣布补君,位于F島的核電站涤妒,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏赚哗。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 39,254評論 3 307
  • 文/蒙蒙 一硅堆、第九天 我趴在偏房一處隱蔽的房頂上張望屿储。 院中可真熱鬧,春花似錦渐逃、人聲如沸够掠。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,259評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽疯潭。三九已至,卻和暖如春面殖,著一層夾襖步出監(jiān)牢的瞬間竖哩,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,485評論 1 262
  • 我被黑心中介騙來泰國打工脊僚, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留相叁,地道東北人。 一個月前我還...
    沈念sama閱讀 45,497評論 2 354
  • 正文 我出身青樓辽幌,卻偏偏與公主長得像增淹,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子乌企,可洞房花燭夜當晚...
    茶點故事閱讀 42,786評論 2 345

推薦閱讀更多精彩內(nèi)容