Skip to content
ShiHao edited this page Mar 10, 2017 · 8 revisions

Welcome to the XDroid-Base wiki!

XDroid-Base包含了XDroid的基本功能,可作为一个简单的开发框架,包含开发中常用的一些快速开发类。

特性

XDroid-Databinding主要有这些特性:

  • 提供SimpleRecAdapterSimpleListAdapteXRecyclerAdapterXListAdapter等基类,可快速进行开发
  • 实现了Memory、Disk、SharedPreferences三种方式的缓存,可自由扩展
  • 内置Glide,可自由切换其他图片加载库
  • 可输出漂亮的Log,支持Json、Xml、Throwable等,蝇量级实现
  • 内置链式路由
  • 内置Toast工具类
  • 内置常用工具类:packagerandomfile...,提供的都是非常常用的方法
  • 内置加密工具类 XCodec,你想要的加密姿势都有
  • 引入三方库极少

Get Started

方式一使用,仅需四步:

step1

clone 'XDroid-Base'库到本地:

git clone https://github.com/fodroid/XDroid-Base.git

step2

xdroidbase作为依赖库,在您的app module 中 添加如下依赖:

compile project(':xdroidbase')

step3

拷贝conf.gradle到您的项目根目录,并修改项目gradle文件下引入:

apply from: "conf.gradle"

并添加:

allprojects {
    repositories {
        jcenter()
        maven { url "https://jitpack.io" }
    }
}

step4

调用XDroidBaseConf配置类,主要针对log、cache、router、imageloader。若采用默认配置,此步骤可略过.

第二种方式,通过JitPack引入

step1 在根目录的gradle文件中配置:

allprojects {
    repositories {
        jcenter()
        maven { url "https://jitpack.io" }
    }
}

step2 添加依赖:

dependencies {
	        compile 'com.github.fodroid:XDroid-Base:v1.3'
}

Base篇

简单的ListView Adapter

即只有一个viewType的Adapter,这时只需要继承SimpleListAdapter

public class AListAdapter extends SimpleListAdapter<String, AListAdapter.ViewHolder> {


    public AListAdapter(Context context) {
        super(context);
    }

    @Override
    protected ViewHolder newViewHolder(View convertView) {
        return new ViewHolder(convertView);
    }

    @Override
    protected int getLayoutId() {
        return R.layout.item_single;
    }

    @Override
    protected void onBindViewHolder(ViewHolder holder, String item, int position) {

    }

    public static class ViewHolder {

        public ViewHolder(View convertView) {

        }
    }
}

复杂的ListView Adapter

即具有多个viewType的Adapter,这时只需要继承XListAdapter

public class CListAdapter extends XListAdapter<String> {

    public CListAdapter(Context context) {
        super(context);
    }

    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        String item = data.get(position);
        CListAdapter.ViewHolder holder = null;

        if (convertView == null) {
            convertView = View.inflate(context, R.layout.item_single, null);
            holder = new ViewHolder(convertView);

            convertView.setTag(holder);
        } else {
            holder = (ViewHolder) convertView.getTag();
        }
        return convertView;
    }

    public static class ViewHolder {

        public ViewHolder(View convertView) {
           
        }
    }
}

简单的RecyclerView的Adapter

即具有一个viewType的Adapter,此时可继承SimpleRecAdapter

public class BRecAdapter extends SimpleRecAdapter<String, BRecAdapter.ViewHolder> {

    public BRecAdapter(Context context) {
        super(context);
    }

    @Override
    public ViewHolder newViewHolder(View itemView) {
        return new ViewHolder(itemView);
    }

    @Override
    public int getLayoutId() {
        return R.layout.item_single;
    }

    @Override
    public void onBindViewHolder(final ViewHolder holder, final int position) {
        holder.itemView.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                if (getSimpleItemClick() != null) {
                    getSimpleItemClick().onItemClick(position, data.get(position), 0, holder);
                }
            }
        });
    }

    public static class ViewHolder extends RecyclerView.ViewHolder {

        public ViewHolder(View itemView) {
            super(itemView);
        }
    }
}

