retrofit+rxjava 获取listview列表并存入缓存

retrofit2调用请求

retrofit2 api接口

public interface IOrderApi {
    @GET("empOrderList")
    Observable<OrderBean> getOrder(@Query("tel") String tel,
                                   @Query("orderType") String orderType,
                                   @Query("page") String page,
                                   @Query("step") String step);


}

实现接口,并获取数据

package cn.yuebai.yuebaidealer.api.impl;

import cn.yuebai.yuebaidealer.api.IOrderApi;
import cn.yuebai.yuebaidealer.bean.OrderBean;
import cn.yuebai.yuebaidealer.config.BaseApi;
import rx.Observable;

/**
 * retrofit2-获取订单api
 * User: ZhiyaZhao(zhiyazhao@126.com)
 * Date: 2016-04-24
 * parma: 09:00
 * <p>
 * FIXME
 */
public class OrderApi extends BaseApi {
    public static IOrderApi orderApi;

    /**
     * 获取数据
     * @param tel
     * @param orderType
     * @param page
     * @param step
     * @return
     */
    public static Observable<OrderBean> getOrders(String tel, String orderType, String page, String step) {
        getOrderApi();

        return orderApi.getOrder(tel, orderType, page, step);
    }

    /**
     * 获取创建api
     * @return
     */
    public static IOrderApi getOrderApi() {
        if (orderApi == null) {

            orderApi = createApi(IOrderApi.class);
        }
        return orderApi;
    }
}

Model层

/**
     * 订阅数据
     *
     * @param observer  观察者-缓存数据bean
     * @param tel       电话号码
     * @param ordertype 查询类型
     * @param page      分页
     * @return 在主线程, 订阅
     */
    @Override
    public Subscription subscribeData(Observer<List<OrderListDbBean>> observer, String tel, String ordertype, String page, File file) {
        if (cache == null) {
            cache = BehaviorSubject.create();

            Observable.create(new Observable.OnSubscribe<List<OrderListDbBean>>() {
                @Override
                public void call(Subscriber<? super List<OrderListDbBean>> subscriber) {

                    List<OrderListDbBean> items = Database.getInstance().readItems(file);//本地文件读取
                    if (items == null || file.exists()) {
                        //本地缓存文件没有读取网络
                        Data.getInstence().setDataSource(AppConfig.DATA_SOURCE_NETWORK);//网络
                        loadFromNetwork(tel, ordertype, page, file);
                    } else {
                        Data.getInstence().setDataSource(AppConfig.DATA_SOURCE_DISK);//磁盘
                        subscriber.onNext(items);
                    }
                }
            })
                    .subscribeOn(Schedulers.io())
                    .subscribe(cache);
        } else {
            //从内存中读取
            Data.getInstence().setDataSource(AppConfig.DATA_SOURCE_MEMORY);

        }
        return cache.observeOn(AndroidSchedulers.mainThread())
                .subscribe(observer);
    }

从网络获取数据:

 /**
     * 从网络获取数据并存入本地文件
     *
     * @param tel
     * @param ordertype
     * @param page
     */
    @Override
    public void loadFromNetwork(String tel, String ordertype, String page, File file) {
        OrderApi.getOrders(tel, ordertype, page, AppConfig.ORDER_STEP)
                .subscribeOn(Schedulers.io())
                .observeOn(AndroidSchedulers.mainThread())
                .filter(response -> response != null)
                .filter(response -> response.getPageCount() > 0)
                .map(OrderResultToItemsMapper.getInstance())
                .doOnNext(new Action1<List<OrderListDbBean>>() {
                    @Override
                    public void call(List<OrderListDbBean> orderListDbBeen) {
                        Database.getInstance().writeItems(orderListDbBeen, file);
                    }
                })
                .subscribe(
                        new Action1<List<OrderListDbBean>>() {
                            @Override
                            public void call(List<OrderListDbBean> items) {
//                                mPassOnListener.onSuccess(items);
                                cache.onNext(items);
                            }
                        },
                        Throwable::printStackTrace);

    }

