Android okhttp+rxjava实现多文件下载和断点续传

本文介绍了如何使用OkHttp和RxJava在Android上实现多文件下载及断点续传功能。通过监听下载进度,用户可以随时暂停和继续下载,同时在下载完成后会接收到通知。核心代码包括对RecyclerView的封装,以及DownloadManager类的download方法,该方法负责处理下载逻辑。最后展示了功能实现后的实际效果。
摘要由CSDN通过智能技术生成

         首先先感谢丰神,核心代码源于他的这篇微博http://blog.csdn.net/cfy137000/article/details/54838608,思路很棒。基于他的代码做了一些改动,实现我所需功能。

      

      先说下我的需求。我的需求是PC端先进行更新数据的管理,然后移动端登录时候会自动访问服务,传入mac值,获取需更新数据的信息。如下图所示:


      

        从服务返回到的是json格式的字符串,我解析后获得一个list<bean>,bean的结构为:

public class OfflineDataBean {

    private String dataId;
    private String dataName;
    private String organizationName;
    private String mac;
    private int dataType;
    private String dataAddtime;
    private String dataUpdatetime;
    private String dataPath;
    private String dataStatus;
    private String remark;

    ...
}
      

      接下来就是将这个list展示在一个RecyclerView里。在这里我首先将RecyclerView的Adapter和Holder进行了一次封装:

public abstract class BaseRecyclerAdapter<T> extends RecyclerView.Adapter<RecyclerViewHolder> {
    //list集合
    protected final List<T> mData;
    protected final Context mContext;
    //上下文
    protected LayoutInflater mInflater;
    //点击item监听
    private OnItemClickListener mClickListener;
    //长按item监听
    private OnItemLongClickListener mLongClickListener;

    /**
     * 构造方法
     *
     * @param ctx
     * @param list
     */
    public BaseRecyclerAdapter(Context ctx, List<T> list) {
        mData = (list != null) ? list : new ArrayList<T>();
        mContext = ctx;
        mInflater = LayoutInflater.from(ctx);
    }

    public void clear() {
        this.mData.clear();
    }

    /**
     * 方法中主要是引入xml布局文件,并且给item点击事件和item长按事件赋值
     *
     * @param parent
     * @param viewType
     * @return
     */
    @Override
    public RecyclerViewHolder onCreateViewHolder(ViewGroup parent, final int viewType) {
        final RecyclerViewHolder holder = new RecyclerViewHolder(mContext,
                mInflater.inflate(getItemLayoutId(viewType), parent, false));
        if (mClickListener != null) {
            holder.itemView.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    mClickListener.onItemClick(holder.itemView, holder.getPosition());
                }
            });
        }
        if (mLongClickListener != null) {
            holder.itemView.setOnLongClickListener(new View.OnLongClickListener() {
                @Override
                public boolean onLongClick(View v) {
                    mLongClickListener.onItemLongClick(holder.itemView, holder.getPosition());
                    return true;
                }
            });
        }
        return holder;
    }

    /**
     * onBindViewHolder这个方法主要是给子项赋值数据的
     *
     * @param holder
     * @param position
     */
    @Override
    public void onBindViewHolder(RecyclerViewHolder holder, int position) {
        bindData(holder, position, mData.get(position));
    }

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

    /**
     * add方法是添加item方法
     *
     * @param pos
     * @param item
     */
    public void add(int pos, T item) {
        mData.add(pos, item);
        notifyItemInserted(pos);
    }

    /**
     * delete方法是删除item方法
     *
     * @param pos
     */
    public void delete(int pos) {
        mData.remove(pos);
        notifyItemRemoved(pos);
    }

    /**
     * item点击事件set方法
     *
     * @param listener
     */
    public void setOnItemClickListener(OnItemClickListener listener) {
        mClickListener = listener;
    }

    /**
     * item长安事件set方法
     *
     * @param listener
     */
    public void setOnItemLongClickListener(OnItemLongClickListener listener) {
        mLongClickListener = listener;
    }

    /**
     * item中xml布局文件方法
     *
评论 54
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值