Giter Site home page Giter Site logo

tamicer / novate Goto Github PK

View Code? Open in Web Editor NEW
1.4K 54.0 275.0 4.07 MB

A safety client by Https for android, (Android网络框架,基于Retrofit和RxJava打造的链式网络库, 支持okhttp的调用风格,又兼容Retrofit API,并支持rxJava链式操作)

License: Apache License 2.0

Java 100.00%
rxjava retrofit okhttp3 https android

novate's Introduction

Novate

  a safety Framework by OkHttp for Android, (一款Android网络框架,基于Retrofit和RxJava打造的链式网络库, 强大的泛型解析功能和错误驱动功能,支持okhttp的调用风格,又兼容Retrofit注解方式,并支持rxJava链式操作。方便扩展,并能实现高速加载)

Summary

  • Join based API, reduce API redundancy
  • Offline caching
  • Support a variety of ways to access the network (a get, put, post, delete)
  • Support file download and upload
  • Unified support request header to join
  • The unity of the support to return the result
  • Support custom extensions API
  • Support the unified request access to the network flow control

#dependencies

Eclipse:

Download the laster JAR:( com.tamic.novate:novate:-1.x.aar)

copy to libs dirPath!

AS Gradle:  

  • root:

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

     Gradle < 2.1
          dependencies {
             compile 'com.tamic.novate:novate:1.5.5'
          }
          
    Gradle > 2.1
          
         plugins {
            id "com.tamic.novate:novate "1.5.5"
         } 

Snapshots of the development version are available in Sonatype's snapshots repository.

Retrofit requires at minimum Java 7 or Android 2.3.

Laster vension: https://bintray.com/neglectedbyboss/maven/Novate 最新版本点击去查询

加入权限

<uses-permission android:name="android.permission.INTERNET" />
    <uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
    <uses-permission android:name="android.permission.READ_PHONE_STATE" />
    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
    <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
    

混淆  

 -keep class com.tamic.novate.** {*;}

中文文档

基于Retrofit和RxJava封装的链式网络库, 支持okhttp的调用分格,又兼容Retrofit注入方式,并支持RxJava调用的链式操作, 不仅支持开发者自己扩展,还沿用Okhttp的高效的网络加载!最重要的novate自带的异常驱动机制,帮开发者解决了绝大部分的异常  错误处理,减少API或者业务代码出错的导致崩溃概率。   为何起名 Novate?

Novate 的英文原意是用新事物代替 目的是用新的东西来代替Retrofit的有些不易操作的地方,因此起名新奇的东西,所以结合了原来的Http用法习惯,又加入了Retrofit的特性,因此起名 :Novate,LOGO也是加速的意思,本框架提供了一种封装架构思路,如果不喜欢本设计思路的朋友可以直接拿源码修改扩展。

功能

  • 优化设计:加入基础API,减少Api冗余
  • 强大的缓存模式: 支持离线缓存, 无网络智能加载缓存,可配置是否需要缓存
  • cookie管理:自带cookie管理机制
  • 全方位请求模式:支持多种方式访问网络(get,put, post ,delete)
  • 轻送调用:支持表单,图文一起,json上传。
  • 文件传输:支持文件下载和上传,支持进度
  • 动态添加:支持请求头和参数统一添加,分别添加。
  • 结果处理:支持对返回结果的统一处理,自动帮你序列化复杂的数据。
  • 扩展性强:支持自定义的Retrofit的API,默认Api无法满足时可自定义自己的Service
  • 悠雅方便:支持统一请求访问网络的流程控制,以方便帮你完美加入Processbar进度。
  • RxJava结合: 结合RxJava,线程智能控制

  请求网络无需关心是否在主线程和非UI线程,操作UI直接可在回调处理, 保留了HttpClient的编码习惯,又加入了Builder模式编程!

Update Log  

更新历史请看:https://github.com/Tamicer/Novate/releases

#License

   Copyright 2016 Tamic, Inc.

Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at

   http://www.apache.org/licenses/LICENSE-2.0

Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.   

