-ccccccal

默默码码的copy-seven


  • 首页

  • 归档

  • 标签

  • 关于

  • 搜索

Retrofit 各个注解的使用

发表于 2019-03-02
* 请求方式有:
 * @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);

Rxjava2.0笔记-001-基本使用

发表于 2019-03-01

该笔记参考如下两篇博客
这可能是最好的RxJava 2.x 教程(完结版)
给初学者的RxJava2.0教程(一)

Demo地址,快快点我

阅读全文 »

android数据库GreenDao的使用

发表于 2019-02-19

GreenDao对象字段注释如下

项目地址 https://github.com/ALguojian/GreenDaoDemo

  • @Entity:告诉GreenDao该对象为实体,只有被@Entity注释的Bean类才能被dao类操作
  • @Id:对象的Id,使用Long类型作为EntityId,否则会报错。(autoincrement = true)表示主键会自增,如果false就会使用旧值
  • @Property:可以自定义字段名,注意外键不能使用该属性
  • @NotNull:属性不能为空
  • @Transient:使用该注释的属性不会被存入数据库的字段中
  • @Unique:该属性值必须在数据库中是唯一值
  • @Generated:编译后自动生成的构造函数、方法等的注释,提示构造函数、方法等不能被修改
阅读全文 »

android常用注解以及自定义注解替代枚举

发表于 2019-02-18

1. 自定义注解

/**
 * @author ALguojian
 * @date 2018/1/16
 * 自定义注解
 */
public interface UserType {

    String TOPIC = "topic";
    String ORIGIN = "origin";
    String MINI = "mini";

    @StringDef({TOPIC, ORIGIN, MINI})
    @Retention(RetentionPolicy.SOURCE)//指定注解仅存在与源码中,不加入到 class 文件中
    @interface Type {}
}
阅读全文 »

android有关gradle的一些配置

发表于 2019-02-14
gradle使用source set 的概念,一个source set就是一系列资源文件,其将会被便衣和执行,对于android项目,main就是一个source set,其包含了所有的资源文件,相对main测试文件test也是一个source set,只做测试

基础命令:

  • 查看gradle版本 gradlew -v
  • 查看所有可运行的tasksgradlew tasks
  • 清除目录下的output文件夹 gradlew clean
  • 打包编译, 包括debug和releasegradlew build
  • 编译并打Debug包 gradlew assembleDebug
  • 编译并打Release的包 gradlewassembleRelease
  • 只打包阿里release版本 gradlew assemblealiRelease
  • 关于多moudle gradlew :UpdateAppUtils:assembleDebug
  • 帮助 gradlew --help
  • 查看编译信息 gradlew build --info或–stacktrace
  • 制定module gradlew -p app build
阅读全文 »

项目用到的库以及配置的混淆文件

发表于 2019-02-12

//生命声明本地依赖
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);
}

泛型学习笔记

发表于 2019-02-10

简单实用

泛型就是参数化类型,可以将类型当作参数传递给一个类或者是方法。

public class Cache {
    Object value;

    public Object getValue() {
        return value;
    }

    public void setValue(Object value) {
        this.value = value;
    }
}
阅读全文 »

以一种更酷的方式使用TextView

发表于 2019-02-08

本文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

发表于 2019-02-07

简介:

github地址如下:

flexbox-layout

使用

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使用线程池记录一下

发表于 2019-02-03

关于创建线程现在还在使用:

new Thread(new Runnable() {

    @Override
    public void run() {
        Log.d(TAG,"asd")
    }
}).start();

上面方法是有一些弊端:

  • 每次new Thread都会新建对象。
  • 线程没有统一管理,有可能会创建无数个线程,占用资源过多导致卡死,OOM
  • 缺少一些特定功能,(定时,定期,执行和中断)等
阅读全文 »
1…345

alguojian

默默码码的copy-seven

47 日志
© 2020 alguojian
由 Hexo 强力驱动
|
主题 — NexT.Pisces v5.1.4