Retrofit+rxjava+dagger+mvp框架

导依赖

在主build.gradle里加

apply from: "config.gradle"

在app的build.gradle里

apply plugin: 'com.android.application'

android {
    compileSdkVersion rootProject.ext.android.compileSdkVersion
    defaultConfig {
        applicationId rootProject.ext.android.applicationId
        minSdkVersion rootProject.ext.android.minSdkVersion
        targetSdkVersion rootProject.ext.android.targetSdkVersion
        versionCode rootProject.ext.android.versionCode
        versionName rootProject.ext.android.versionName
        testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
    }
    buildTypes {
        release {
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
        }
    }
}

dependencies {
    implementation fileTree(include: ['*.jar'], dir: 'libs')
    implementation 'com.android.support.constraint:constraint-layout:1.1.0'
    testImplementation 'junit:junit:4.12'
    androidTestImplementation 'com.android.support.test:runner:1.0.2'
    androidTestImplementation 'com.android.support.test.espresso:espresso-core:3.0.2'
    implementation rootProject.ext.dependencies["appcompat-v7"]
    implementation rootProject.ext.dependencies["constraint-layout"]
    implementation rootProject.ext.dependencies["retrofit2"]
    implementation rootProject.ext.dependencies["converter-gson"]
    implementation rootProject.ext.dependencies["rxjava2"]
    implementation rootProject.ext.dependencies["rxjava2:rxandroid"]
    implementation rootProject.ext.dependencies["dagger"]
    annotationProcessor rootProject.ext.dependencies["dagger-compiler"]
    implementation rootProject.ext.dependencies["adapter-rxjava"]
    implementation 'com.sunfusheng:marqueeview:1.3.3'
    implementation 'com.jcodecraeer:xrecyclerview:1.3.2'
    implementation 'com.youth.banner:banner:1.4.10'
    implementation 'com.android.support:design:27.1.1'
    implementation 'com.hjm:BottomTabBar:1.1.1'
    implementation 'com.facebook.fresco:fresco:0.12.0'
    // 支持 GIF 动图,需要添加
    implementation 'com.facebook.fresco:animated-gif:0.12.0'

}
加权限
<uses-permission android:name="android.permission.INTERNET"></uses-permission>

base包

 
package com.example.administrator.yizhoumoni.base;

/**
 * Created by Administrator on 2018/5/12 0012.
 */

public interface BaseContract {
    //抽取所有presenter的共性,例如绑定、解绑
    interface BasePresenter<T extends BaseView>{
        void attchView(T view);
        void detachView();
    }
    interface BaseView{

    }
}

package com.example.administrator.yizhoumoni.base;

/**
 * Created by Administrator on 2018/5/12 0012.
 */

public class BasePresenter<T extends BaseContract.BaseView> implements BaseContract.BasePresenter<T> {
    protected T mTiew;
    @Override
    public void attchView(T view) {
        this.mTiew=view;
    }

    @Override
    public void detachView() {
        if (mTiew!=null){
            mTiew=null;
        }
    }
}

 
package com.example.administrator.yizhoumoni.base;

import android.os.Bundle;
import android.support.annotation.Nullable;
import android.support.v7.app.AppCompatActivity;

import com.example.administrator.yizhoumoni.inter.IBase;

import javax.inject.Inject;

/**
 * Created by Administrator on 2018/5/12 0012.
 */

public abstract class BaseActivity<T extends BaseContract.BasePresenter> extends AppCompatActivity implements IBase,BaseContract.BaseView {
   @Inject
    protected T mPresenter;
    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(getContentLayout());
        inject();
        mPresenter.attchView(this);
    }


    @Override
    protected void onDestroy() {
        super.onDestroy();
        mPresenter.detachView();
    }
}

inter包
package com.example.administrator.yizhoumoni.inter;

/**
 * Created by Administrator on 2018/5/12 0012.
 */

public interface IBase {
    int getContentLayout();
    void inject();
}
 

net包

package com.example.administrator.yizhoumoni.net;

/**
 * Created by Administrator on 2018/5/12 0012.
 */