复杂的RecyclerView的Adapter

即具有多个viewType的Adapter,此时可继承RecyclerAdapter

public class DRecAdapter extends XRecyclerAdapter<String,DRecAdapter.ViewHolder> {


    public DRecAdapter(Context context) {
        super(context);
    }

    @Override
    public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
        View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.item_single, parent, false);
        return new ViewHolder(view);
    }

    @Override
    public void onBindViewHolder(ViewHolder holder, int position) {

    }

    public static class ViewHolder extends RecyclerView.ViewHolder {

        public ViewHolder(View itemView) {
            super(itemView);
        }
    }
}

ImageLoader篇

简单使用

	//初始化
        ILFactory.getLoader().init(context);
        //从Asset中加载
        ILFactory.getLoader().loadAssets(imageView, assetPath, null);
        //从file中加载
        ILFactory.getLoader().loadFile(imageView, new File(filePath), null);
        //加载网络图片
        ILFactory.getLoader().loadNet(imageView, urlPath, null);
        //加载网络图片,设置监听
        ILFactory.getLoader().loadNet(context, urlPath, null, new LoadCallback() {
            @Override
            public void onLoadReady(Bitmap bitmap) {
					//图片下载成功
					
            }

        });
        //从res中加载
        ILFactory.getLoader().loadResource(imageView, resIds, null);
        //清除内存缓存
        ILFactory.getLoader().clearMemoryCache(context);
        //继续加载
        ILFactory.getLoader().resume(context);
        //暂停加载
        ILFactory.getLoader().pause(context);

		 //清理磁盘文件缓存
        new Thread() {
            @Override
            public void run() {
                super.run();
                ILFactory.getLoader().clearDiskCache(context);
            }
        }.start();

需要注意的是:clearDiskCache()必须在线程中调用

扩展加载条件

扩展加载条件如动画、加载中图片、加载失败图片、缩放方式等,可以通过Options类进行扩展.

ILFactory.getLoader().loadNet(imageView, urlPath,
                new ILoader.Options(loadingResId, loadErrorResId).scaleType(ImageView.ScaleType.FIT_CENTER));

使用其他图片加载框架

框架中内置了Glide的实现,如果需要使用其他图片加载框架,如picasso等,按如下步骤进行:

step1 利用其他加载框架实现ILoader接口

如果想使用picasso,则可以写一个PicassoLoader,病实现ILoader接口。具体实现可参照 GlideLoader

public class GlideLoader implements ILoader{

    void init(Context context){}

    void loadNet(ImageView target, String url, Options options){}

    void loadNet(Context context, String url, Options options, LoadCallback callback{}

    void loadResource(ImageView target, int resId, Options options){}

    void loadAssets(ImageView target, String assetName, Options options){}

    void loadFile(ImageView target, File file, Options options){}

    void clearMemoryCache(Context context){}

    void clearDiskCache(Context context){}

    void resume(Context context){}

    void pause(Context context){}

}

step2 调用ILFactory # setILoader()

ILFactory.setILoader(loader);

Router篇

普通的UI跳转

不带参数的UI跳转

Router.newIntent(context)		//context表示当前上下文
      .to(EndActivity.class)	//to()指定目标context
      .launch();

带参数的UI跳转

可使用put()方法指定跳转参数

Router.newIntent(context)
      .to(EndActivity.class)
      .putString("arg_name","xdroid")
      .launch();

StartActivityForResult类型的跳转

通过 requestCode()方法指定请求码

Router.newIntent(context)
      .to(EndActivity.class)
      .putString("arg_name","xdroid")
      .requestCode(100)
      .launch();

overridePendingTransition()类型的指定动画

通过anim()指定动画

Router.newIntent(context)
      .to(EndActivity.class)
      .putString("arg_name","xdroid")
      .anim(enterAnim,exitAnim)
      .launch();

设置flag类型跳转

通过addFlags()方法指定flag

Router.newIntent(context)
      .to(EndActivity.class)
      .addFlags(Intent.FLAG_ACTIVITY_NEW_TASK)
      .launch();

设置场景动画跳转

通过options()方法指定场景动画

Router.newIntent(context)
      .to(EndActivity.class)
      .options(ActivityOptionsCompat.makeBasic())
      .launch();

Cache篇

XDroid定义了ICache接口

public interface ICache {
    void put(String key, Object value);         //存