更多介绍:https://tamicer.github.io/2016/08/10/novate10/

技术交流QQ群: 458542940

novate's People

Contributors

tamicer avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

novate's Issues

类型转换失败

我使用Retrofit注解方式写接口,然后第一个回调bean成功,然而第二个回调string出现转换失败,分别用了call的两个方法.
image
image
image

服务端返回数据格式异常

您好,使用executeGet会提示以上异常,使用get请求就不会,是executeGet有默认的数据格式吗?怎么去掉?

confused

very CONFUSED about what the advantage it is!
I lose the ability to combined thread!

生命周期问题

请问没有考虑到过不绑定生命周期出现内存泄露的问题么,还有okhttp默认是不支持post缓存的。

源码

请问大神,判断token过期之后跳转登录界面,这个逻辑在哪写比较好

类型转换出错Application cannot be cast to android.app.Activity

无网络时,缓存拦截器(CaheInterceptor)报错
((Activity) context).runOnUiThread(new Runnable() {
@OverRide
public void run() {
Toast.makeText(context, R.string.load_cache, Toast.LENGTH_SHORT).show();
}
});

原因:由于mContext在Builder的build()中被转为Application
/** set Context. */
mContext = context.getApplicationContext();
导致Novate在addCache时new CaheInterceptor(mContext, cacheControlValue);传入了Application报错

有两个问题,请教。

1.每次都需要new Novate.Builder(this);为什么不在application里面进行统一初始化呢?感觉这样简便一些。
2.封装的很好,很简洁,问题来了,怎么做链式请求呢?
有时间给个回复哦,支持你。

使用当前库download方法的下载,出现问题