public interface API {
    String BASEURL="https://www.zhaoapi.cn";
}
 
package com.example.administrator.yizhoumoni.net;

import com.example.administrator.yizhoumoni.bean.JokesBean;

import io.reactivex.Observable;
import retrofit2.http.Field;
import retrofit2.http.FormUrlEncoded;
import retrofit2.http.POST;

/**
 * Created by Administrator on 2018/5/12 0012.
 */

public interface JokesApiService {
    @FormUrlEncoded
    @POST("quarter/getJokes ")
    Observable<JokesBean> getJokes(@Field("page") String page);

}
package com.example.administrator.yizhoumoni.net;

import com.example.administrator.yizhoumoni.bean.JokesBean;

import io.reactivex.Observable;

/**
 * Created by Administrator on 2018/5/12 0012.
 */

public class JokesApi {
    private static JokesApi jokesApi;
    private JokesApiService jokesApiService;
    public JokesApi(JokesApiService jokesApiService) {
        this.jokesApiService=jokesApiService;
    }
    public static JokesApi getJokesApi(JokesApiService jokesApiService){
        if (jokesApi==null){
            jokesApi=new JokesApi(jokesApiService);
        }
        return jokesApi;
    }
    public Observable<JokesBean> getJokes(String page){
        return jokesApiService.getJokes(page);
    }
}
 

jokes包

package com.example.administrator.yizhoumoni.jokes;

import com.example.administrator.yizhoumoni.base.BaseContract;
import com.example.administrator.yizhoumoni.bean.JokesBean;

/**
 * Created by Administrator on 2018/5/12 0012.
 */

public interface JokesContract {
    interface View extends BaseContract.BaseView{
        void jokesSuccess(JokesBean jokesBean);
    }
    interface presenter extends BaseContract.BasePresenter<View>{
        void getJokes(String page);
    }
}
package com.example.administrator.yizhoumoni.jokes;

import com.example.administrator.yizhoumoni.base.BasePresenter;
import com.example.administrator.yizhoumoni.bean.JokesBean;
import com.example.administrator.yizhoumoni.net.JokesApi;

import javax.inject.Inject;

import io.reactivex.Observer;
import io.reactivex.android.schedulers.AndroidSchedulers;
import io.reactivex.disposables.Disposable;
import io.reactivex.schedulers.Schedulers;

/**
 * Created by Administrator on 2018/5/12 0012.
 */

public class JokesPresenter extends BasePresenter<JokesContract.View> implements JokesContract.presenter {
   private JokesApi jokesApi;
   @Inject
    public JokesPresenter(JokesApi jokesApi) {
        this.jokesApi=jokesApi;
    }

    @Override
    public void getJokes(String page) {
        jokesApi.getJokes(page)
                .observeOn(AndroidSchedulers.mainThread())
                .subscribeOn(Schedulers.io())
                .subscribe(new Observer<JokesBean>() {
                    @Override
                    public void onSubscribe(Disposable d) {

                    }

                    @Override
                    public void onNext(JokesBean jokesBean) {
                        mTiew.jokesSuccess(jokesBean);
                    }

                    @Override
                    public void onError(Throwable e) {

                    }

                    @Override
                    public void onComplete() {

                    }
                });
    }
}
 

module包

package com.example.administrator.yizhoumoni.module;

import com.example.administrator.yizhoumoni.net.API;
import com.example.administrator.yizhoumoni.net.JokesApi;
import com.example.administrator.yizhoumoni.net.JokesApiService;
import com.example.administrator.yizhoumoni.ui.MyInterceptor;

import java.util.concurrent.TimeUnit;

import dagger.Module;
import dagger.Provides;
import okhttp3.OkHttpClient;
import retrofit2.Retrofit;
import retrofit2.adapter.rxjava2.RxJava2CallAdapterFactory;
import retrofit2.converter.gson.GsonConverterFactory;

/**
 * Created by Administrator on 2018/5/12 0012.
 */
@Module
public class HttpModule {

