代码拉取完成,页面将自动刷新
MVP(或MVVM)架构+AOP面向切面编程,摒弃反射、代理等操作,稳定性和执行效率高
积累很多框架封装思想,能够轻松驾驭任何典型的APP项目开发
轻量级框架,轻松实现类似EventBus,ButterKnife(MVVM架构不再支持),Retrofit等核心注解功能,使代码简洁优雅。
详细使用请参考完整项目QsBaseDemo
buildscript {
repositories {
...
maven {
url 'https://jitpack.io'
}
}
dependencies {
...
classpath 'com.gitee.qsolmaxmin:QsTransform:10.10.25'
}
}
allprojects {
repositories {
...
maven {
url 'https://jitpack.io'
}
}
}
apply plugin: 'com.qsmaxmin.plugin'
...
完成以上两步,SDK依赖环境就算搭建完毕了。
该步有两种方案(任选其一即可):
1,继承QsApplication,开发者可以自行重写回调方法
2,实现QsIApplication接口并在onCreate回调里调用QsHelper.init(this); 参考QsApplication源码。
public class GrapeApplication extends QsApplication {
/**
* 是否是debug模式
* debug模式下每个页面会自动添加一个debug按钮,点击按钮可打开一个弹窗
* 弹窗页面编辑见getDebugConfig()方法
*/
@Override public boolean isDebug() {
return true;
}
/**
* 可使用DebugHelper.addLogcat(LogItem item)添加自定义日志到Logcat列表
*/
@Override public DebugConfig getDebugConfig() {
return new DefaultDebugConfig() {
@Override public MvModelPager[] customPagers() {
MvModelPager pager = new MvModelPager();
pager.fragment = new MyDebugFragment();
pager.title = "自定义参数";
return new MvModelPager[]{pager};
}
};
}
/**
* 自定义http请求公共拦截器
* 可设置公共主机地址,添加公共参数和公共请求头,对响应体进行解密等操作
*/
@Override public HttpInterceptor registerGlobalHttpInterceptor() {
return new CustomHttpInterceptor();
}
/**
* 自定义图片加载公共拦截器
* 可设置图片自定义转换,网络解密器等
*/
@Override public ImageLoadInterceptor registerGlobalImgLoadInterceptor() {
return new CustomImageLoadInterceptor();
}
/**
* 全局页面为空的布局
*/
@Override public int emptyLayoutId() {
return R.layout.fragment_common_empty;
}
/**
* 全局页面出现错误的布局
*/
@Override public int errorLayoutId() {
return R.layout.fragment_common_httperror;
}
/**
* 全局页面正在加载时的布局
*/
@Override public int loadingLayoutId() {
return R.layout.fragment_common_loading;
}
/**
* 自定义进度条对话框
* 通过Activity.loading()打开该对话框
*/
@Override public QsProgressDialog getLoadingDialog() {
return new DefaultProgressDialog();
}
...
}
1,Activity的使用:
所有的Activity必须继承框架里的Activity
为快速开发,框架有多个Activity供开发者继承,如:
MvActivity: 基类activity,可重写actionbarLayoutId()返回actionbar布局
MvListActivity: 集成List的activity,实现抽象方法即可
MvViewpagerActivity: 集成Viewpager的activity,实现抽象方法即可
...
例如:
/**
* MVVM架构的V层
*/
public class MainActivity extends MvActivity{
@BindBundle("bundle_key_user_id")String useId; //绑定bundle传递数值
private ActivityMainBinding binding;
@Override public View onCreateContentView(LayoutInflater inflater, ViewGroup parent) {
binding = DataBindingUtil.inflate(inflater, R.layout.activity_main, viewGroup, true);
return binding.getRoot();
}
@Override public void initData(Bundle bundle){
requestDataFromNetwork(userId);
}
/**
* 用ThreadPoint使得该方法在HTTP线程中执行
*/
@ThreadPoint(ThreadType.HTTP)
public void requestDataFromNetwork(String userId) {
UserHttp http = createHttpRequest(UserHttp.class);
ModelUser modelUser = http.requestUserData(userId);
updateUI(modelUser);
}
/**
* 用ThreadPoint使得该方法在MAIN线程中执行
*/
@ThreadPoint(ThreadType.MAIN)
public void updateUI(ModelUser modelUser) {
binding.setUserData(modelUser);
}
}
/**
* Http请求时的接口定义
*/
public interface UserHttp {
/**
* 建议重写QsApplication.registerGlobalHttpInterceptor()方法并设置公共主机地址,公参等
* 网络请求接口写法方式1
*/
@POST("/api/v1/users") ModelUser requestUserData(@Field("user_id") String userId);
/**
* 建议重写QsApplication.registerGlobalHttpInterceptor()方法并设置公共主机地址,公参等
* 网络请求接口写法方式2
*/
@POST("/api/v1/users") HttpCall<ModelUser> requestUserData(@Field("user_id") String userId);
}
/**
* MVVM架构的M层
* 继承自己写的http响应体基类
*/
public class ModelUser{
public String userName;
public String userId;
...
}
QsHelper里封装了很多常用的方法如:
网络请求:QsHelper.getHttpHelper()
图片加载:QsHelper.getImageHelper()
线程池:QsThreadPollHelper
Activity栈管理:QsHelper.getScreenHelper()
EventBus:QsHelper.eventPost()
Activity跳转:QsHelper.intent2Activity()
打开对话框:QsHelper.commitDialogFragment()
资源获取:QsHelper.getString(),QsHelper.getDrawable()....
2,Fragment的使用
所有的Fragment必须继承框架的Fragment,用法和MvActivity基本一致
为快速开发,框架有多个Fragment供开发者继承如:
MvFragment: 普通fragment
MvListFragment: 带listView的Fragment
MvPullListFragment: 带分页listView的Fragment
...
Fragment写法和Activity一样...
3,注解的使用
@BindBundle可以直接绑定Bundle值到field
@Subscribe注解可以绑定事件接收到method,可通过QsHelper.eventPost(xxx)发送事件
@Property注解可以持久化参数到本地(注意Class必须有@AutoProperty注解才能生效)
@ThreadPoint注解的方法,可以让该方法在指定线程中执行
@Permission注解的方法,会在方法执行前申请指定的权限,权限申请成功后再接着执行该方法
@QsAspect可实现自定义AOP功能
-keep class com.qsmaxmin.qsbase** { *; }
-dontwarn com.qsmaxmin.qsbase.*
-keep class * extends java.lang.annotation.Annotation { *; }
#okhttp
-dontwarn okio.**
-dontwarn okhttp3.**
-dontwarn in.srain.cube.**
-keep class in.srain.cube.**{*;}
-keep class okhttp3.**{*;}
-dontwarn javax.annotation.**
-dontwarn org.conscrypt.**
-keepnames class okhttp3.internal.publicsuffix.PublicSuffixDatabase
#GSON
-keep class sun.misc.Unsafe { *; }
-keep class com.google.gson.examples.android.model. { *; }
#框架部分实现类防止混淆
-keep class * extends com.qsmaxmin.annotation.QsNotProguard{*;}
-keep class $ extends com.qsmaxmin.annotation.QsNotProguard{*;}
#Glide防止混淆
-keep class * extends com.bumptech.glide.module.AppGlideModule{*;}
-keep class * extends com.bumptech.glide.module.LibraryGlideModule{*;}
-keep class com.bumptech.glide.GeneratedAppGlideModuleImpl{*;}
-keep class * implements com.bumptech.glide.module.GlideModule
-keep public enum com.bumptech.glide.load.ImageHeaderParser$** {
**[] $VALUES;
public *;
}
-dontwarn com.bumptech.glide.load.resource.bitmap.VideoDecoder
此处可能存在不合适展示的内容,页面不予展示。您可通过相关编辑功能自查并修改。
如您确认内容无涉及 不当用语 / 纯广告导流 / 暴力 / 低俗色情 / 侵权 / 盗版 / 虚假 / 无价值内容或违法国家有关法律法规的内容,可点击提交进行申诉,我们将尽快为您处理。