    Object get(String key);                     //取

    void remove(String key);                    //删除

    boolean contains(String key);               //检验是否存在

    void clear();                               //删除所有

}

并实现了DiskCacheMemoryCache,其内部分别借助 DiskLruCacheLruCache实现。

SharedPreferences

SharedPref是对SharedPreferences的封装,包含了一系列的get&put方法、remove等。 推荐实践:创建一个新类,将键名作为常量,并封装对应的put&get静态方法,方便全局使用。如:

public String getUserName(){
    return getString(KEY.USER_NAME , null);
}

可以在XDroidBaseConf中配置缓存文件名称,默认是config

MemoryCache

MemoryCache内部采用LruCache实现,是ICache的实现类。 推荐实践:创建一个新类,将键名作为常量,并封装对应的put&get静态方法,方便全局使用。

DiskCache

DiskCache内部采用DiskLruCache实现,是文件缓存方式,其在基本缓存的基础上,增加了有效期,可以用于Api数据缓存。

void put(String key, String value);
void put(String key, String value, long expireMills);
String get(String key);
void remove(String key);
boolean contains(String key);
void clear();

实现了上述方法。

可以在XDroidBaseConf中配置缓存目录名称,默认是cache

自定义缓存

自定义缓存只需要实现ICache即可。

Kit篇

Codec加密工具类

Codec加密工具类囊括了几乎所有常用的加密算法,包括MD5、SHA、AES、DES、RSA等,具体操作可以阅读源码发现,这里不再赘述。

Kits工具类

  • 框架不再采用常见的堆工具类的方式,而是将所有常用的方法进行分类,聚合为一个类文件,实现了最大程度的精简。
  • 工具类中包括Package(包管理)、Dimens(尺寸)、Random(随机数)、File(文件操作)、IO(IO操作)、Date(时间)、NetWork(网络)、Empty(空检测)、PatternMatcher(正则)等几个子分类。
  • 工具类中内置了很多很靠谱的实现,如文件的md5等,还有更多彩蛋可以阅读相关源码。

ToastManager工具类

ToastManager工具类可以方便的处理toast,避免长时间显示toast。

Log篇

框架对log进行了美化输出,目前支持:

  • text
  • json
  • xml
  • throwable

具体的可调用:

XLog.json(json)	//格式化json并输出

其他使用类似。

XDroidBaseConf篇

XDroidBaseConf目前支持log、cache、router、imageloader几个部分的配置,没需要可以全部采用默认配置。

XDroidBaseConf.getInstance()
                .setLog(true)//是否显示log输出
                .setDefLogTag("XDroid")//默认的日志输出tag
                .setCacheSpName("config")//配置sharedPref的文件名
                .setCacheDiskDir("cache")//配置缓存文件夹名称
                .setILLoadingRes(ILoader.Options.RES_NONE)//配置图片加载loding占位图
                .setILErrorRes(ILoader.Options.RES_NONE)//配置图片加载失败占位图
                .setILoader(new GlideLoader())//配置图片框架
                .setRouterLaunchAnim(Router.RES_NONE, Router.RES_NONE)//配置launch动画
                .setRouterPopAnim(Router.RES_NONE, Router.RES_NONE)//配置pop动画
                .build();//设置生效