我在下载文件后缀名是.mei文件的时候,点击下载报错
FATAL EXCEPTION: RxIoScheduler-2
Process: com.hxlm.leying, PID: 25979
java.lang.IllegalStateException: Fatal Exception thrown on Scheduler.Worker thread.
at rx.internal.schedulers.ScheduledAction.run(ScheduledAction.java:62)
at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:422)
at java.util.concurrent.FutureTask.run(FutureTask.java:237)
at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.access$201(ScheduledThreadPoolExecutor.java:152)
at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.run(ScheduledThreadPoolExecutor.java:265)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1112)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:587)
at java.lang.Thread.run(Thread.java:818)
Caused by: rx.exceptions.OnErrorFailedException: Error occurred when trying to propagate error to Observer.onError
at rx.observers.SafeSubscriber._onError(SafeSubscriber.java:192)
at rx.observers.SafeSubscriber.onError(SafeSubscriber.java:120)
at rx.exceptions.Exceptions.throwOrReport(Exceptions.java:204)
at rx.observers.SafeSubscriber.onNext(SafeSubscriber.java:144)
at rx.internal.operators.OperatorOnErrorResumeNextViaFunction$4.onNext(OperatorOnErrorResumeNextViaFunction.java:154)
at rx.internal.operators.OperatorObserveOn$ObserveOnSubscriber.call(OperatorObserveOn.java:227)
at rx.internal.schedulers.CachedThreadScheduler$EventLoopWorker$1.call(CachedThreadScheduler.java:220)
at rx.internal.schedulers.ScheduledAction.run(ScheduledAction.java:55)
at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:422) 
at java.util.concurrent.FutureTask.run(FutureTask.java:237) 
at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.access$201(ScheduledThreadPoolExecutor.java:152) 
at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.run(ScheduledThreadPoolExecutor.java:265) 
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1112) 
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:587) 
at java.lang.Thread.run(Thread.java:818) 
Caused by: rx.exceptions.CompositeException: 2 exceptions occurred.
at rx.observers.SafeSubscriber._onError(SafeSubscriber.java:192) 
at rx.observers.SafeSubscriber.onError(SafeSubscriber.java:120) 
at rx.exceptions.Exceptions.throwOrReport(Exceptions.java:204) 
at rx.observers.SafeSubscriber.onNext(SafeSubscriber.java:144) 
at rx.internal.operators.OperatorOnErrorResumeNextViaFunction$4.onNext(OperatorOnErrorResumeNextViaFunction.java:154) 
at rx.internal.operators.OperatorObserveOn$ObserveOnSubscriber.call(OperatorObserveOn.java:227) 
at rx.internal.schedulers.CachedThreadScheduler$EventLoopWorker$1.call(CachedThreadScheduler.java:220) 
at rx.internal.schedulers.ScheduledAction.run(ScheduledAction.java:55) 
at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:422) 
at java.util.concurrent.FutureTask.run(FutureTask.java:237) 
at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.access$201(ScheduledThreadPoolExecutor.java:152) 
at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.run(ScheduledThreadPoolExecutor.java:265) 
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1112) 
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:587) 
at java.lang.Thread.run(Thread.java:818) 
Caused by: rx.exceptions.CompositeException$CompositeExceptionCausalChain: Chain of Causes for CompositeException In Order Received =>
at android.util.Log.getStackTraceString(Log.java:330)
at com.android.internal.os.RuntimeInit.Clog_e(RuntimeInit.java:59)
at com.android.internal.os.RuntimeInit.access$200(RuntimeInit.java:43)
at com.android.internal.os.RuntimeInit$UncaughtHandler.uncaughtException(RuntimeInit.java:85)
at java.lang.ThreadGroup.uncaughtException(ThreadGroup.java:693)
at java.lang.ThreadGroup.uncaughtException(ThreadGroup.java:690)
at rx.internal.schedulers.ScheduledAction.run(ScheduledAction.java:66)
at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:422) 
at java.util.concurrent.FutureTask.run(FutureTask.java:237) 
at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.access$201(ScheduledThreadPoolExecutor.java:152) 
at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.run(ScheduledThreadPoolExecutor.java:265) 
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1112) 
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:587) 
at java.lang.Thread.run(Thread.java:818) 
Caused by: java.lang.NullPointerException: Attempt to invoke virtual method 'java.lang.String okhttp3.MediaType.toString()' on a null object reference
at com.tamic.novate.download.NovateDownLoadManager.writeResponseBodyToDisk(NovateDownLoadManager.java:84)
at com.tamic.novate.download.DownSubscriber.onNext(DownSubscriber.java:73)
at com.tamic.novate.download.DownSubscriber.onNext(DownSubscriber.java:30)
at rx.observers.SafeSubscriber.onNext(SafeSubscriber.java:139)
at rx.internal.operators.OperatorOnErrorResumeNextViaFunction$4.onNext(OperatorOnErrorResumeNextViaFunction.java:154)
at rx.internal.operators.OperatorObserveOn$ObserveOnSubscriber.call(OperatorObserveOn.java:227)
at rx.internal.schedulers.CachedThreadScheduler$EventLoopWorker$1.call(CachedThreadScheduler.java:220)
at rx.internal.schedulers.ScheduledAction.run(ScheduledAction.java:55)
at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:422) 
at java.util.concurrent.FutureTask.run(FutureTask.java:237) 
at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.access$201(ScheduledThreadPoolExecutor.java:152) 
at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.run(ScheduledThreadPoolExecutor.java:265) 
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1112) 
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:587) 
at java.lang.Thread.run(Thread.java:818) 
Caused by: android.view.ViewRootImpl$CalledFromWrongThreadException: Only the original thread that created a view hierarchy can touch its views.
at android.view.ViewRootImpl.checkThread(ViewRootImpl.java:6254)
at android.view.ViewRootImpl.requestLayout(ViewRootImpl.java:867)
at android.view.View.requestLayout(View.java:17372)
at android.view.View.requestLayout(View.java:17372)
at android.view.View.requestLayout(View.java:17372)
at android.view.View.requestLayout(View.java:17372)
at android.view.View.requestLayout(View.java:17372)
at android.view.View.requestLayout(View.java:17372)
at android.view.View.requestLayout(View.java:17372)
at android.view.View.requestLayout(View.java:17372)
at android.support.v7.widget.RecyclerView.requestLayout(RecyclerView.java:3080)
at android.support.v7.widget.RecyclerView$RecyclerViewDataObserver.onChanged(RecyclerV)

