使用MVP模式+Retrofit+Fresco加载网络数据

今天写了一个使用MVP架构模式的网络请求数据的Demo,网络请求的是使用了Retrofit请求

自带了Gson解析,Fresco加载网络图片,使用recyclerview展示数据。首先,先把需要用到的依赖导入


compile 'com.android.support:appcompat-v7:26.+'
    compile 'com.android.support.constraint:constraint-layout:1.0.2'
    testCompile 'junit:junit:4.12'
    compile 'com.android.support:recyclerview-v7:26.+'
    compile 'com.squareup.okhttp3:okhttp:3.9.0'
    compile 'com.squareup.retrofit2:retrofit:2.3.0'
    compile 'com.squareup.retrofit2:converter-gson:2.3.0'
    compile 'io.reactivex.rxjava2:rxjava:2.1.6'
    compile 'com.squareup.retrofit2:adapter-rxjava:2.3.0'
    compile 'com.facebook.fresco:fresco:1.5.0'

先做准备工作,建立一个App,初始化Fresco

public class App extends Application {

    @Override
    public void onCreate() {
        super.onCreate();
        Fresco.initialize(this);
    }
}

不要忘了在清单文件里面配置App,还有不要忘了加网络权限,

main_layout

<?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="com.example.a1106lianxi.MainActivity">

    <RelativeLayout
        android:layout_width="match_parent"
        android:layout_height="50dp"
        android:background="#FF4081">

        <TextView
            android:id="@+id/tv_f"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_alignParentLeft="true"
            android:layout_centerVertical="true"
            android:paddingLeft="10dp"
            android:paddingRight="10dp"
            android:text="←"
            android:textColor="#ffffff"
            android:textSize="30sp" />

        <TextView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_centerInParent="true"
            android:layout_centerVertical="true"
            android:paddingLeft="10dp"
            android:paddingRight="15dp"
            android:text="我的收藏"
            android:textColor="#ffffff"
            android:textSize="15sp" />

        <TextView
            android:id="@+id/tv_bian"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_alignParentRight="true"
            android:layout_centerVertical="true"
            android:paddingLeft="10dp"
            android:paddingRight="15dp"
            android:text="编辑"
            android:textColor="#ffffff"
            android:textSize="15sp" />

    </RelativeLayout>
    <FrameLayout
        android:layout_width="match_parent"
        android:layout_height="0dp"
        android:layout_weight="1">

        <android.support.v7.widget.RecyclerView
            android:id="@+id/rv"

            android:layout_width="match_parent"
            android:layout_height="match_parent">

        </android.support.v7.widget.RecyclerView>
    </FrameLayout>
</LinearLayout>
布局写好了再去实现view层的接口,然后MainActivity实现接口,重写接口的方法

public interface IMusicView {
    public void showData(List<MusicBean.SongListBean> bean);
}
model创建接口,实现方法

public interface IMusicModel {
    public Retrofit getUrl(String path);
}
这里用到了一个拦截器,数据源必须加这个拦截器才能出数据

public class LoggingInterceptor implements Interceptor {
    private static final String UA = "User-Agent";

    @Override
    public Response intercept(Chain chain) throws IOException {
        Request request = chain.request()
                .newBuilder()
                .addHeader(UA, makeUA())
                .build();
        return chain.proceed(request);
    }

    private String makeUA() {
        String s = Build.BRAND + "/" + Build.MODEL + "/" + Build.VERSION.RELEASE;
        return Build.BRAND + "/" + Build.MODEL + "/" + Build.VERSION.RELEASE;
    }

}
把这个拦截器加到Retrofit里面去

public class MusicModel implements IMusicModel {
    @Override
    public Retrofit getUrl(String path) {
        OkHttpClient client = new OkHttpClient.Builder()
                .addInterceptor(new LoggingInterceptor())
                .build();
        Retrofit retrofit = new Retrofit.Builder()
                .baseUrl(path)
                .addConverterFactory(GsonConverterFactory.create())
                .client(client)
                .build();
        return retrofit;
    }
}

presenter

public class MusicPresenter {
    Context context;
    IMusicModel model;
    IMusicView view;
    List<MusicBean.SongListBean> list;

    public MusicPresenter(Context context, IMusicView view) {
        this.context = context;
        this.view = view;
        model = new MusicModel();
    }
    public void showdata(){
        Retrofit rf = model.getUrl("http://tingapi.ting.baidu.com/");
        MusicService ms = rf.create(MusicService.class);
        ms.getda().enqueue(new Callback<MusicBean>() {
            @Override
            public void onResponse(Call<MusicBean> call, Response<MusicBean> response) {
                MusicBean mb = response.body();
                list = new ArrayList<MusicBean.SongListBean>();
                list.addAll(mb.getSong_list());
                Log.i("+++++list++++++", "onResponse: "+list.toString());
                view.showData(list);
            }

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

            }
        });
    }
}

需要创建一个service接口

public interface MusicService {
    @GET("v1/restserver/ting?method=baidu.ting.billboard.billList&type=1&size=20&offset=0")
    Call<MusicBean> getda();
}
注解的方式
创建recyclerview适配器,创建子布局

public class MusicAdapter extends RecyclerView.Adapter<MusicAdapter.MyViewHolder> {

