GreenDao加Retrofit加RxJava加Fresco

写权限

开始Fresco的依赖 implementation 'com.facebook.fresco:fresco:0.12.0'

首先GeenDao的依赖
implementation 'org.greenrobot:greendao:3.2.2'
1:在项目的build.grade文件里加入一行代码   classpath 'org.greenrobot:greendao-gradle-plugin:3.2.0'
2:在app的build.grade里面加上代码 apply plugin: 'org.greenrobot.greendao'
3:在app的build.grad里面Android{}里加上代码
 * greendao{
 * schemaVersion 1 //指定数据库schema版本号,迁移等操作会用到
 * //包名是活的这是变动的
 * daoPackage 'soexample.umeng.com.greendaodemo.mydao(最后一个参数你可以创建一个包然后把小锤子敲出来的东西放进去)' //dao的包名,包名默认是entity所在的包;
 * targetGenDir 'src/main/java'//生成数据库文件的目录
 * }

然后创建一个bean(里边的数据是你解析接口出来用的东西{属性写上就可以用小锤子了})例如:

package com.example.lenovo.myapplicationn.bean;

import org.greenrobot.greendao.annotation.Entity;
import org.greenrobot.greendao.annotation.Id;
import org.greenrobot.greendao.annotation.Generated;

@Entity
public class GreenDaoNewsBean {

    @Id(autoincrement = true)
    private Long id;
    private String thumbnail_pic_s;
    private String title;
    @Generated(hash = 1544509992)
    public GreenDaoNewsBean(Long id, String thumbnail_pic_s, String title) {
        this.id = id;
        this.thumbnail_pic_s = thumbnail_pic_s;
        this.title = title;
    }
    public GreenDaoNewsBean( String thumbnail_pic_s, String title) {
        this.thumbnail_pic_s = thumbnail_pic_s;
        this.title = title;
    }
    @Generated(hash = 1269668459)
    public GreenDaoNewsBean() {
    }
    public Long getId() {
        return this.id;
    }
    public void setId(Long id) {
        this.id = id;
    }
    public String getThumbnail_pic_s() {
        return this.thumbnail_pic_s;
    }
    public void setThumbnail_pic_s(String thumbnail_pic_s) {
        this.thumbnail_pic_s = thumbnail_pic_s;
    }
    public String getTitle() {
        return this.title;
    }
    public void setTitle(String title) {
        this.title = title;
    }

    @Override
    public String toString() {
        return "GreenDaoNewsBean{" +
                "id=" + id +
                ", thumbnail_pic_s='" + thumbnail_pic_s + '\'' +
                ", title='" + title + '\'' +
                '}';
    }
}

然后必须写Application (Fresco进行初始化Fresco.initialize(this)这就能用了)

package com.example.lenovo.myapplicationn.app;

import android.app.Application;
import android.database.sqlite.SQLiteDatabase;

import com.example.lenovo.myapplicationn.mydao.DaoMaster;
import com.example.lenovo.myapplicationn.mydao.DaoSession;
import com.facebook.drawee.backends.pipeline.Fresco;

public class GreenDdaoApp extends Application {

    private static DaoSession daoSession;

    @Override
    public void onCreate() {
        super.onCreate();
        Fresco.initialize(this);
        DaoMaster.DevOpenHelper helper = new DaoMaster.DevOpenHelper(this, "ahaha");
        SQLiteDatabase writableDatabase = helper.getWritableDatabase();
        DaoMaster master = new DaoMaster(writableDatabase);
        daoSession = master.newSession();
    }

    public static DaoSession getDaoSession(){
        return daoSession;
    }
}

接下来写Retrofi和RxJava的依赖