不知道什么原因造成,请有时间看看,多谢

混淆问题

novate

-keep class com.tamic.novate.** {*;}

picasso

-dontwarn com.squareup.okhttp.**

报错
qq 20171110092916

代码

请问一下这个库代码没有开源是吧

what?

类库没开源的嘛。只会用学不到东西的。

多文件上传有问题

demo中调用performUpLoadFlies()方法报错
java.lang.IllegalArgumentException: @PartMap values cannot be MultipartBody.Part. Use @part List or a different value type instead. (parameter #2)
for method BaseApiService.uploadFlieWithPartMap

建造者模式很好,但是我有些问题

final Observable.Transformer schedulersTransformer = new Observable.Transformer() {       @Override        public Object call(Object observable) {            return ((Observable) observable).subscribeOn(Schedulers.io())                  .unsubscribeOn(Schedulers.io())                   .observeOn(AndroidSchedulers.mainThread());       }    };

这个转义器最好改下,我做了以下修改不知道对不对,请您看下

Observable.Transformer<T, T> schedulersTransformer() {
return new Observable.Transformer<T, T>() {
@OverRide
public Observable call(Observable observable) {
return observable.subscribeOn(Schedulers.io())
.unsubscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread());
}
};
}
这样更改以后再Observe的时候不会出现数据检查的lint警告

设置readTimeOut

你好, 请问一下怎样可以设置Builder 的readTimeOut? 我只找到了connectTimeOut 和writeTimeOut

log输出问题

在回调中不输出系统的Log,这个有什么限制吗

问下为什么使用Novate下载文件的时候

问下为什么使用Novate下载文件的时候,用DownLoadCallBack方法,点击下载后,会经过一段时间后才开始有进度显示,为什么啊!是我写的不对吗!求指教
DownLoadCallBack downLoadCallBack = new DownLoadCallBack() {
@OverRide
public void onError(Throwable e) {
NovateRestponse.doFailure(e.getCode(), e.getMessage(), listener);
}

        @Override
        public void onProgress(String key, int progress, long fileSizeDownloaded, long totalSize) {
            super.onProgress(key, progress, fileSizeDownloaded, totalSize);
           showLoadingDialog( progress+"%");
        }

        @Override
        public void onSucess(String key, String path, String name, long fileSize) {
            listener.onSuccess(path);
        }
    };
    Map<String, Object> headers = requestHeader();

new Novate.Builder(KJActivityStack.create().topActivity())
// .addHeader(headers) //添加公共请求头
// .addParameters(parameters)//公共参数
.connectTimeout(120) //连接时间 可以忽略
.writeTimeout(100)
.addCookie(false) //是否同步cooike 默认不同步
.addCache(isCache) //是否缓存 默认缓存
// .addCache(new Cache(FileUtils.getSaveFolder(StringConstants.CACHEPATH), StringConstants.CACHE_SIZE)) //自定义缓存
.baseUrl(baseUrl) //base URL
.addLog(true); //是否开启log
.addHeader(headers)
.build()
.download(null,updateAppUrl,FileUtils.getSaveFolder(StringConstants.DOWNLOADPATH).getAbsolutePath() + "/",, + "a.apk", downLoadCallBack);

下载文件时文件夹DownLoads文件夹创建不成功导致无法下载 具体看下面的类!!!!!

NovateDownLoadManager 类里
第100行 :if (path == null) {
path = context.getExternalFilesDir(null) + File.separator +"DownLoads" + File.separator;
}
修改为:
if (path == null) {
File filepath=new File(path = context.getExternalFilesDir(null) + File.separator +"DownLoads");
if (!filepath.exists()){
filepath.mkdirs();
}
path = context.getExternalFilesDir(null) + File.separator +"DownLoads" + File.separator;
}

报错

android:allowBackup="false"的时候无法使用compile引入库文件