    @Provides
    OkHttpClient.Builder provideOkHttpClientBuilder() {
        return new OkHttpClient.Builder()
                .writeTimeout(20, TimeUnit.SECONDS)
                .readTimeout(20, TimeUnit.SECONDS)
                .connectTimeout(10, TimeUnit.SECONDS);
    }


    @Provides
    JokesApi provideJokesApi(OkHttpClient.Builder builder){

       builder.addInterceptor(new MyInterceptor());
        Retrofit retrofit = new Retrofit.Builder().baseUrl(API.BASEURL)
                .addCallAdapterFactory(RxJava2CallAdapterFactory.create())
                .addConverterFactory(GsonConverterFactory.create())
                .client(builder.build())
                .build();
        JokesApiService jokesApiService = retrofit.create(JokesApiService.class);
        return JokesApi.getJokesApi(jokesApiService);
    }
}
 

component包

package com.example.administrator.yizhoumoni.component;

import com.example.administrator.yizhoumoni.MainActivity;
import com.example.administrator.yizhoumoni.module.HttpModule;

import dagger.Component;

/**
 * Created by Administrator on 2018/5/12 0012.
 */
@Component(modules = HttpModule.class)
public interface HttpComponent {
    void inject(MainActivity mainActivity);
}
 

拦截器

package com.example.administrator.yizhoumoni.ui;

import java.io.IOException;

import okhttp3.FormBody;
import okhttp3.HttpUrl;
import okhttp3.Interceptor;
import okhttp3.Request;
import okhttp3.Response;

/**
 * Created by Administrator on 2018/5/12 0012.
 */

public class MyInterceptor implements Interceptor {
    @Override
    public Response intercept(Chain chain) throws IOException {
        Response response;
        //区分是GET请求还是POST请求
        Request originRequest = chain.request();
        if ("GET".equals(originRequest.method())) {
            HttpUrl httpUrl = originRequest.url()
                    .newBuilder()
                    .addQueryParameter("source", "android")
                    .addQueryParameter("appVersion","101")
                    .build();
            Request request = new Request.Builder().url(httpUrl).build();
            //发送请求
            response = chain.proceed(request);
        } else {
            FormBody.Builder builder = new FormBody.Builder();


            FormBody body = (FormBody) originRequest.body();
            int size = body.size();
            for (int i = 0; i < size; i++) {
                builder.add(body.name(i), body.value(i));
            }
            builder.add("source", "android");
            builder.add("appVersion","101");
            FormBody formBody = builder.build();
            Request request = new Request.Builder()
                    .url(originRequest.url())
                    .post(formBody)
                    .build();
            response = chain.proceed(request);


        }
        return response;
    }
}
app包
package com.example.administrator.yizhoumoni.app;

import android.app.Application;

import com.facebook.drawee.backends.pipeline.Fresco;

/**
 * Created by Administrator on 2018/5/12 0012.
 */

public class MyApp extends Application {
    @Override
    public void onCreate() {
        super.onCreate();
        Fresco.initialize(this);
    }
}
bean包

package com.example.administrator.yizhoumoni.bean;

import java.util.List;

/**
 * Created by Administrator on 2018/5/12 0012.
 */

public class JokesBean {