这个是在项目的build.grade里面直接粘过去就OK
ext {
    // Sdk and tools
    minSdkVersion = 19
    targetSdkVersion = 26
    compileSdkVersion = 26
    buildToolsVersion = '26.0.2'
    //support版本
    supportVersion = '27.1.0'
    constraintLayout = '1.0.2'
    junit = '4.12'
    testRunner = '1.0.1'
    espressoCore = '3.0.1'

    interceptor = "3.11.0"
    retrofit = '2.3.0'
    converterGson = '2.3.0'
    rxandroid = '1.2.1'
    rxjava = '1.3.0'
    rxbus = '1.0.6'
    adapterRxjava = '2.0.2'
}

 implementation "com.squareup.okhttp3:logging-interceptor:$rootProject.interceptor"
    implementation "com.squareup.retrofit2:retrofit:$rootProject.retrofit"
    implementation "com.squareup.retrofit2:converter-gson:$rootProject.converterGson"
    implementation "io.reactivex:rxandroid:$rootProject.rxandroid"
    implementation "io.reactivex:rxjava:$rootProject.rxjava"
    implementation "com.hwangjr.rxbus:rxbus:$rootProject.rxbus"
    implementation "com.squareup.retrofit2:adapter-rxjava:$rootProject.adapterRxjava"
    implementation 'com.jakewharton:butterknife:8.8.1'
    annotationProcessor 'com.jakewharton:butterknife-compiler:8.8.1'

先看两个布局(一个主布局,一个适配器的子布局)

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    tools:context=".MainActivity">

    <com.jcodecraeer.xrecyclerview.XRecyclerView
        android:id="@+id/list_x"
        android:layout_width="match_parent"
        android:layout_height="match_parent"></com.jcodecraeer.xrecyclerview.XRecyclerView>

</LinearLayout>
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent">
    
    <com.facebook.drawee.view.SimpleDraweeView
        android:id="@+id/img_sim"
        android:layout_width="100dp"
        android:layout_height="100dp" />

    <TextView
        android:id="@+id/title_tv"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content" />

</LinearLayout>

 接下来看一下简单的MVP解析数据传入Activity

储存接口的类MyContacts

package com.example.lenovo.myapplicationn.contacts;

public class MyContacts {
    public static final String BASE_URL="http://www.xieast.com/api/news/";
    public static final String MORE_DATA="news.php?page=";
}

处理接口的类 MyService(用的是get还是post)

package com.example.lenovo.myapplicationn.service;

import com.example.lenovo.myapplicationn.bean.News;

import okhttp3.ResponseBody;
import retrofit2.Call;
import retrofit2.http.GET;
import retrofit2.http.Url;
import rx.Observable;

public interface MyService {
    @GET
    Call<News> get(@Url String url);
}

然后把M层和P层和V层的声明接口的类写在一块了

package com.example.lenovo.myapplicationn.contract;

import com.example.lenovo.myapplicationn.bean.News;

import rx.Observer;

public interface Contract {
    interface Model {
        //接口方法名随便起,参数必须是观察者模式Observer是泛型,中间的泛型是你的bean的类名
        void setRequest(Observer<News> data);
    }

    interface View<T> {
        void success(T data);

        void error(T error);
    }

    interface Presenter {
        void startRequest(String url);
    }
}

接下来看实现M层

package com.example.lenovo.myapplicationn.model;

import com.example.lenovo.myapplicationn.bean.News;
import com.example.lenovo.myapplicationn.contacts.MyContacts;
import com.example.lenovo.myapplicationn.contract.Contract;
import com.example.lenovo.myapplicationn.service.MyService;

import retrofit2.Call;
import retrofit2.Callback;
import retrofit2.Response;
import retrofit2.Retrofit;
import retrofit2.adapter.rxjava.RxJavaCallAdapterFactory;
import retrofit2.converter.gson.GsonConverterFactory;
import rx.Observable;
import rx.Observer;
import rx.Subscriber;
import rx.android.schedulers.AndroidSchedulers;
import rx.schedulers.Schedulers;

public class Model implements Contract.Model {
    @Override
    public void setRequest(Observer<News> data) {
        //观察者Observable要监督被观察者并订阅
        Observable.create(new Observable.OnSubscribe<News>() {
            @Override
            public void call(final Subscriber<? super News> subscriber) {
                //Retrofit的请求数据
                Retrofit retrofit=new Retrofit.Builder()
                        //添加拦截器
                        //设置网络请求的url
                        .baseUrl(MyContacts.BASE_URL)
                        //设置Gson
                        .addConverterFactory(GsonConverterFactory.create())
                        //设置Rxjava
                        .addCallAdapterFactory(RxJavaCallAdapterFactory.create())
                        .build();
                MyService myService = retrofit.create(MyService.class);
                Call<News> newsCall = myService.get(MyContacts.MORE_DATA);
                newsCall.enqueue(new Callback<News>() {
                    @Override
                    public void onResponse(Call<News> call, Response<News> response) {
                        News body = response.body();
                        subscriber.onNext(body);
                        subscriber.onCompleted();
                    }

                    @Override
                    public void onFailure(Call<News> call, Throwable t) {

                    }
                });
            }
        }).subscribeOn(Schedulers.newThread()).observeOn(AndroidSchedulers.mainThread())
                .subscribe(data);
    }
}