添加网络拦截器,提示HTTP 400

public class LoggingInterceptor implements Interceptor {

@Override
public Response intercept(Chain chain) throws IOException {

    Request orgRequest = chain.request();

    if (orgRequest.method().equals("POST")) {
        RequestBody body = orgRequest.body();

        if (body instanceof FormBody) {
            FormBody.Builder bodyBuilder = new FormBody.Builder();
            FormBody formBody = (FormBody) body;

            //把原来的参数添加到新的构造器,(因为没找到直接添加,所以就new新的)
            for (int i = 0; i < formBody.size(); i++) {
                bodyBuilder.addEncoded(formBody.encodedName(i), formBody.encodedValue(i));
            }

            formBody = bodyBuilder
                    .addEncoded("token", EasyShopApplication.getInstance().mUser.getToken())
                    .build();

            orgRequest = orgRequest.newBuilder().post(formBody).build();
        }
    }

    return chain.proceed(orgRequest);
}

}

对于Retrofit2解析数组

就是我之的数据{
"code": 1200,
"message": "数据获取成功",
"data": {
"curPage": 1,
"pageSize": 10,
"list": [
{
"product_id": "152",
"image": "http://www.cnyouyao.com/image/cache/placeholder-270x340.png",
"name": "人参",
"price": "¥5.00",
"special": "暂无特价",
"allSales": 9
},
{
"product_id": "161",
"image": "http://www.cnyouyao.com/image/cache/placeholder-270x340.png",
"name": "刺五加",
"price": "¥10.00",
"special": "暂无特价",
"allSales": 5
},
{
"product_id": "86",
"image": "http://www.cnyouyao.com/image/cache/placeholder-270x340.png",
"name": "木贼",
"price": "¥17.00",
"special": "暂无特价",
"allSales": 0
},
{
"product_id": "139",
"image": "http://www.cnyouyao.com/image/cache/placeholder-270x340.png",
"name": "木蝴蝶",
"price": "¥15.00",
"special": "暂无特价",
"allSales": 0
},
{
"product_id": "191",
"image": "http://www.cnyouyao.com/image/cache/placeholder-270x340.png",
"name": "龙眼肉",
"price": "¥15.00",
"special": "暂无特价",
"allSales": 0
},
{
"product_id": "219",
"image": "http://www.cnyouyao.com/image/cache/placeholder-270x340.png",
"name": "柏子仁",
"price": "¥11.00",
"special": "暂无特价",
"allSales": 0
},
{
"product_id": "220",
"image": "http://www.cnyouyao.com/image/cache/placeholder-270x340.png",
"name": "远志",
"price": "¥13.00",
"special": "暂无特价",
"allSales": 0
},
{
"product_id": "222",
"image": "http://www.cnyouyao.com/image/cache/placeholder-270x340.png",
"name": "首乌藤",
"price": "¥20.00",
"special": "暂无特价",
"allSales": 0
},
{
"product_id": "223",
"image": "http://www.cnyouyao.com/image/cache/placeholder-270x340.png",
"name": "灵芝",
"price": "¥50.00",
"special": "暂无特价",
"allSales": 0
},
{
"product_id": "319",
"image": "http://www.cnyouyao.com/image/cache/placeholder-270x340.png",
"name": "木香",
"price": "¥21.00",
"special": "暂无特价",
"allSales": 0
}
]
}
}
就是这种类型解析的时候总是报java.lang.IllegalStateException: Expected BEGIN_OBJECT but was STRING at line 1 column 1 path $异常求解决!

Query map was null.?

