Coder Social home page Coder Social logo

rxjavaretrofitdemo-master's Introduction

Retrofit+Rxjava+okhttp封装

Preview

    1.Retrofit+Rxjava+okhttp基本使用方法
    2.统一处理请求数据格式
    3.统一的ProgressDialog和回调Subscriber处理
    4.取消http请求
    5.预处理http请求
    6.返回数据的统一判断
    7.失败后的retry处理
    8.RxLifecycle管理生命周期,防止泄露
    9.文件上传下载(支持多文件,断点续传)
    10.Cache数据持久化和数据库(greenDao)两种缓存机制

依赖工程

  • 1.moudel导入工程
  compile project(':rxretrofitlibrary')
  • 2.初始化设置:Application中初始化
RxRetrofitApp.init(this);

代码使用

更多用法请参考demo

    //    完美封装简化版
    private void simpleDo() {
          SubjectPost postEntity = new SubjectPost(simpleOnNextListener,this);
          postEntity.setAll(true);
          HttpManager manager = HttpManager.getInstance();
          manager.doHttpDeal(postEntity);
    }

    //   回调一一对应
    HttpOnNextListener simpleOnNextListener = new HttpOnNextListener<List<Subject>>() {
        @Override
        public void onNext(List<Subject> subjects) {
            tvMsg.setText("已封装:\n" + subjects.toString());
        }

        /*用户主动调用,默认是不需要覆写该方法*/
        @Override
        public void onError(Throwable e) {
            super.onError(e);
            tvMsg.setText("失败:\n" + e.toString());
        }
    }
  • 初始化一个请求数据的对象继承BaseEntity对象,传递一个sub回调对象和context对象,设置请求需要的参数
  • 通过单利获取一个httpmanger对象,触发请求
  • 结果统一通过BaseEntity中的fun1方法判断,最后返回传递的sub对象中

变种-推荐使用

在之前的封装1-5中我们都是通过传统的GsonConverterFactory自动解析,这样做确实很方便,用户能直接获取返回的对象,不用关心具体的转换,但是:这随之而来有很多的缺陷(虽然官网推荐这样使用); 比如:无法使用其他第三发转换框架;泛型无法中间传递,封装无法统一处理缓存结果;回调信息无法统一处理.......... 所以我们在享受它遍历的同时也被迫的要限制做很多的处理,限制我们的扩展! 介绍如何放弃GsonConverterFactory,直接返回String,扩展我们的封装!(封装的整体**和之前的封装一样,所以不会有大的改动!)

Rxjava+ReTrofit+okHttp深入浅出-终极封装变种

Rxjava+ReTrofit+okHttp极简方式使用-无需任何学习成本

思路

详细思路可以可以参看我的博客: Rxjava+ReTrofit+okHttp深入浅出-终极封装

问题反馈列表集合

问题反馈列表集合-汇总解决

QQ交流群

rxjavaretrofitdemo-master's People

Contributors

wzgiceman 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

rxjavaretrofitdemo-master's Issues

CookieDbUtil的单例模式

CookieDbUtil类创建单例时:
synchronized (HttpDownManager.class)
是不是应该改成
synchronized (CookieDbUtil.class)

界面卡顿

滚动列表时如果进度状态发生改变,有时会卡顿。 点击下载按钮后,滑动有时也会卡顿

希望赐予思路

我们请求参数都是用jsonRequest,这样就要用到RequestBody ,不同模块不同的service,这样没办法把请求参数写在baseApi里...如果要用你的框架封装,有什么思路可以指导的吗?谢谢

下载功能

下载器 :正在下载的任务返回到上层, 再进去 进度条又从0开始 而实际上 后台还在继续下载过程中

在Fragment中如何获取RxAppCompatActivity

public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
SubjectPostApi postEntity = new SubjectPostApi(simpleOnNextListener, (RxAppCompatActivity) getActivity());
}

保持登录

请问一下怎么用cookie保存登录状态啊