P层

  @Override
    public Subscription getOrders(String ordertype, File file) {

        if (!HttpUtil.isNetworkAvailable(context)) {
            Toast.makeText(context, "网络不通,请开启网络", Toast.LENGTH_SHORT).show();
            return null;
        } else {
            return OrderModel.getInstence().subscribeData(new Observer<List<OrderListDbBean>>() {

                @Override
                public void onCompleted() {
                }

                @Override
                public void onError(Throwable e) {
                    e.printStackTrace();
                    orderView.stopRefreshing();
                    Log.d("OrderPresenter--------", "获取失败...");
                }

                @Override
                public void onNext(List<OrderListDbBean> orderList) {
                    orderView.stopRefreshing();
                    orderView.setAdapter(orderList);

                }
            }, orderView.getTel(), ordertype, "1", file);

        }

    }

view

activity

package cn.yuebai.yuebaidealer.view.fragment;

import android.os.Bundle;
import android.os.Environment;
import android.support.v4.widget.SwipeRefreshLayout;
import android.support.v7.widget.LinearLayoutManager;
import android.support.v7.widget.RecyclerView;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;

import java.io.File;
import java.util.List;

import butterknife.Bind;
import butterknife.ButterKnife;
import cn.yuebai.yuebaidealer.R;
import cn.yuebai.yuebaidealer.config.AppConfig;
import cn.yuebai.yuebaidealer.config.SharedPreferencesUtil;
import cn.yuebai.yuebaidealer.db.Data.OrderListDbBean;
import cn.yuebai.yuebaidealer.presenter.impl.OrderPresenter;
import cn.yuebai.yuebaidealer.view.IOrderView;
import cn.yuebai.yuebaidealer.view.adapter.OrderWaitAdapter;

/**
 * A fragment representing a list of Items.
 * <p>
 * interface.
 */
public class OrderWaitFragment extends BaseFragment implements SwipeRefreshLayout.OnRefreshListener, IOrderView {

    @Bind(R.id.rv_order)
    RecyclerView rvOrder;
    @Bind(R.id.rl_order_swipe)
    SwipeRefreshLayout rlOrderSwipe;
    OrderWaitAdapter mAdapter = new OrderWaitAdapter();
    File file = new File(Environment.getExternalStorageDirectory(), AppConfig.DIR_WAITING);

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
    }

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {
        View view = inflater.inflate(R.layout.fragment_order_list, container, false);

        ButterKnife.bind(this, view);

        LinearLayoutManager mLayoutManager = new LinearLayoutManager(getActivity());
        mLayoutManager.setOrientation(LinearLayoutManager.VERTICAL);
        //如果可以确定每个item的高度是固定的,设置这个选项可以提高性能
        rvOrder.setHasFixedSize(true);
        rvOrder.setLayoutManager(mLayoutManager);
        rlOrderSwipe.setOnRefreshListener(this);
        
        rvOrder.setAdapter(mAdapter);
        load();
        return view;
    }

    @Override
    public String getTel() {
        return (String) SharedPreferencesUtil.get(AppConfig.AUTO_LOGIN_SHARE, getActivity(), AppConfig.AUTO_LOGIN_USER_TEL_COOKIE, "");
    }

    @Override
    public void stopRefreshing() {
        rlOrderSwipe.setRefreshing(false);
    }

    @Override
    public void setAdapter(List<OrderListDbBean> orderList) {
        mAdapter.setItems(orderList);
    }


    @Override
    public void onDestroyView() {
        super.onDestroyView();
        ButterKnife.unbind(this);
    }


    @Override
    public void onResume() {
        super.onResume();
        load();
        Log.d("OrderAssignFragment", "onresume.......");
    }

    /**
     * 获取订单数据
     */
    void load() {

        rlOrderSwipe.setRefreshing(true);
        unsubscribe();
        OrderPresenter mOrderPresenter = new OrderPresenter(getActivity(), this);
        mOrderPresenter.getOrders(AppConfig.ORDER_TYPE_WAITING, file);

    }

    @Override
    public void onRefresh() {
//        OrderModel.getInstence().loadFromNetwork(getTel(), AppConfig.ORDER_TYPE_WAITING, "1", file);
    }
}

adapter

package cn.yuebai.yuebaidealer.view.adapter;

import android.support.v7.widget.RecyclerView;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.Button;
import android.widget.TextView;

import java.util.List;

import butterknife.Bind;
import butterknife.ButterKnife;
import cn.yuebai.yuebaidealer.R;
import cn.yuebai.yuebaidealer.db.Data.OrderListDbBean;

public class OrderWaitAdapter extends RecyclerView.Adapter<OrderWaitAdapter.ViewHolder> {
    //    public List<OrderBean.OrderListBean> datas;
    List<OrderListDbBean> datas;

