OkHttp+MVP实现RecycleView显示数据

来源:互联网 发布:手机淘宝红包链接转换 编辑:程序博客网 时间:2024/06/07 05:00

封装的OkHttp

package bwie.com.mvpokhttprecyclerview.okhttp_modle;import android.os.Handler;import android.util.Log;import java.io.IOException;import java.util.Map;import okhttp3.Call;import okhttp3.FormBody;import okhttp3.OkHttpClient;import okhttp3.Request;import okhttp3.Response;/** * Author: J & J * Time:2017/11/10 * Effect:OkHttp类 **/public class HttpUtils {    private static final String TAG = "HttpUtils";    private static volatile HttpUtils instance;    public static Handler handler = new Handler();    public static HttpUtils getInstance() {        if (null == instance) {            synchronized (HttpUtils.class) {                if (instance == null) {                    instance = new HttpUtils();                }            }        }        return instance;    }    /**     * 对外提供的get请求     * @param url     * @param map     * @param callback     * @param cls     * @param tag     **/    public void get(String url, Map<String, String> map, final Callback callback, final Class cls, final String tag) {        // 对url和参数做一下拼接处理//        http://www.baidu.com/login?name=zs        StringBuffer sb = new StringBuffer();        sb.append(url);        // 如果存在?        if (sb.indexOf("?") != -1) {            // 如果?不在最后一位            if (sb.indexOf("?") != sb.length() - 1) {                sb.append("&");            }        } else {            sb.append("?");        }        for (Map.Entry<String, String> entry : map.entrySet()) {            sb.append(entry.getKey())                    .append("=")                    .append(entry.getValue())                    .append("&");        }        if (sb.indexOf("&") != -1) {            sb.deleteCharAt(sb.lastIndexOf("&"));        }        Log.i(TAG, "get url: " + sb);        OkHttpClient client = new OkHttpClient();        final Request request = new Request.Builder()                .get()                .url(sb.toString())                .build();        Call call = client.newCall(request);        call.enqueue(new okhttp3.Callback() {            @Override            public void onFailure(Call call, final IOException e) {                Log.e(TAG, "onFailure: " + e.getCause().getStackTrace() + e.getMessage());                handler.post(new Runnable() {                    @Override                    public void run() {                        callback.onshibai(tag, e);                    }                });            }            @Override            public void onResponse(Call call, Response response) throws IOException {                String result = response.body().string();                Log.i(TAG, "onResponse: " + result);                final Object o = GsonUtils.getInstance().fromJson(result, cls);                handler.post(new Runnable() {                    @Override                    public void run() {                        callback.oncheng(tag, o);                    }                });            }        });    }    /**     * 封装的post请求     *     * @param url     * @param map     * @param callback     * @param cls     */    public void post(String url, Map<String, String> map, final Callback callback, final Class cls, final String tag) {        OkHttpClient client = new OkHttpClient();        FormBody.Builder builder = new FormBody.Builder();        for (Map.Entry<String, String> entry : map.entrySet()) {            builder.add(entry.getKey(), entry.getValue());        }        FormBody body = builder.build();        final Request request = new Request.Builder()                .url(url)                .post(body)                .build();        Call call = client.newCall(request);        call.enqueue(new okhttp3.Callback() {            @Override            public void onFailure(Call call, final IOException e) {                Log.e(TAG, "onFailure: " + e.getCause().getStackTrace() + e.getMessage());                handler.post(new Runnable() {                    @Override                    public void run() {                        callback.onshibai(tag, e);                    }                });            }            @Override            public void onResponse(Call call, Response response) throws IOException {                String result = response.body().string();                Log.i(TAG, "onResponse: " + result);                final Object o = GsonUtils.getInstance().fromJson(result, cls);                handler.post(new Runnable() {                    @Override                    public void run() {                        callback.oncheng(tag, o);                    }                });            }        });    }}===============================
package bwie.com.mvpokhttprecyclerview.okhttp_modle;import com.google.gson.Gson;/**
 * Author: J & J * Time:2017/11/10 * Effect: **/
public class GsonUtils {
private static Gson gson;
public static
Gson getInstance() {
if (gson == null) {
gson = new Gson();
}
return gson;
}
}
==============================
package bwie.com.mvpokhttprecyclerview.okhttp_modle;/*** Author: J & J* Time:2017/11/10* Effect:OkHttp的接口**/public interface Callback {    //失败    void  onshibai(String tag,Exception e);    //成功    void  oncheng(String tag,Object o);}============================= 
V层 视图层
package bwie.com.mvpokhttprecyclerview.view;import java.util.List;import bwie.com.mvpokhttprecyclerview.bean.NewsBean;/** * Author: J & J * Time:2017/11/10 * Effect:视图的接口 **/public interface INewsView {    //失败    void failed(String tag, Exception e);    //成功    void success(List<NewsBean.NewslistBean> data);}============================
package bwie.com.mvpokhttprecyclerview.view;import java.util.List;import bwie.com.mvpokhttprecyclerview.bean.NewsBean;/** * Author: J & J * Time:2017/11/10 * Effect:视图的接口 **/public interface INewsView {    //失败    void failed(String tag, Exception e);    //成功    void success(List<NewsBean.NewslistBean> data);}====================================
package bwie.com.mvpokhttprecyclerview.view;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 java.util.ArrayList;import java.util.List;import bwie.com.mvpokhttprecyclerview.R;import bwie.com.mvpokhttprecyclerview.adapter.NewsListAdapter;import bwie.com.mvpokhttprecyclerview.bean.NewsBean;import bwie.com.mvpokhttprecyclerview.presenter.NewsPresenter;/** * Author: J & J * Time:2017/11/10 * Effect: **/public class MainActivity extends AppCompatActivity implements INewsView {    private static final String TAG = "MainActivity";    private RecyclerView recyclerView;    private NewsListAdapter adapter;    private List<NewsBean.NewslistBean> list;    private NewsPresenter presenter;    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_main);        recyclerView = (RecyclerView) findViewById(R.id.rv_news);        presenter = new NewsPresenter();        presenter.attachView(this);        list = new ArrayList<>();        adapter = new NewsListAdapter(this, list);        LinearLayoutManager linearLayoutManager = new LinearLayoutManager(this);        recyclerView.setLayoutManager(linearLayoutManager);        recyclerView.setAdapter(adapter);        presenter.getNews();    }    @Override    public void failed(String tag, Exception e) {        Log.i("========", "failed:" + e.getMessage());    }    @Override    public void success(List<NewsBean.NewslistBean> news) {        Log.i("========", "success:" + news);        if (news != null) {            list.addAll(news);            adapter.notifyDataSetChanged();        }    }    @Override    protected void onDestroy() {        super.onDestroy();        presenter.detachView();    }}========================= Adapter类
package bwie.com.mvpokhttprecyclerview.adapter;import android.content.Context;import android.support.v7.widget.RecyclerView;import android.view.View;import android.view.ViewGroup;import android.widget.ImageView;import android.widget.TextView;import com.bumptech.glide.Glide;import java.util.List;import bwie.com.mvpokhttprecyclerview.R;import bwie.com.mvpokhttprecyclerview.bean.NewsBean;/** * Author: J & J * Time:2017/11/10 * Effect: **/public class NewsListAdapter extends RecyclerView.Adapter<NewsListAdapter.ViewHolder> {    private Context context;    private List<NewsBean.NewslistBean> list;    public NewsListAdapter(Context context, List<NewsBean.NewslistBean> list) {        this.context = context;        this.list = list;    }    @Override    public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {        View v = View.inflate(context, R.layout.item_news, null);        ViewHolder viewHolder = new ViewHolder(v);        return viewHolder;    }    @Override    public void onBindViewHolder(ViewHolder holder, int position) {        Glide.with(context).load(list.get(position).getPicUrl()).into(holder.imageView);        holder.txtTime.setText(list.get(position).getCtime());        holder.txtTitle.setText(list.get(position).getTitle());    }    @Override    public int getItemCount() {        return list.size();    }    class ViewHolder extends RecyclerView.ViewHolder {        private ImageView imageView;        private TextView txtTitle;        private TextView txtTime;        public ViewHolder(View itemView) {            super(itemView);            txtTime = (TextView) itemView.findViewById(R.id.txt_time);            txtTitle = (TextView) itemView.findViewById(R.id.txt_title);            imageView = (ImageView) itemView.findViewById(R.id.img_logo);        }    }}========================P层  用于模型层和视图层进行数据交互 
package bwie.com.mvpokhttprecyclerview.presenter;import android.util.Log;import java.util.HashMap;import java.util.List;import java.util.Map;import bwie.com.mvpokhttprecyclerview.bean.NewsBean;import bwie.com.mvpokhttprecyclerview.okhttp_modle.Callback;import bwie.com.mvpokhttprecyclerview.okhttp_modle.HttpUtils;import bwie.com.mvpokhttprecyclerview.view.INewsView;/** * Author: J & J * Time:2017/11/10 * Effect:模型层和视图层的桥梁 **/public class NewsPresenter {    private INewsView inv;    public void attachView(INewsView inv) {        this.inv = inv;    }    //进行网络请求    public void getNews() {        //http://api.tianapi.com/meinv/?key=4a82473783694ddebd495d47b16c906e&num=10        //创建map集合 用于存放接口对接的值        Map<String, String> map = new HashMap<>();        //   key=0ebe1b7e56a73c2bf2e68b76342c5a65&num=50        map.put("key", "4a82473783694ddebd495d47b16c906e");        map.put("num", "50");        HttpUtils.getInstance().get("http://api.tianapi.com/meinv/", map, new Callback() {            //网络请求失败时            @Override            public void onshibai(String tag, Exception e) {                Log.i("===========", "onshibai: ");                //调用失败的方法                inv.failed(tag, e);            }            //请求成功是            @Override            public void oncheng(String tag, Object o) {                Log.i("===========", "oncheng: ");                NewsBean bean = (NewsBean) o;                if (bean != null) {                    List<NewsBean.NewslistBean> data = bean.getNewslist();                    //调用成功的方法                    inv.success(data);                }            }        }, NewsBean.class, "tag");    }    public void detachView() {        if (inv != null) {            inv = null;        }    }}添加权限
<uses-permission android:name="android.permission.INTERNET"/>    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>    <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>    <uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS"/>注入依赖----常用
repositories {    mavenCentral()    maven { url 'https://maven.google.com' }}dependencies {    compile fileTree(include: ['*.jar'], dir: 'libs')    androidTestCompile('com.android.support.test.espresso:espresso-core:2.2.2', {        exclude group: 'com.android.support', module: 'support-annotations'    })    compile 'com.android.support:appcompat-v7:25.3.1'    compile 'com.android.support.constraint:constraint-layout:1.0.2'    compile 'com.squareup.okhttp3:okhttp:3.9.0'    compile 'com.google.code.gson:gson:2.8.1'    compile 'com.github.bumptech.glide:glide:4.3.1'    annotationProcessor 'com.github.bumptech.glide:compiler:4.3.1'    testCompile 'junit:junit:4.12'    compile 'com.android.support:recyclerview-v7:25.3.1'}




 



 

 



 


原创粉丝点击