java.lang.IllegalStateException: Fatal Exception thrown on Scheduler.Worker thread.
at rx.internal.schedulers.ScheduledAction.run(ScheduledAction.java:62)
at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:428)
at java.util.concurrent.FutureTask.run(FutureTask.java:237)
at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.run(ScheduledThreadPoolExecutor.java:272)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1133)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:607)
at java.lang.Thread.run(Thread.java:776)
Caused by: java.lang.NoClassDefFoundError: Failed resolution of: Lokhttp3/internal/Platform;
at okhttp3.logging.HttpLoggingInterceptor$Logger$1.log(HttpLoggingInterceptor.java:112)
at okhttp3.logging.HttpLoggingInterceptor.intercept(HttpLoggingInterceptor.java:160)
at okhttp3.internal.http.RealInterceptorChain.proceed(RealInterceptorChain.java:92)
at okhttp3.internal.connection.ConnectInterceptor.intercept(ConnectInterceptor.java:45)
at okhttp3.internal.http.RealInterceptorChain.proceed(RealInterceptorChain.java:92)
at okhttp3.internal.http.RealInterceptorChain.proceed(RealInterceptorChain.java:67)
at okhttp3.internal.cache.CacheInterceptor.intercept(CacheInterceptor.java:93)
at okhttp3.internal.http.RealInterceptorChain.proceed(RealInterceptorChain.java:92)
at okhttp3.internal.http.RealInterceptorChain.proceed(RealInterceptorChain.java:67)
at okhttp3.internal.http.BridgeInterceptor.intercept(BridgeInterceptor.java:93)
at okhttp3.internal.http.RealInterceptorChain.proceed(RealInterceptorChain.java:92)
at okhttp3.internal.http.RetryAndFollowUpInterceptor.intercept(RetryAndFollowUpInterceptor.java:120)
at okhttp3.internal.http.RealInterceptorChain.proceed(RealInterceptorChain.java:92)
at okhttp3.internal.http.RealInterceptorChain.proceed(RealInterceptorChain.java:67)
at com.tamic.novate.CacheInterceptorOffline.intercept(CacheInterceptorOffline.java:69)
at okhttp3.internal.http.RealInterceptorChain.proceed(RealInterceptorChain.java:92)
at okhttp3.internal.http.RealInterceptorChain.proceed(RealInterceptorChain.java:67)
at com.tamic.novate.BaseInterceptor.intercept(BaseInterceptor.java:53)
at okhttp3.internal.http.RealInterceptorChain.proceed(RealInterceptorChain.java:92)
at okhttp3.internal.http.RealInterceptorChain.proceed(RealInterceptorChain.java:67)
at com.tamic.novate.BaseInterceptor.intercept(BaseInterceptor.java:53)
at okhttp3.internal.http.RealInterceptorChain.proceed(RealInterceptorChain.java:92)
at okhttp3.internal.http.RealInterceptorChain.proceed(RealInterceptorChain.java:67)
at okhttp3.RealCall.getResponseWithInterceptorChain(RealCall.java:179)
at okhttp3.RealCall.execute(RealCall.java:63)
at retrofit2.OkHttpCall.execute(OkHttpCall.java:174)
at retrofit2.adapter.rxjava.RxJavaCallAdapterFactory$CallOnSubscribe.call(RxJavaCallAdapterFactory.java:111)
at retrofit2.adapter.rxjava.RxJavaCallAdapterFactory$CallOnSubscribe.call(RxJavaCallAdapterFactory.java:92)
at rx.internal.operators.OnSubscribeLift.call(OnSubscribeLift.java:50)
at rx.internal.operators.OnSubscribeLift.call(OnSubscribeLift.java:30)
at rx.internal.operators.OnSubscribeLift.call(OnSubscribeLift.java:50)
at rx.internal.operators.OnSubscribeLift.call(OnSubscribeLift.java:30)
at rx.Observable.unsafeSubscribe(Observable.java:8666)
at rx.internal.operators.OperatorSubscribeOn$1.call(OperatorSubscribeOn.java:94)
at rx.internal.schedulers.CachedThreadScheduler$EventLoopWorker$1.call(CachedThreadScheduler.java:220)
at rx.internal.schedulers.ScheduledAction.run(ScheduledAction.java:55)
at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:428) 
at java.util.concurrent.FutureTask.run(FutureTask.java:237) 
at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.run(ScheduledThreadPoolExecutor.java:272) 
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1133) 
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:607) 
at java.lang.Thread.run(Thread.java:776) 
05-18 15:49:28.894 14793-14954/com.lhdd.reading4 E/AndroidRuntime: Caused by: java.lang.ClassNotFoundException: Didn't find class "okhttp3.internal.Platform" on path: DexPathList[[zip file "/data/app/com.lhdd.reading4-1/base.apk"],nativeLibraryDirectories=[/data/app/com.lhdd.reading4-1/lib/arm64, /data/app/com.lhdd.reading4-1/base.apk!/lib/arm64-v8a, /system/lib64, /vendor/lib64, /system/vendor/lib64, /product/lib64]]
at dalvik.system.BaseDexClassLoader.findClass(BaseDexClassLoader.java:56)
at java.lang.ClassLoader.loadClass(ClassLoader.java:380)
at java.lang.ClassLoader.loadClass(ClassLoader.java:312)
... 42 more