再来实现P层

package com.example.lenovo.myapplicationn.presenter;

import com.example.lenovo.myapplicationn.bean.News;
import com.example.lenovo.myapplicationn.contract.Contract;
import com.example.lenovo.myapplicationn.model.Model;

import rx.Observer;

public class Presenter implements Contract.Presenter {

    private Contract.Model model;
    private Contract.View view;

    public Presenter(Contract.View view) {
        this.view = view;
        model = new Model();
    }

    @Override
    public void startRequest(String url) {
        model.setRequest(new Observer<News>() {
            @Override
            public void onCompleted() {

            }

            @Override
            public void onError(Throwable e) {

            }

            @Override
            public void onNext(News news) {
                view.success(news);
            }
        });
    }
}

然后MVP到就这了,接下来两个适配器(一个是第一次解析数据的适配器并把数据传入Greendao,一个是当Greendao里有数据时可以断网使用了)

package com.example.lenovo.myapplicationn.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.TextView;
import android.widget.Toast;

import com.example.lenovo.myapplicationn.MainActivity;
import com.example.lenovo.myapplicationn.R;
import com.example.lenovo.myapplicationn.app.GreenDdaoApp;
import com.example.lenovo.myapplicationn.bean.GreenDaoNewsBean;
import com.example.lenovo.myapplicationn.bean.News;
import com.example.lenovo.myapplicationn.mydao.GreenDaoNewsBeanDao;
import com.facebook.drawee.view.SimpleDraweeView;
import com.jcodecraeer.xrecyclerview.XRecyclerView;

import java.util.List;

public class MyAdapter extends XRecyclerView.Adapter<MyAdapter.ViewHolder> {
    private Context mContext;
    private List<News.DataBean> mList;
    GreenDaoNewsBeanDao greenDaoNewsBeanDao = GreenDdaoApp.getDaoSession().getGreenDaoNewsBeanDao();
    private long insert;

    public MyAdapter(Context mContext, List<News.DataBean> mList) {
        this.mContext = mContext;
        this.mList = mList;
    }

    @NonNull
    @Override
    public ViewHolder onCreateViewHolder(@NonNull ViewGroup viewGroup, int i) {
        View view = LayoutInflater.from(mContext).inflate(R.layout.item_list, null);
        ViewHolder holder = new ViewHolder(view);
        return holder;
    }

    @Override
    public void onBindViewHolder(@NonNull ViewHolder viewHolder, int i) {
        viewHolder.img.setImageURI(Uri.parse(mList.get(i).getThumbnail_pic_s()));
        viewHolder.title.setText(mList.get(i).getTitle());
        for (int j = 0; j < mList.size(); j++) {

            insert = greenDaoNewsBeanDao.insert(new GreenDaoNewsBean(mList.get(j).getThumbnail_pic_s(), mList.get(j).getTitle()));
        }
    }

    @Override
    public int getItemCount() {
        return mList.size();
    }

    public class ViewHolder extends RecyclerView.ViewHolder {
        private SimpleDraweeView img;
        private TextView title;

        public ViewHolder(@NonNull View itemView) {
            super(itemView);
            img = itemView.findViewById(R.id.img_sim);
            title = itemView.findViewById(R.id.title_tv);
        }
    }
}
package com.example.lenovo.myapplicationn.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.TextView;
import android.widget.Toast;

import com.example.lenovo.myapplicationn.R;
import com.example.lenovo.myapplicationn.app.GreenDdaoApp;
import com.example.lenovo.myapplicationn.bean.GreenDaoNewsBean;
import com.example.lenovo.myapplicationn.bean.News;
import com.example.lenovo.myapplicationn.mydao.GreenDaoNewsBeanDao;
import com.facebook.drawee.view.SimpleDraweeView;
import com.jcodecraeer.xrecyclerview.XRecyclerView;