    List<MusicBean.SongListBean> list;
    Context context;

    public MusicAdapter(List<MusicBean.SongListBean> list, Context context) {
        this.list = list;
        this.context = context;
    }

    @Override
    public MyViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
        View view = View.inflate(context, R.layout.item,null);
        MyViewHolder holder = new MyViewHolder(view);
        return holder;
    }

    @Override
    public void onBindViewHolder(MyViewHolder holder, int position) {
        holder.tv.setText(list.get(position).getTitle());
        Uri uri = Uri.parse(list.get(position).getPic_small());
        holder.iv.setImageURI(uri);
    }

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

    class MyViewHolder extends RecyclerView.ViewHolder {

        TextView tv;
        ImageView iv;

        public MyViewHolder(View itemView) {
            super(itemView);
            tv = itemView.findViewById(R.id.tv_title);
            iv = itemView.findViewById(R.id.iv_title);
        }
    }
}

布局

<?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"
    android:orientation="horizontal">
    <com.facebook.drawee.view.SimpleDraweeView
        android:id="@+id/iv_title"
        android:layout_width="200dp"
        android:layout_height="200dp"
        android:layout_gravity="center"
        android:src="@mipmap/ic_launcher"/>
    <TextView
        android:id="@+id/tv_title"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_gravity="center"
        android:text="哈哈哈哈哈哈哈哈哈"/>

</LinearLayout>


主方法调用,与presenter交互

public class MainActivity extends Activity implements IMusicView, View.OnClickListener {

    private RecyclerView rv;
    List<MusicBean.SongListBean> mlist;
    private TextView mFTv;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        initView();
        MusicPresenter presenter = new MusicPresenter(this, this);
        presenter.showdata();
    }

    private void initView() {
        rv = (RecyclerView) findViewById(R.id.rv);
        mFTv = (TextView) findViewById(R.id.tv_f);
        mFTv.setOnClickListener(this);
    }

    @Override
    public void showData(List<MusicBean.SongListBean> bean) {
        mlist = bean;
        rv.setLayoutManager(new LinearLayoutManager(this));
        MusicAdapter adapter = new MusicAdapter(mlist, this);
        rv.setAdapter(adapter);
    }

    @Override
    public void onClick(View v) {
        switch (v.getId()) {
            case R.id.tv_f:
                Tuichu();
                break;
            default:
                break;
        }
    }
    private void Tuichu() {
        new AlertDialog.Builder(this)
                .setTitle("确认")
                .setMessage("确认要删除吗?")
                .setPositiveButton("是", new DialogInterface.OnClickListener() {
                    @Override
                    public void onClick(DialogInterface dialogInterface, int i) {
                        finish();
                    }
                })
                .setNegativeButton("否", null)
                .show();
    }
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
对于Android项目中的网络请求,RxJava、RetrofitMVP是常用的框架组合。下面是一个简单的网络框架封装示例: 首先,在项目中引入RxJava和Retrofit的依赖。 ``` implementation 'io.reactivex.rxjava2:rxjava:2.2.19' implementation 'io.reactivex.rxjava2:rxandroid:2.1.1' implementation 'com.squareup.retrofit2:retrofit:2.9.0' implementation 'com.squareup.retrofit2:converter-gson:2.9.0' implementation 'com.squareup.retrofit2:adapter-rxjava2:2.9.0' ``` 然后,创建一个Retrofit的单例类,用于进行网络请求的初始化和配置。 ```java public class RetrofitClient { private static Retrofit retrofit; private static final String BASE_URL = "https://api.example.com/"; public static Retrofit getClient() { if (retrofit == null) { retrofit = new Retrofit.Builder() .baseUrl(BASE_URL) .addConverterFactory(GsonConverterFactory.create()) .addCallAdapterFactory(RxJava2CallAdapterFactory.create()) .build(); } return retrofit; } } ``` 接下来,创建一个ApiService接口,定义网络请求的方法。 ```java public interface ApiService { @GET("users") Observable<List<User>> getUsers(); } ``` 然后,创建一个DataManager类,用于管理网络请求。 ```java public class DataManager { private ApiService apiService; public DataManager() { apiService = RetrofitClient.getClient().create(ApiService.class); } public Observable<List<User>> getUsers() { return apiService.getUsers(); } } ``` 最后,在MVP的Presenter中调用DataManager类进行网络请求。 ```java public class UserPresenter { private UserView userView; private DataManager dataManager; public UserPresenter(UserView userView) { this.userView = userView; dataManager = new DataManager(); } public void getUsers() { dataManager.getUsers() .subscribeOn(Schedulers.io()) .observeOn(AndroidSchedulers.mainThread()) .subscribe(new Observer<List<User>>() { @Override public void onSubscribe(Disposable d) { // 在请求开始时的操作 } @Override public void onNext(List<User> users) { // 请求成功返回数据时的操作 userView.showUsers(users); } @Override public void onError(Throwable e) { // 请求失败时的操作 userView.showError(e.getMessage()); } @Override public void onComplete() { // 请求完成时的操作 } }); } } ``` 这样,就完成了一个简单的Android RxJava + Retrofit + MVP网络框架封装。你可以根据自己的需要,进行进一步的封装和扩展。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值