    /**
     * msg : 获取段子列表成功
     * code : 0
     * data : [{"commentNum":null,"content":"早上好","createTime":"2018-05-11T07:52:37","imgUrls":"https://www.zhaoapi.cn/images/quarter/15259963574562018-05-11_07-52-06.jpg","jid":2608,"praiseNum":null,"shareNum":null,"uid":12509,"user":{"age":null,"fans":"null","follow":false,"icon":"https://www.zhaoapi.cn/images/1523839244885crop_photo.jpg","nickname":"%E5%BC%A0%E9%9C%B2","praiseNum":"null"}},{"commentNum":null,"content":"楼下的你是谁","createTime":"2018-05-10T11:08:20","imgUrls":null,"jid":2607,"praiseNum":null,"shareNum":null,"uid":11555,"user":{"age":null,"fans":"null","follow":false,"icon":"https://www.zhaoapi.cn/images/1526040073381image.jpg","nickname":"肤白貌美大长腿","praiseNum":"null"}},{"commentNum":null,"content":"有美人兮,见之不忘,一日不见兮,思之如狂。","createTime":"2018-04-29T09:47:56","imgUrls":"https://www.zhaoapi.cn/images/quarter/1524966476079IMG_PITU_20180427_163105.jpg","jid":2444,"praiseNum":null,"shareNum":null,"uid":12898,"user":{"age":null,"fans":"null","follow":false,"icon":"https://www.zhaoapi.cn/images/1524972479241gaga_icon.jpg","nickname":"晴天","praiseNum":"null"}},{"commentNum":null,"content":"北城别,回眸三生","createTime":"2018-04-29T09:44:12","imgUrls":"https://www.zhaoapi.cn/images/quarter/1524966252515IMG_PITU_20180427_163706.jpg","jid":2443,"praiseNum":null,"shareNum":null,"uid":12898,"user":{"age":null,"fans":"null","follow":false,"icon":"https://www.zhaoapi.cn/images/1524972479241gaga_icon.jpg","nickname":"晴天","praiseNum":"null"}},{"commentNum":null,"content":"你好","createTime":"2018-04-29T09:38:52","imgUrls":null,"jid":2442,"praiseNum":null,"shareNum":null,"uid":12898,"user":{"age":null,"fans":"null","follow":false,"icon":"https://www.zhaoapi.cn/images/1524972479241gaga_icon.jpg","nickname":"晴天","praiseNum":"null"}},{"commentNum":null,"content":"急急急","createTime":"2018-04-29T08:51:57","imgUrls":"https://www.zhaoapi.cn/images/quarter/1524963117808mmqrcode1524905055464.png","jid":2440,"praiseNum":null,"shareNum":null,"uid":11186,"user":{"age":null,"fans":"null","follow":false,"icon":"https://www.zhaoapi.cn/images/1524970642661gaga_icon.jpg","nickname":"啦啦啦","praiseNum":"null"}},{"commentNum":null,"content":"向毛爷爷致敬","createTime":"2018-04-29T08:35:57","imgUrls":"https://www.zhaoapi.cn/images/quarter/1524962157793head_icon.jpg","jid":2439,"praiseNum":null,"shareNum":null,"uid":11186,"user":{"age":null,"fans":"null","follow":false,"icon":"https://www.zhaoapi.cn/images/1524970642661gaga_icon.jpg","nickname":"啦啦啦","praiseNum":"null"}},{"commentNum":null,"content":"鸡翅还吃","createTime":"2018-04-27T19:43:50","imgUrls":"https://www.zhaoapi.cn/images/quarter/1524829430588login.png|https://www.zhaoapi.cn/images/quarter/1524829430588splash.png","jid":2384,"praiseNum":null,"shareNum":null,"uid":12882,"user":{"age":null,"fans":"null","follow":false,"icon":"https://www.zhaoapi.cn/images/1524901794636head_icon.jpg","nickname":null,"praiseNum":"null"}},{"commentNum":null,"content":"咯rosy","createTime":"2018-04-27T17:06:12","imgUrls":"https://www.zhaoapi.cn/images/quarter/1524819972717avatar-25-27667.jpg|https://www.zhaoapi.cn/images/quarter/1524819972733avatar-14-31491.jpg|https://www.zhaoapi.cn/images/quarter/1524819972733avatar-14-31485.jpg|https://www.zhaoapi.cn/images/quarter/1524819972733avatar-25-29151.jpg","jid":2378,"praiseNum":null,"shareNum":null,"uid":2809,"user":{"age":null,"fans":"null","follow":false,"icon":"https://www.zhaoapi.cn/images/1525672979819head_icon.jpg","nickname":"孑然","praiseNum":"null"}},{"commentNum":null,"content":"咯rosy","createTime":"2018-04-27T17:06:08","imgUrls":"https://www.zhaoapi.cn/images/quarter/1524819968842avatar-25-27667.jpg|https://www.zhaoapi.cn/images/quarter/1524819968858avatar-14-31491.jpg|https://www.zhaoapi.cn/images/quarter/1524819968858avatar-14-31485.jpg|https://www.zhaoapi.cn/images/quarter/1524819968858avatar-25-29151.jpg","jid":2377,"praiseNum":null,"shareNum":null,"uid":2809,"user":{"age":null,"fans":"null","follow":false,"icon":"https://www.zhaoapi.cn/images/1525672979819head_icon.jpg","nickname":"孑然","praiseNum":"null"}}]
     */