    public OrderWaitAdapter(List<OrderListDbBean> dates) {
        this.datas = dates;
    }

    public OrderWaitAdapter() {
    }

    //创建新View,被LayoutManager所调用
    @Override
    public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
        View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.item_orderlist, parent, false);
        return new ViewHolder(view);
    }

    //将数据与界面进行绑定的操作
    @Override
    public void onBindViewHolder(ViewHolder holder, int position) {

        OrderListDbBean listBean = datas.get(position);
        holder.tvOrderWait.setText("等待服务");
        Log.d("OrderWaitAdapter", listBean.getTaker());
        holder.tvOrderStaff.setText(listBean.getTaker());
        holder.tvOrderService.setText(listBean.getProductName());
        holder.tvOrderCarinfo.setText(listBean.getCarNo() + "-" +
                listBean.getBrandName() + listBean.getModelName() + "-" +
                listBean.getColor());
        holder.tvOrderAddress.setText(listBean.getAddressName());
        holder.tvOrderTiming.setText(listBean.getTimezone());

        holder.tvOrderCall.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Log.d("OrderAdapter", "calllllllllllllllllllll");
            }
        });


    }

    public void setItems(List<OrderListDbBean> orderListDbBeen) {
        this.datas = orderListDbBeen;
        notifyDataSetChanged();
    }

    @Override
    public int getItemCount() {
        return datas == null ? 0 : datas.size();
    }


    public static class ViewHolder extends RecyclerView.ViewHolder {

        @Bind(R.id.tv_order_wait)
        TextView tvOrderWait;
        @Bind(R.id.tv_order_staff)
        TextView tvOrderStaff;
        @Bind(R.id.tv_order_service)
        TextView tvOrderService;
        @Bind(R.id.tv_order_carinfo)
        TextView tvOrderCarinfo;
        @Bind(R.id.tv_order_address)
        TextView tvOrderAddress;
        @Bind(R.id.tv_order_timing)
        TextView tvOrderTiming;
        @Bind(R.id.btn_order_call)
        Button tvOrderCall;

        ViewHolder(View view) {
            super(view);
            ButterKnife.bind(this, view);
        }

    }


}


工具类

fileCache--文件缓存
package cn.yuebai.yuebaidealer.db;

import com.google.gson.Gson;
import com.google.gson.reflect.TypeToken;

import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
import java.io.Reader;
import java.io.Writer;
import java.util.List;

import cn.yuebai.yuebaidealer.bean.OrderListDbBean;

/**
 * 将订单存入文件
 * User: ZhiyaZhao(zhiyazhao@126.com)
 * Date: 2016-04-27
 * parma: 10:01
 * FIXME
 */
public class FileCache {
    public static FileCache INSTANCE;

    public File file;
//    public String filename;

//    File dataFile = new File(Environment.getExternalStorageDirectory(), filename);

    Gson gson = new Gson();

    public static FileCache getInstance() {
        if (INSTANCE == null) {
            INSTANCE = new FileCache();
        }
        return INSTANCE;
    }