import java.util.List;

public class MyGreenDaoAdapter extends XRecyclerView.Adapter<MyGreenDaoAdapter.ViewHolder> {
    private Context mContext;
    private List<GreenDaoNewsBean> mList;

    public MyGreenDaoAdapter(Context mContext, List<GreenDaoNewsBean> mList) {
        this.mContext = mContext;
        this.mList = mList;
    }

    @NonNull
    @Override
    public ViewHolder onCreateViewHolder(@NonNull ViewGroup viewGroup, int i) {
        View view = LayoutInflater.from(mContext).inflate(R.layout.item_list, null);
        ViewHolder holder = new ViewHolder(view);
        return holder;
    }

    @Override
    public void onBindViewHolder(@NonNull ViewHolder viewHolder, int i) {
        viewHolder.img.setImageURI(Uri.parse(mList.get(i).getThumbnail_pic_s()));
        viewHolder.title.setText(mList.get(i).getTitle());
    }

    @Override
    public int getItemCount() {
        return mList.size();
    }

    public class ViewHolder extends RecyclerView.ViewHolder {
        private SimpleDraweeView img;
        private TextView title;

        public ViewHolder(@NonNull View itemView) {
            super(itemView);
            img = itemView.findViewById(R.id.img_sim);
            title = itemView.findViewById(R.id.title_tv);
        }
    }
}

最后一个主页面

package com.example.lenovo.myapplicationn;

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

import com.example.lenovo.myapplicationn.adapter.MyAdapter;
import com.example.lenovo.myapplicationn.adapter.MyGreenDaoAdapter;
import com.example.lenovo.myapplicationn.app.GreenDdaoApp;
import com.example.lenovo.myapplicationn.bean.GreenDaoNewsBean;
import com.example.lenovo.myapplicationn.bean.News;
import com.example.lenovo.myapplicationn.contacts.MyContacts;
import com.example.lenovo.myapplicationn.contract.Contract;
import com.example.lenovo.myapplicationn.mydao.GreenDaoNewsBeanDao;
import com.example.lenovo.myapplicationn.presenter.Presenter;
import com.jcodecraeer.xrecyclerview.XRecyclerView;

import java.util.ArrayList;
import java.util.List;

public class MainActivity extends AppCompatActivity implements Contract.View {

    private XRecyclerView list_x;
    private List<News.DataBean> list=new ArrayList<>();
    private MyAdapter adapter;
    private MyGreenDaoAdapter greenDaoAdapter;
    private Presenter presenter;
    private int index=1;
    private GreenDaoNewsBeanDao dao;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        initView();
        boolean empty = dao.loadAll().isEmpty();
        if (empty){
            presenter.startRequest(MyContacts.MORE_DATA+index);
            adapter = new MyAdapter(this, list);
            list_x.setAdapter(adapter);
        }else{
            List<GreenDaoNewsBean> list1 = dao.loadAll();
            greenDaoAdapter = new MyGreenDaoAdapter(this, list1);
            list_x.setAdapter(greenDaoAdapter);
        }
        list_x.setLoadingListener(new XRecyclerView.LoadingListener() {
            @Override
            public void onRefresh() {
                list.clear();
                index=1;
                presenter.startRequest(MyContacts.MORE_DATA+index);
                list_x.refreshComplete();
            }

            @Override
            public void onLoadMore() {
                index++;
                presenter.startRequest(MyContacts.MORE_DATA+index);
                list_x.loadMoreComplete();
            }
        });
    }

    private void initView() {
        list_x = (XRecyclerView) findViewById(R.id.list_x);
        dao = GreenDdaoApp.getDaoSession().getGreenDaoNewsBeanDao();
        list_x.setLayoutManager(new LinearLayoutManager(this));
        list_x.setPullRefreshEnabled(true);
        list_x.setLoadingMoreEnabled(true);
        presenter = new Presenter(this);
    }

    @Override
    public void success(Object data) {
        News news= (News) data;
        list.addAll(news.getData());
        adapter.notifyDataSetChanged();
    }

    @Override
    public void error(Object error) {

    }
}

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值