下载文件时回调依旧很慢

String downUrl = "http://imtt.dd.qq.com/16891/D04C035E7C2F3DBCA60A29BCD8C791A8.apk?fsname=com.tencent.mobileqq_7.2.0_730.apk";
novate.download(downUrl, "test.mei", new DownLoadCallBack() {

        @Override
        public void onStart(String s) {
            super.onStart(s);

            btn_download.setText("DownLoad cancel");
            showPressDialog();
        }

        @Override
        public void onError(Throwable e) {
            Toast.makeText(ExempleActivity.this, "onError:" + e.getMessage(), Toast.LENGTH_SHORT).show();
        }

        @Override
        public void onProgress(String key, int progress, long fileSizeDownloaded, long totalSize) {
            super.onProgress(key, progress, fileSizeDownloaded, totalSize);
            Log.v("test", fileSizeDownloaded + "");
            //Toast.makeText(ExempleActivity.this, "progress: " + progress + "   download: " + fileSizeDownloaded, Toast.LENGTH_SHORT).show();
            updateProgressDialog(progress);

        }

        @Override
        public void onSucess(String key, String path, String name, long fileSize) {
            Toast.makeText(ExempleActivity.this, "download  onSucess", Toast.LENGTH_SHORT).show();
            dismissProgressDialog();
        }

        @Override
        public void onCancel() {
            super.onCancel();
            dismissProgressDialog();
        }

    });

用的是excemple里面的例子只是把下载地址换了一下,发现下载时,进度条不会很长一段时间不会变动

executePost此方法似乎不管用?

01-14 11:02:27.863 29058-29058/com.tamic.excemple D/OkHttp: ResponseBody:{
"returnCode" : "SUCCESS",
"userId" : 120434,
"accountType" : "PRE_PAID_ADVERTISER"
}
01-14 11:02:27.866 29058-29058/com.tamic.excemple V/Novate: web :1>>>>>>>>>>>>isOk:true
01-14 11:02:27.867 29058-29058/com.tamic.excemple I/djl: djl null

okhttp已经返回了json数据,但是demo的onSuccee返回的数据是null。
请问怎么回事呢?

post请求缓存

当无网络或者网络异常时,希望post请求能够返回最近一次的缓存,这样增加用户体验

请问下返回bean怎么使用 ,,,,

返回Bean

novate.rxPost("http://xxxxxxx/login/xxxx", parameters, object : RxResultCallback() {
override fun onCancel(tag: Any?, e: Throwable?) {

            }

            override fun onStart(tag: Any?) {
                super.onStart(tag)
            }

            override fun onNext(tag: Any?, call: Call?, response: LoginBean?) {
                super.onNext(tag, call, response)
                Log.e("TAG", call.toString()+"登录返回--->" + response?.data?.name)
            }

            override fun onNext(tag: Any?, code: Int, message: String?, response: LoginBean?) {
                Log.e("TAG", call.toString()+"登录返回--->" + response?.data?.name)
            }

            override fun onError(tag: Any?, e: Throwable?) {

            }



        })

我这样用了,onNext里的bean都是null、字串实体类都对应的,不知道什么情况

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.