* 请求方式有:
* @Get
* @post
* @PUT
* @DELETE
* @HEAD
* @OPTIONS
* @HTTP (可用于替换上面所有的请求方式)
* <p>
* <p>
* 标记请求方法有:
* @FormUrlEncoded 表示请求是一个Form表单
* 每个键值对需要用@Filed来注解键名,随后的对象需要提供值。
* <p>
* <p>
* @Multipart 表示请求体是一个支持文件上传的Form表单
* 每个键值对需要用@Part来注解键名,随后的对象需要提供值。
* <p>
* <p>
* @Streaming 表示返回的数据以流的形式返回,适用于返回数据较大的场景
* (如果没有该注解,默认把数据全部载入内存,之后获取数据也是从内存中读取)
* <p>
* <p>
* 网络请求参数如下:
* @Headers 添加请求头,固定参数
* @Body 以 Post方式 传递 自定义数据类型 给服务器,也可以传递Map,相当于@Field,需要做处理
* FormBody.Builder builder = new FormBody.Builder();
* builder.add("key","value");
* <p>
* <p>
* <p>
* @Field以及@FieldMap 传递单个参数或者一个Map集合
* <p>
* <p>
* <p>
* @Part & @PartMap,提交文件,注意Map添加参数是,值为responseBody
* <p>
* <p>
* <p>
* @Query以及@QueryMap 用法与@Field相同
* <p>
* <p>
* <p>
* @Path 访问的API是:https://api.github.com/users/{user}/repos
* 在发起请求时, {user} 会被替换为方法的第一个参数 user(被@Path注解作用)
* <p>
* <p>
* <p>
* @Url 当有URL注解时,@GET传入的URL就可以省略,当GET、POST...HTTP等方法中没有设置Url时,则必须使用 {@link Url}提供
*
*
*/
public interface RetrofitApi {
/**
* method:网络请求的方法(区分大小写)
* path:网络请求地址路径
* hasBody:是否有请求体
*/
@HTTP(method = "GET", path = "blog/id=8", hasBody = true)
Observable<LoginResponse> testHttp(@Body LoginRequest request);
@POST("/post")
Observable<LoginResponse> login(@Body LoginRequest request);
/**
* 添加请求头,不固定形式,参数需要传值
*
* @param plat 参数值
* @return 访问的API是:https://api.github.com/users/{user}/repos
* 在发起请求时, {user} 会被替换为方法的第一个参数 user(被@Path注解作用)
*/
@POST("users/{user}/rew")
@FormUrlEncoded
Observable<LoginResponse> getUser(@Path("user") String user, @Header("plat") String plat, @Field("userName") String name, @Field("age") int age);
/**
* 添加Map集合请求参数
*
* @param map 当有URL注解时,@GET传入的URL就可以省略,当GET、POST...HTTP等方法中没有设置Url时,则必须使用 {@link Url}提供
* @return
*/
@POST
@FormUrlEncoded
Observable<LoginResponse> testFileMap(@Url String url, @FieldMap Map<String, String> map);
/**
* @param name {@link RequestBody}、{@link okhttp3.MultipartBody.Part} 、任意类型
* @param age 除 {@link okhttp3.MultipartBody.Part} 以外,
* 其它类型都必须带上表单字段({@link okhttp3.MultipartBody.Part} 中已经包含了表单字段的信息),
* @param file
* @return
*/
@POST("/asd")
@Multipart
Observable<LoginResponse> testPart(@Part("name") RequestBody name, @Part("age") RequestBody age, @Part MultipartBody.Part file);
/**
* 用于 @GET 方法的查询参数(Query = Url 中 ‘?’ 后面的 key-value)
* url = http://www.println.net/?cate=android,其中,Query = cate
*
* @param cate
* @return
*/
@GET
Observable<LoginResponse> useQuery(@Query("cate") String cate);
/**
* 表单形式上传文件,添加参数到RequestBody
*
* @param map
* @param file
* @return
*/
@POST("asds")
@Multipart
Observable<LoginResponse> testPartMap(@PartMap Map<String, RequestBody> map, @Part MultipartBody.Part file);
/**
* 添加固定参数的请求头
*
* @param request
* @param name
* @return
*/
@POST("/post")
@Headers("plat: 1")
@FormUrlEncoded
Observable<LoginResponse> testForm(@Body LoginRequest request, @Field("userName") String name);
@POST
Observable<RegisterResponse> register(@Body RegisterRequest request);
@POST
@Multipart
Observable<RegisterResponse> testMuilt(@Body RegisterRequest request, @Part("name") RequestBody name, @Part MultipartBody.Part file);
@POST
Observable<BookInfoResponse> getBookInfo(@Body BookInfoRequest request);
@POST
Observable<BookCommentResponse> getBookComment(@Body BookCommentRequest request);
android数据库GreenDao的使用
GreenDao对象字段注释如下
- @Entity:告诉GreenDao该对象为实体,只有被@Entity注释的Bean类才能被dao类操作
- @Id:对象的Id,使用Long类型作为EntityId,否则会报错。(autoincrement = true)表示主键会自增,如果false就会使用旧值
- @Property:可以自定义字段名,注意外键不能使用该属性
- @NotNull:属性不能为空
- @Transient:使用该注释的属性不会被存入数据库的字段中
- @Unique:该属性值必须在数据库中是唯一值
- @Generated:编译后自动生成的构造函数、方法等的注释,提示构造函数、方法等不能被修改
android常用注解以及自定义注解替代枚举
android有关gradle的一些配置
gradle使用source set 的概念,一个source set就是一系列资源文件,其将会被便衣和执行,对于android项目,main就是一个source set,其包含了所有的资源文件,相对main测试文件test也是一个source set,只做测试
基础命令:
- 查看gradle版本
gradlew -v
- 查看所有可运行的tasks
gradlew tasks
- 清除目录下的output文件夹
gradlew clean
- 打包编译, 包括debug和release
gradlew build
- 编译并打Debug包
gradlew assembleDebug
- 编译并打Release的包
gradlewassembleRelease
- 只打包阿里release版本
gradlew assemblealiRelease
- 关于多moudle
gradlew :UpdateAppUtils:assembleDebug
- 帮助
gradlew --help
- 查看编译信息
gradlew build --info
或–stacktrace
- 制定module
gradlew -p app build
项目用到的库以及配置的混淆文件
//生命声明本地依赖
compile fileTree(include: [‘*.jar’], dir: ‘libs’)
//声明测试用例库
androidTestCompile(‘com.android.support.test.espresso:espresso-core:2.2.2’, {
exclude group: ‘com.android.support’, module: ‘support-annotations’
})
//支付宝支付
compile files(‘libs/alipaySdk-20170309.jar’)
//MOB分享
compile project(‘:sharelibrary’)
//微信SDK
compile ‘com.tencent.mm.opensdk:wechat-sdk-android-with-mta:1.0.2’
//可以伸缩的TextView
compile ‘com.ms-square:expandableTextView:0.1.4’
//屏幕适配
compile ‘com.zhy:autolayout:1.4.5’
compile ‘com.android.support:appcompat-v7:25.3.1’
//设置阅读页动画
compile ‘com.nineoldandroids:library:2.4.0’
//Xutils3用于网络请求
compile ‘org.xutils:xutils:3.3.40’
compile ‘com.android.support:design:25.3.0’
//加载图片
compile ‘com.github.bumptech.glide:glide:3.7.0’
compile ‘com.android.support:support-v4:25.3.0’
compile ‘com.android.support:support-vector-drawable:25.1.0’
//项目内部传递消息
compile ‘org.greenrobot:eventbus:3.0.0’
//json解析
compile ‘com.alibaba:fastjson:1.2.23’
//数据库
compile ‘org.litepal.android:core:1.5.1’
//圆角图片
compile ‘de.hdodenhof:circleimageview:2.1.0’
//log打印
compile ‘com.github.zhaokaiqiang.klog:library:1.5.0’
//图片压缩
compile ‘top.zibin:Luban:1.1.3’
//html
compile ‘org.jsoup:jsoup:1.10.2’
//友盟统计
compile ‘com.umeng.analytics:analytics:latest.integration’
//权限管理
compile ‘com.yanzhenjie:permission:1.0.7’
//相册
compile ‘com.yanzhenjie:album:1.0.7’
//拖拽布局
compile ‘com.android.support.constraint:constraint-layout:1.0.0-alpha8’
//RecyclerView适配器
compile ‘com.github.CymChad:BaseRecyclerViewAdapterHelper:2.9.18’
//轮播
compile ‘com.github.pinguo-zhouwei:MZBannerView:v1.1.0’
//高亮引导
compile ‘com.isanwenyu.highlight:highlight:1.8.0’
//动态生成小红点
compile ‘q.rorbin:badgeview:1.1.2’
//绑定View
compile ‘com.jakewharton:butterknife:8.7.0’
//生成git和set方法
compile ‘org.projectlombok:lombok:1.16.18’
annotationProcessor “org.projectlombok:lombok:1.16.18”
//数据请求
compile ‘com.yanzhenjie.nohttp:nohttp:1.1.4’
compile ‘com.yanzhenjie.nohttp:okhttp:1.1.4’
testCompile ‘junit:junit:4.12’
annotationProcessor ‘com.jakewharton:butterknife-compiler:8.7.0’
provided ‘org.glassfish:javax.annotation:10.0-b28’
//更新下载安装
compile project(‘:UpdateAppUtils’)
<!--more-->
#实体类
-keep class com.sweetorange.read.bean.** { *; }
#保护注解
-keepattributes *Annotation*
-keepattributes Signature
-ignorewarnings
#第三方包
#jsoup
-keeppackagenames org.jsoup.nodes
#MOB
-keep class cn.sharesdk.**{*;}
-keep class com.sina.**{*;}
-keep class **.R$* {*;}
-keep class **.R{*;}
-keep class com.mob.**{*;}
-dontwarn com.mob.**
-dontwarn cn.sharesdk.**
-dontwarn **.R$*
#butterknife
-keep class butterknife.** { *; }
-dontwarn butterknife.internal.**
-keep class **$$ViewBinder { *; }
-keepclasseswithmembernames class * {
@butterknife.* <fields>;
}
-keepclasseswithmembernames class * {
@butterknife.* <methods>;
}
#eventBus
-keepclassmembers class ** {
@org.greenrobot.eventbus.Subscribe <methods>;
}
-keep enum org.greenrobot.eventbus.ThreadMode { *; }
-keepclassmembers class * extends org.greenrobot.eventbus.util.ThrowableFailureEvent {
<init>(java.lang.Throwable);
}
#glide
-keep public class * implements com.bumptech.glide.module.GlideModule
-keep public class * extends com.bumptech.glide.module.AppGlideModule
-keep public enum com.bumptech.glide.load.resource.bitmap.ImageHeaderParser$** {
**[] $VALUES;
public *;
}
#album相册
-dontwarn com.yanzhenjie.album.**
-keep class com.yanzhenjie.album.**{*;}
-dontwarn com.yanzhenjie.fragment.**
-keep class com.yanzhenjie.fragment.**{*;}
-dontwarn com.yanzhenjie.mediascanner.**
-keep class com.yanzhenjie.mediascanner.**{*;}
-dontwarn com.yanzhenjie.loading.**
-keep class com.yanzhenjie.loading.**{*;}
-dontwarn com.yanzhenjie.statusview.**
-keep class com.yanzhenjie.statusview.**{*;}
# permission权限管理
-keepclassmembers class ** {
@com.yanzhenjie.permission.PermissionYes <methods>;
}
-keepclassmembers class ** {
@com.yanzhenjie.permission.PermissionNo <methods>;
}
#brvah
-keep class com.chad.library.adapter.** {
*;
}
-keep public class * extends com.chad.library.adapter.base.BaseQuickAdapter
-keep public class * extends com.chad.library.adapter.base.BaseViewHolder
-keepclassmembers class **$** extends com.chad.library.adapter.base.BaseViewHolder {
<init>(...);
}
#nohttp
-dontwarn com.yanzhenjie.nohttp.**
-keep class com.yanzhenjie.nohttp.**{*;}
#okhttp3
-dontwarn okhttp3.**
-keep class okhttp3.** {*;}
-dontwarn okio.**
-keep class okio.** {*;}
#fastJson
-keep class javax.ws.rs.** { *; }
-dontwarn com.alibaba.fastjson.**
-keep class com.alibaba.fastjson.** { *; }
#支付宝支付
-keep class com.alipay.android.app.IAlixPay{*;}
-keep class com.alipay.android.app.IAlixPay$Stub{*;}
-keep class com.alipay.android.app.IRemoteServiceCallback{*;}
-keep class com.alipay.android.app.IRemoteServiceCallback$Stub{*;}
-keep class com.alipay.sdk.app.PayTask{ public *;}
-keep class com.alipay.sdk.app.AuthTask{ public *;}
-keep class com.alipay.sdk.app.H5PayCallback {
<fields>;
<methods>;
}
-keep class com.alipay.android.phone.mrpc.core.** { *; }
-keep class com.alipay.apmobilesecuritysdk.** { *; }
-keep class com.alipay.mobile.framework.service.annotation.** { *; }
-keep class com.alipay.mobilesecuritysdk.face.** { *; }
-keep class com.alipay.tscenter.biz.rpc.** { *; }
-keep class org.json.alipay.** { *; }
-keep class com.alipay.tscenter.** { *; }
-keep class com.ta.utdid2.** { *;}
-keep class com.ut.device.** { *;}
-dontwarn android.net.**
-keep class android.net.SSLCertificateSocketFactory{*;}
#方法数量超过64K
-keepattributes EnclosingMethod
#微信登录分享以及支付
-keep class com.tencent.mm.opensdk.** { *;}
-keep class com.tencent.wxop.** {*;}
-keep class com.tencent.mm.sdk.** {*;}
-dontwarn com.tencent.mm.**
-dontwarn com.tencent.wxop.stat.**
-keep class com.tencent.mm.** {*;}
-keep class com.tencent.wxop.stat.**{*;}
#litepal
-dontwarn org.litepal.*
-keep class org.litepal.** { *; }
-keep enum org.litepal.**
-keep interface org.litepal.** { *; }
-keep public class * extends org.litepal.**
-keepclassmembers enum * {
public static **[] values();
public static ** valueOf(java.lang.String);
}
#新浪微博
-keep class com.sina.weibo.sdk.* { *; }
-keep class android.support.v4.* { *; }
-keep class com.tencent.* { *; }
-keep class com.baidu.* { *; }
-keep class lombok.ast.ecj.* { *; }
-dontwarn android.support.v4.**
-dontwarn com.tencent.**s
-dontwarn com.baidu.**
#Rxandroid
-dontwarn sun.misc.**
-keepclassmembers class rx.internal.util.unsafe.*ArrayQueue*Field* {
long producerIndex;
long consumerIndex;
}
-keepclassmembers class rx.internal.util.unsafe.BaseLinkedQueueProducerNodeRef {
rx.internal.util.atomic.LinkedQueueNode producerNode;
}
-keepclassmembers class rx.internal.util.unsafe.BaseLinkedQueueConsumerNodeRef {
rx.internal.util.atomic.LinkedQueueNode consumerNode;
}
#友盟统计
# 友盟统计分析
-keepclassmembers class * { public <init>(org.json.JSONObject); }
-keepclassmembers enum com.umeng.analytics.** {
public static **[] values();
public static ** valueOf(java.lang.String);
}
-dontshrink
-dontoptimize
-dontwarn com.google.android.maps.**
-dontwarn android.webkit.WebView
-dontwarn com.umeng.**
-dontwarn com.tencent.weibo.sdk.**
-dontwarn com.facebook.**
-keep public class javax.**
-keep public class android.webkit.**
-dontwarn android.support.v4.**
-keep enum com.facebook.**
-keepattributes Exceptions,InnerClasses,Signature
-keepattributes *Annotation*
-keepattributes SourceFile,LineNumberTable
-keep public interface com.facebook.**
-keep public interface com.tencent.**
-keep public interface com.umeng.socialize.**
-keep public interface com.umeng.socialize.sensor.**
-keep public interface com.umeng.scrshot.**
-keep public class com.umeng.socialize.* {*;}
-keep class com.facebook.**
-keep class com.facebook.** { *; }
-keep class com.umeng.scrshot.**
-keep public class com.tencent.** {*;}
-keep class com.umeng.socialize.sensor.**
-keep class com.umeng.socialize.handler.**
-keep class com.umeng.socialize.handler.*
-keep class com.umeng.weixin.handler.**
-keep class com.umeng.weixin.handler.*
-keep class com.umeng.qq.handler.**
-keep class com.umeng.qq.handler.*
-keep class UMMoreHandler{*;}
-keep class com.tencent.mm.sdk.modelmsg.WXMediaMessage {*;}
-keep class com.tencent.mm.sdk.modelmsg.** implements com.tencent.mm.sdk.modelmsg.WXMediaMessage$IMediaObject {*;}
-keep class im.yixin.sdk.api.YXMessage {*;}
-keep class im.yixin.sdk.api.** implements im.yixin.sdk.api.YXMessage$YXMessageData{*;}
-keep class com.tencent.mm.sdk.** {
*;
}
-keep class com.tencent.mm.opensdk.** {
*;
}
-keep class com.tencent.wxop.** {
*;
}
-keep class com.tencent.mm.sdk.** {
*;
}
-dontwarn twitter4j.**
-keep class twitter4j.** { *; }
-keep class com.tencent.** {*;}
-dontwarn com.tencent.**
-keep class com.kakao.** {*;}
-dontwarn com.kakao.**
-keep public class com.umeng.com.umeng.soexample.R$*{
public static final int *;
}
-keep public class com.linkedin.android.mobilesdk.R$*{
public static final int *;
}
-keepclassmembers enum * {
public static **[] values();
public static ** valueOf(java.lang.String);
}
-keep class com.tencent.open.TDialog$*
-keep class com.tencent.open.TDialog$* {*;}
-keep class com.tencent.open.PKDialog
-keep class com.tencent.open.PKDialog {*;}
-keep class com.tencent.open.PKDialog$*
-keep class com.tencent.open.PKDialog$* {*;}
-keep class com.umeng.socialize.impl.ImageImpl {*;}
-keep class com.sina.** {*;}
-dontwarn com.sina.**
-keep class com.alipay.share.sdk.** {
*;
}
-keepnames class * implements android.os.Parcelable {
public static final ** CREATOR;
}
-keep class com.linkedin.** { *; }
-keep class com.android.dingtalk.share.ddsharemodule.** { *; }
-keepattributes Signature
#js互相调用
-keep class com.sweetorange.read.utils.WebViewSettingsUtils
#基本默认混淆
#代码混淆压缩比,在0~7之间,默认为5,
-optimizationpasses 5
# 指定不去忽略非公共库的类成员
-dontskipnonpubliclibraryclassmembers
-printmapping proguardMapping.txt
#不做预校验,preverify是proguard的四个步骤之一,Android不需要preverify,去掉这一步能够加快混淆速度。
-dontpreverify
-optimizations !code/simplification/cast,!field/*,!class/merging/*
-keepattributes *Annotation*,InnerClasses
-keepattributes Signature
-keepattributes SourceFile,LineNumberTable
#----------------------------------------------------------------------------
#---------------------------------默认保留区---------------------------------
-keep public class * extends android.app.Activity
-keep public class * extends android.app.Application
-keep public class * extends android.app.Service
-keep public class * extends android.content.BroadcastReceiver
-keep public class * extends android.content.ContentProvider
-keep public class * extends android.app.backup.BackupAgentHelper
-keep public class * extends android.preference.Preference
-keep public class * extends android.view.View
-keep public class com.android.vending.licensing.ILicensingService
-keep class android.support.** {*;}
# 保留继承的
-keep public class * extends android.support.v4.**
-keep public class * extends android.support.v7.**
-keep public class * extends android.support.annotation.**
-keep public class * extends android.view.View{
*** get*();
void set*(***);
public <init>(android.content.Context);
public <init>(android.content.Context, android.util.AttributeSet);
public <init>(android.content.Context, android.util.AttributeSet, int);
}
-keepclasseswithmembers class * {
public <init>(android.content.Context, android.util.AttributeSet);
public <init>(android.content.Context, android.util.AttributeSet, int);
}
-keepclassmembers class * implements java.io.Serializable {
static final long serialVersionUID;
private static final java.io.ObjectStreamField[] serialPersistentFields;
private void writeObject(java.io.ObjectOutputStream);
private void readObject(java.io.ObjectInputStream);
java.lang.Object writeReplace();
java.lang.Object readResolve();
}
# 保留R下面的资源
-keep class **.R$* {
*;
}
-keepclassmembers class * {
void *(**On*Event);
}
#---------------------------------webview------------------------------------
-keepclassmembers class fqcn.of.javascript.interface.for.Webview {
public *;
}
-keepclassmembers class * extends android.webkit.WebViewClient {
public void *(android.webkit.WebView, java.lang.String, android.graphics.Bitmap);
public boolean *(android.webkit.WebView, java.lang.String);
}
-keepclassmembers class * extends android.webkit.WebViewClient {
public void *(android.webkit.WebView, jav.lang.String);
}
以一种更酷的方式使用TextView
本文SpannableString已封装为libary上传github和jitpack,欢迎使用,地址:SpannableHelper
用法:
SpannableStringUtils spannableStringUtils = new SpannableStringUtils("飞流直下三千尺,疑是银河落九天");
spannableStringUtils.setColor(Color.GREEN, 2, 6)
.setBackGround(ContextCompat.getColor(this,R.color.bbb), 4, 8)
.setBold(6, 10)
.setOnClick(9, 14, ContextCompat.getColor(this,R.color.aaa))
.setImage(this, R.mipmap.ic_launcher, 3, 6, 120, 160)
.setOnClickSpanListener(new SpannableStringUtils.OnClickSpanListener() {
@Override
public void OnClickSpanListener() {
Toast.makeText(MainActivity.this, "点我", Toast.LENGTH_SHORT).show();
}
});
textView.setMovementMethod(LinkMovementMethod.getInstance());
textView.setTextSize(20);
textView.setText(spannableStringUtils);
使用google的瀑布流开源库--flexbox-layout
简介:
github地址如下:
使用
gridle添加依赖
compile ‘com.google.android:flexbox:0.3.0’
xml使用
<com.google.android.flexbox.FlexboxLayout
android:id="@+id/flexBoxLayout"
android:layout_width="match_parent"
android:layout_height="wrap_content"
app:alignContent="stretch"
app:alignItems="stretch"
app:flexDirection="row"
app:flexWrap="wrap"
app:justifyContent="flex_start"
app:showDividerHorizontal="beginning|middle">
</com.google.android.flexbox.FlexboxLayout>
关于android使用线程池记录一下
关于创建线程现在还在使用:
new Thread(new Runnable() {
@Override
public void run() {
Log.d(TAG,"asd")
}
}).start();
上面方法是有一些弊端:
- 每次new Thread都会新建对象。
- 线程没有统一管理,有可能会创建无数个线程,占用资源过多导致卡死,OOM
- 缺少一些特定功能,(定时,定期,执行和中断)等