    /**
     * 读取文件
     *
     * @return返回集合实体对象
     */
    public List<OrderListDbBean> readItems(File file) {
        // 硬编码添加一些延迟,区分阅读从内存和磁盘读清楚
        try {
            Thread.sleep(100);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        try {
            Reader reader = new FileReader(file);
            //   将给定的 JSON 格式字符串转换为带泛型的集合对象
            return gson.fromJson(reader, new TypeToken<List<OrderListDbBean>>() {
            }.getType());
        } catch (FileNotFoundException e) {
            e.printStackTrace();
            return null;
        }
    }


    /**
     * 写入文件
     *
     * @param items 网络获取的实体
     */
    public void writeItems(List<OrderListDbBean> items, File file) {
        String json = gson.toJson(items);
        try {
            if (!file.exists()) {
                try {
                    file.createNewFile();
//                    file.setWritable(Boolean.TRUE);
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
            Writer writer = new FileWriter(file);
            writer.write(json);
            writer.flush();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    /**
     * 删除文件
     */
    public void delete(File file) {
        file.delete();
    }
}

Data
package cn.yuebai.yuebaidealer.db.Data;

import android.support.annotation.IntDef;
import android.util.Log;

import java.io.File;
import java.util.List;

import cn.yuebai.yuebaidealer.R;
import cn.yuebai.yuebaidealer.bean.OrderListDbBean;
import cn.yuebai.yuebaidealer.config.AppConfig;
import cn.yuebai.yuebaidealer.config.MyApplication;
import cn.yuebai.yuebaidealer.db.FileCache;
import rx.subjects.BehaviorSubject;

/**
 * User: ZhiyaZhao(zhiyazhao@126.com)
 * Date: 2016-04-27
 * parma: 10:18
 * FIXME
 */
public class Data {
    public static Data instence;

    private int dataSource;
    BehaviorSubject<List<OrderListDbBean>> cache;


    @IntDef({AppConfig.DATA_SOURCE_MEMORY, AppConfig.DATA_SOURCE_DISK, AppConfig.DATA_SOURCE_NETWORK})
    @interface DataSource {
    }

    private Data() {
    }

    public static Data getInstence() {
        if (instence == null) {
            instence = new Data();
        }
        return instence;
    }

    /**
     * 设置缓存数据存储方式
     *
     * @param dataSource 存储方式:内存,磁盘,网络
     */
    public void setDataSource(@DataSource int dataSource) {
        this.dataSource = dataSource;
    }

    /**
     * 获取数据存储方式
     *
     * @return
     */
    public String getDataSourceText() {
        int dataSourceTextRes;
        switch (dataSource) {
            //内存
            case AppConfig.DATA_SOURCE_MEMORY:
                dataSourceTextRes = R.string.order_source_memory;
                break;
            //磁盘
            case AppConfig.DATA_SOURCE_DISK:
                dataSourceTextRes = R.string.order_source_disk;
                break;
            //网络
            case AppConfig.DATA_SOURCE_NETWORK:
                dataSourceTextRes = R.string.order_source_network;
                break;
            default:
                dataSourceTextRes = R.string.order_source_network;
        }
        Log.d("Data-------------", MyApplication.getInstance().getString(dataSourceTextRes));
        return MyApplication.getInstance().getString(dataSourceTextRes);
    }

    public void clearMemoryCache() {
        cache = null;
    }

    public void clearMemoryAndDiskCache(File file) {
        clearMemoryCache();
        FileCache.getInstance().delete(file);
    }
}
order 内存缓存类OrderResultToItemMapper

package cn.yuebai.yuebaidealer.db.Data;

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

import cn.yuebai.yuebaidealer.bean.OrderBean;
import cn.yuebai.yuebaidealer.bean.OrderListDbBean;
import rx.functions.Func1;

/**
 * 映射器
 * User: ZhiyaZhao(zhiyazhao@126.com)
 * Date: 2016-04-27
 * parma: 10:40
 * FIXME
 */
public class OrderResultToItemsMapper implements Func1<OrderBean, List<OrderListDbBean>> {

    private static OrderResultToItemsMapper INSTANCE = new OrderResultToItemsMapper();


    public OrderResultToItemsMapper() {
    }

    public static OrderResultToItemsMapper getInstance() {
        return INSTANCE;
    }

    //OrderBean:外部json
    //OrderBean.OrderListBean:订单实体bean
    //OrderListDbBean:存入文件bean
    @Override
    public List<OrderListDbBean> call(OrderBean orderBean) {


        List<OrderBean.OrderListBean> orderList = orderBean.getOrderList();//获取orderList

        List<OrderListDbBean> orderListDb = new ArrayList<>(orderList.size());//将orderList数据复制给缓存文件orderList
        if (orderList == null || orderList.size() == 0) {
            orderListDb = new ArrayList<OrderListDbBean>() {
            };
        }
        for (OrderBean.OrderListBean getOrder : orderList) {
            OrderListDbBean item = new OrderListDbBean();
            item.timezone = getOrder.getTimezone();
            item.taker = getOrder.getTaker();
            item.orderNo = getOrder.getOrderNo();
            item.carNo = getOrder.getCarNo();
            item.brandName = getOrder.getBrandName();
            item.modelName = getOrder.getModelName();
            item.color = getOrder.getColor();
            item.productName = getOrder.getProductName();
            item.customerDesc = getOrder.getCustomerDesc();
            item.customerTel = getOrder.getCustomerTel();
            item.addressName = getOrder.getAddressName();
            item.waiting_minute = getOrder.getWaiting_minute();
            item.statusCn = getOrder.getStatusCn();
            orderListDb.add(item);
        }
        return orderListDb;
    }


}



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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值