项目运行不起来

Error:(36, 9) 错误: 找不到符号
符号: 方法 setMothed(String)
位置: 类 SubjectPostApi
Error:(27, 9) 错误: 找不到符号
符号: 方法 setMothed(String)
位置: 类 UploadApi

报错了

Process: com.example.retrofit, PID: 25643
java.lang.IllegalStateException: Fatal Exception thrown on Scheduler.Worker thread.
at rx.internal.schedulers.ScheduledAction.run(ScheduledAction.java:59)
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:841)
Caused by: java.lang.NoClassDefFoundError: okhttp3.internal.http.HttpEngine
at okhttp3.logging.HttpLoggingInterceptor.intercept(HttpLoggingInterceptor.java:219)
at okhttp3.internal.http.RealInterceptorChain.proceed(RealInterceptorChain.java:92)
at okhttp3.internal.http.RealInterceptorChain.proceed(RealInterceptorChain.java:67)
at com.wzgiceman.rxretrofitlibrary.retrofit_rx.http.cookie.CookieInterceptor.intercept(CookieInterceptor.java:36)
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)

ProgressSubscriber添加取消监听

ProgressSubscriber类中ProgressDialog取消监听中是否需要增加回调,这样在监听中就可以监听到取消事件

 private void initProgressDialog(boolean cancel) {
        Context context = mActivity.get();
        if (pd == null && context != null) {
            pd = new ProgressDialog(context);
            pd.setCancelable(cancel);
            if (cancel) {
                pd.setOnCancelListener(new DialogInterface.OnCancelListener() {
                    @Override
                    public void onCancel(DialogInterface dialogInterface) {
                        if (mSubscriberOnNextListener.get() != null) {
                            mSubscriberOnNextListener.get().onCancel();
                        }
                        onCancleProgress();
                    }
                });
            }
        }
    }

多任务断点续传下载

点击多任务断点续传下载,在新的页面里面点击下载,提示:失败:retorfit2.adapter.rxjava.HttpException:HTTP404 Not Found。
这个怎么处理哈~

Greendao problems

Thanks for sharing the author found a problem when I tried it, and find the reasonAnd you said hereGreendao database problem into the first data no problem to insert the second report abnormal dataAndroid. Database. Sqlite. SQLiteConstraintException: PRIMARY KEY must be unique (code 19) see this exception I think is a problem of the PRIMARY KEY.And when I tried it is not, so I found type is not corresponding to check the source code.So he changed the CookieResulte id type from long to Long after see the source is a non-empty judgment judge normal should set id for self growth

thanks

内存溢出问题

public void doHttpDeal(BaseApi basePar) {
/链接式对象返回/
SoftReference httpOnNextListener = basePar.getListener();
if (httpOnNextListener != null && httpOnNextListener.get() != null) {
httpOnNextListener.get().onNext(observable);
}

    /*数据回调*/
    observable.subscribe(subscriber);
}

每次的网络请求都会产生一次订阅关系,如何才能使接口回调回来后,取消本次订阅?

代码使用的介绍有错误

  • 初始化一个请求数据的对象继承BaseEntity对象(应该是BaseApi),传递一个sub回调对象和context对象,设置请求需要的参数
  • 通过单利(单例)获取一个httpmanger对象,触发请求
  • 结果统一通过BaseEntity中的fun1方法判断,最后返回传递的sub对象中(代码中没有fun1方法,只有Func1这个接口)

文字错误,改一下避免对读者造成不必要的困扰~

多任务断点下载中如何暂停正在下载的任务

在HttpDownManager的108行,AppUtil.writeCache(responseBody,new File(info.getSavePath()),info);进行了下载读写操作,此处的responseBody.byteStream()为一个输入流,在writeCache方法中进行while循环读

点击按钮暂停时在pause方法中调用了subscriber.unsubscribe();
我的疑问是如果writeCache中正在进行while读,调用unsubscribe是如何中断下载的?望给予指导,谢谢