    private String msg;
    private String code;
    private List<DataBean> data;

    public String getMsg() {
        return msg;
    }

    public void setMsg(String msg) {
        this.msg = msg;
    }

    public String getCode() {
        return code;
    }

    public void setCode(String code) {
        this.code = code;
    }

    public List<DataBean> getData() {
        return data;
    }

    public void setData(List<DataBean> data) {
        this.data = data;
    }

    public static class DataBean {
        /**
         * commentNum : null
         * content : 早上好
         * createTime : 2018-05-11T07:52:37
         * imgUrls : https://www.zhaoapi.cn/images/quarter/15259963574562018-05-11_07-52-06.jpg
         * jid : 2608
         * praiseNum : null
         * shareNum : null
         * uid : 12509
         * user : {"age":null,"fans":"null","follow":false,"icon":"https://www.zhaoapi.cn/images/1523839244885crop_photo.jpg","nickname":"%E5%BC%A0%E9%9C%B2","praiseNum":"null"}
         */

        private Object commentNum;
        private String content;
        private String createTime;
        private String imgUrls;
        private int jid;
        private Object praiseNum;
        private Object shareNum;
        private int uid;
        private UserBean user;

        public Object getCommentNum() {
            return commentNum;
        }

        public void setCommentNum(Object commentNum) {
            this.commentNum = commentNum;
        }

        public String getContent() {
            return content;
        }

        public void setContent(String content) {
            this.content = content;
        }

        public String getCreateTime() {
            return createTime;
        }

        public void setCreateTime(String createTime) {
            this.createTime = createTime;
        }

        public String getImgUrls() {
            return imgUrls;
        }

        public void setImgUrls(String imgUrls) {
            this.imgUrls = imgUrls;
        }

        public int getJid() {
            return jid;
        }

        public void setJid(int jid) {
            this.jid = jid;
        }

        public Object getPraiseNum() {
            return praiseNum;
        }

        public void setPraiseNum(Object praiseNum) {
            this.praiseNum = praiseNum;
        }

        public Object getShareNum() {
            return shareNum;
        }

        public void setShareNum(Object shareNum) {
            this.shareNum = shareNum;
        }

        public int getUid() {
            return uid;
        }

        public void setUid(int uid) {
            this.uid = uid;
        }

        public UserBean getUser() {
            return user;
        }

        public void setUser(UserBean user) {
            this.user = user;
        }

        public static class UserBean {
            /**
             * age : null
             * fans : null
             * follow : false
             * icon : https://www.zhaoapi.cn/images/1523839244885crop_photo.jpg
             * nickname : %E5%BC%A0%E9%9C%B2
             * praiseNum : null
             */

            private Object age;
            private String fans;
            private boolean follow;
            private String icon;
            private String nickname;
            private String praiseNum;

            public Object getAge() {
                return age;
            }

            public void setAge(Object age) {
                this.age = age;
            }

            public String getFans() {
                return fans;
            }

            public void setFans(String fans) {
                this.fans = fans;
            }

            public boolean isFollow() {
                return follow;
            }

            public void setFollow(boolean follow) {
                this.follow = follow;
            }

            public String getIcon() {
                return icon;
            }

            public void setIcon(String icon) {
                this.icon = icon;
            }

            public String getNickname() {
                return nickname;
            }

            public void setNickname(String nickname) {
                this.nickname = nickname;
            }

            public String getPraiseNum() {
                return praiseNum;
            }