在6.0或以上系统中,下载完10秒内安装,解析包错误

如题,6.0系统 或者6.0以上,下载完全后,
progressListener.update 回调返回 done 为true,然后调代码进行安装应用,报错解析包错误。
或者,下载完成后,手动到sd卡,点击下载的apk进行安装,也是解析包错误。
下载完成,等待个10秒左右,手动或者代码 安装,却又能正常进行安装了。

难道是我错了?

不同的接口,是不是都得继承BaseApi单独写个啊~然后才是请求三部曲

如果有两个请求 而且setCach 都设置为true , 在第一个请求完成后,在进行第二个请求, 第二个请求则会出错

如果有两个请求 而且setCach 都设置为true , 在第一个请求完成后,在进行第二个请求, 第二个请求则会出错

报错如下
02-15 18:00:10.350 11646-14550/? D/OkHttp: <-- HTTP FAILED: android.database.sqlite.SQLiteConstraintException: UNIQUE constraint failed: COOKIE_RESULTE._id (code 1555)
02-15 18:00:10.350 11646-14550/? D/OkHttp: #################################################################
02-15 18:00:10.350 11646-14550/? D/OkHttp: Error Code : 1555 (SQLITE_CONSTRAINT_PRIMARYKEY)
02-15 18:00:10.350 11646-14550/? D/OkHttp: Caused By : Abort due to constraint violation.
02-15 18:00:10.350 11646-14550/? D/OkHttp: (UNIQUE constraint failed: COOKIE_RESULTE._id (code 1555))
02-15 18:00:10.350 11646-14550/? D/OkHttp: #################################################################

CookieDbUtil

CookieDbUtil类中的
synchronized (HttpDownManager.class)
是不是应该该成
synchronized (CookieDbUtil.class)

框架配合MVP

我发现如果业务复杂了,用作者的框架会不是很好,试着结合MVP框架,发现不太好改,作者有打算把该框架改成MVP结构,或者有什么建议么?

上传60M左右文件时报OOM

Caused by:

5 java.lang.OutOfMemoryError:Failed to allocate a 115707072 byte allocation with 25165824 free bytes and 85MB until OOM, max allowed footprint 203981032, growth limit 268435456
6 java.lang.StringFactory.newStringFromBytes(StringFactory.java:178)
7 java.lang.StringFactory.newStringFromBytes(StringFactory.java:209)
8 okio.Buffer.readString(Buffer.java:616)
9 okio.Buffer.readString(Buffer.java:599)
10 okhttp3.logging.HttpLoggingInterceptor.intercept(HttpLoggingInterceptor.java:195)
11 okhttp3.RealCall$ApplicationInterceptorChain.proceed(RealCall.java:190)
12 com.wzgiceman.rxretrofitlibrary.retrofit_rx.http.cookie.CookieInterceptor.intercept(CookieInterceptor.java:36)
13 okhttp3.RealCall$ApplicationInterceptorChain.proceed(RealCall.java:190)
14 okhttp3.RealCall.getResponseWithInterceptorChain(RealCall.java:163)
15 okhttp3.RealCall.execute(RealCall.java:57)

像gradle里面的版本依赖能不能确定某个版本呢

我的SDK版本是23(原谅我,并没有升到最新版本)。这边的版本依赖都是用+号来获取最新的,然后出现各种SDK25..0.0的,说真的,为了一个DEMO更新SDK太麻烦了。然后还得花时间找各种依赖库的版本号,一个+号,根本找不到版本号具体是什么,找的了版本号,运行起来还是错误。希望能把版本号确定一个比较好。

真实项目开发中版本号一定要固定,不然因为依赖库的更新导致某种不可预估的问题就坑爹了,碰到好几次这种问题了

如何取消当前请求任务?

demo中没看到如何取消请求任务的代码, 如果在登录界面点击登录,然后我按返回键,如何取消登录请求任务?

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.