            public void setPraiseNum(String praiseNum) {
                this.praiseNum = praiseNum;
            }
        }
    }
}
Main类

package com.example.administrator.yizhoumoni;

import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.support.v7.widget.LinearLayoutManager;
import android.support.v7.widget.RecyclerView;
import android.util.Log;
import android.widget.Toast;

import com.example.administrator.yizhoumoni.adapter.RvAdapter;
import com.example.administrator.yizhoumoni.base.BaseActivity;
import com.example.administrator.yizhoumoni.bean.JokesBean;
import com.example.administrator.yizhoumoni.component.DaggerHttpComponent;
import com.example.administrator.yizhoumoni.jokes.JokesContract;
import com.example.administrator.yizhoumoni.jokes.JokesPresenter;
import com.example.administrator.yizhoumoni.module.HttpModule;

import java.util.List;

public class MainActivity extends BaseActivity<JokesPresenter> implements JokesContract.View {

    private RecyclerView mRv;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        initView();
        mPresenter.getJokes("2");
    }

    private void initView() {
        mRv = (RecyclerView) findViewById(R.id.rv);
        mRv.setLayoutManager(new LinearLayoutManager(this));
    }

    @Override
    public int getContentLayout() {
        return R.layout.activity_main;
    }

    @Override
    public void inject() {
        DaggerHttpComponent.builder().httpModule(new HttpModule()).build().inject(this);
    }

    @Override
    public void jokesSuccess(JokesBean jokesBean) {
        List<JokesBean.DataBean> data = jokesBean.getData();
        RvAdapter adapter = new RvAdapter(data,MainActivity.this);
        mRv.setAdapter(adapter);
        Log.e("zzzzz",jokesBean.getMsg());
        Toast.makeText(this,jokesBean.getMsg(),Toast.LENGTH_LONG).show();

    }

}

adapter

package com.example.administrator.yizhoumoni.adapter;

import android.content.Context;
import android.net.Uri;
import android.support.annotation.NonNull;
import android.support.v7.widget.RecyclerView;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ImageView;
import android.widget.TextView;

import com.example.administrator.yizhoumoni.R;
import com.example.administrator.yizhoumoni.bean.JokesBean;
import com.facebook.drawee.view.SimpleDraweeView;

import java.util.List;

/**
 * Created by Administrator on 2018/5/12 0012.
 */

public class RvAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder> {
    private List<JokesBean.DataBean> data;
    private Context context;
    private final LayoutInflater inflater;

    public RvAdapter(List<JokesBean.DataBean> data, Context context) {
        this.data = data;
        this.context = context;
        inflater = LayoutInflater.from(context);
    }

    @NonNull
    @Override
    public RecyclerView.ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
        View view = inflater.inflate(R.layout.item, parent, false);
        ViewHolder viewHolder = new ViewHolder(view);
        return viewHolder;
    }

    @Override
    public void onBindViewHolder(@NonNull RecyclerView.ViewHolder holder, int position) {
        ViewHolder viewHolder = (ViewHolder) holder;
        JokesBean.DataBean dataBean = data.get(position);
            viewHolder.ivimg.setImageURI(dataBean.getImgUrls());
         //  viewHolder.img.setImageURI(dataBean.getImgUrls());

        viewHolder.tvname.setText(dataBean.getUser().getNickname());
        viewHolder.tvtime.setText(dataBean.getCreateTime());
        viewHolder.tvtitle.setText(dataBean.getContent());
    }

    @Override
    public int getItemCount() {
        return data.size();
    }
    class ViewHolder extends RecyclerView.ViewHolder{

        private final TextView tvname;
        private final TextView tvtime;
        private final TextView tvtitle;
        private final SimpleDraweeView ivimg;

        public ViewHolder(View itemView) {
            super(itemView);
            tvname = itemView.findViewById(R.id.tvname);
            tvtime = itemView.findViewById(R.id.tvtime);
            tvtitle = itemView.findViewById(R.id.tvtitle);
            ivimg = itemView.findViewById(R.id.ivimg);

        }
    }
}




 



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值