Retrofit+Rxjava的数据请求

本文介绍了一个使用Retrofit进行网络请求的具体实现案例,包括接口定义、数据模型、请求回调、Presenter层逻辑处理以及UI展示等关键部分。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一.Api
1.
GetDataInterface
 
public interface GetDataInterface {
     @GET("/toutiao/index")
     Call<UserBean> get(@Query("key") String key);

    @FormUrlEncoded
    @POST("/toutiao/index")
    Call<UserBean> post(@Field("key") String key);

}

2.
MyApi



 
public class MyApi extends Application{
    //设置公共变量
    public static DaoSession session;
    public static GetDataInterface request;
    @Override
    public void onCreate() {
        super.onCreate();
        //1.  用于全局配置初始化Fresco 图片加载
        Fresco.initialize(this);
        //2.  用于全局配置初始化Retrofit 网络请求
        //构建Retrofit类,初始化参数
        Retrofit retrofit = new Retrofit.Builder()
                .baseUrl(HttpUtils.goods_url)
                .addConverterFactory(GsonConverterFactory.create())
                .addCallAdapterFactory(RxJava2CallAdapterFactory.create())
                .build();
        //创建网络请求接口实例
        request = retrofit.create(GetDataInterface.class);
        //3.  用于全局配置初始化GreenDao数据库

//        DaoMaster.DevOpenHelper database = new DaoMaster.DevOpenHelper(this, "database");
//        Database db = database.getWritableDb();             //获取能读能写的数据库
//        session = new DaoMaster(db).newSession();

    }
}

3.HttpUtils

 
public class HttpUtils {
    public static String goods_url = "http://v.juhe.cn";
}

二.Model
1.
ModelCallBack
 public interface ModelCallBack {
    public void onSuccess(UserBean bean);
    public void onError(Exception e);
}
2.
MyModel
 
public class MyModel {
    /**
     * get请求
     * @param callBack
     */
    public void getData(final ModelCallBack callBack){
        //设置接口请求的key值
        Call<UserBean> call = MyApi.request.get("c4479ad58f41e7f78a8fa073d0b1f1b5");
        call.enqueue(new Callback<UserBean>() {
            @Override
            public void onResponse(Call<UserBean> call, Response<UserBean> response) {
                //获取响应的数据,保存在数据库中
               UserBean bean = response.body();
             // MyApi.session.getUserDao().insertInTx(bean.getResult().getData());
               callBack.onSuccess(bean);
            }

            @Override
            public void onFailure(Call<UserBean> call, Throwable t) {
                //请求失败时返回数据
                callBack.onError(new Exception(""));

            }
        });
    }

    /**
     * post请求
     * @param callBack
     */
    public void postData(final ModelCallBack callBack){
        //设置接口请求的key值
        Call<UserBean> call = MyApi.request.post("c4479ad58f41e7f78a8fa073d0b1f1b5");

        //发起异步请求
        call.enqueue(new Callback<UserBean>() {
            @Override
            public void onResponse(Call<UserBean> call, Response<UserBean> response) {
                UserBean bean= response.body();
                //MyApi.session.getUserDao().insertInTx(bean.getResult().getData());
                callBack.onSuccess(bean);
            }

            @Override
            public void onFailure(Call<UserBean> call, Throwable t) {
                 callBack.onError(new Exception(""));
            }
        });
    }


}

三.Presenter
1.
MyPresenter
public class MyPresenter {
    private MyView myView;
    private MyModel myModel;

    public MyPresenter(MyView myView) {
        this.myView = myView;
        this.myModel = new MyModel();
    }
    public void get(){
       myModel.getData(new ModelCallBack() {
           @Override
           public void onSuccess(UserBean bean) {
                if(myView != null){
                    myView.onSuccess(bean);
                }
           }

           @Override
           public void onError(Exception e) {
               if(myView != null){
                   myView.onError(e);
               }
           }
       });
    }

    /**
     * post请求数据交互
     */
    public void post() {
        myModel.postData(new ModelCallBack() {
            @Override
            public void onSuccess(UserBean bean) {
                //数据交互时,为防止内存泄露,设置view层数据为空
                if (myView != null){
                    myView.onSuccess(bean);
                }

            }

            @Override
            public void onError(Exception e) {
                //数据交互时,为防止内存泄露,设置view层数据为空
                if (myView != null){
                    myView.onError(e);
                }

            }
        });
    }
    }

四.View
1.MyView
 
public interface MyView {
    public void onSuccess(UserBean bean);
    public void onError(Exception e);
}

2.MainActivity

 
public class MainActivity extends AppCompatActivity implements MyView{

    @BindView(R.id.recyclerView)
    RecyclerView recyclerView;
    private MyPresenter presenter;
    private MyAdapter adapter;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        ButterKnife.bind(this);
        initData();
    }

    private void initData() {
        //创建Presenter层实例,与view层交互
        presenter = new MyPresenter(this);
        //get请求方式
        presenter.get();

        //设置布局管理器以及布局适配器
        LinearLayoutManager manager = new LinearLayoutManager(this, LinearLayoutManager.VERTICAL, false);
        adapter = new MyAdapter(this);
        recyclerView.setLayoutManager(manager);
        recyclerView.setAdapter(adapter);

        //遍历查询数据库中的所有数据
        //List<UserBean> list = MyApi.session.getUserDao().loadAll();
        //for (DataBean listBean : list){
          //  System.out.println("查询:"+listBean.toString());
        //}

    }

    @Override
    public void onSuccess(UserBean bean) {
       adapter.addData(bean);
    }

    @Override
    public void onError(Exception e) {
        System.out.println("数据出错:"+e);
    }
}

2.5  activity_main
<LinearLayout
android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical"> <android.support.v7.widget.RecyclerView android:id="@+id/recyclerView" android:layout_width="match_parent" android:layout_height="match_parent"></android.support.v7.widget.RecyclerView> </LinearLayout>
3.MyAdapter

 
public class MyAdapter extends RecyclerView.Adapter<MyAdapter.MyViewHolder>{
    private Context context;
    private List<UserBean.ResultBean.DataBean> list;

    public MyAdapter(Context context) {
        this.context = context;
    }

    //添加数据
    public void addData(UserBean bean) {
        if (list == null) {
            list = new ArrayList<>();
        }
        list.addAll(bean.getResult().getData());
        notifyDataSetChanged();
    }


    @Override
    public MyViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
        //添加布局视图
        View view = View.inflate(context, R.layout.adapter, null);
        return new MyViewHolder(view);
    }

    @Override
    public void onBindViewHolder(MyViewHolder holder, int position) {
          holder.title.setText(list.get(position).getTitle());
        DraweeController controller = Fresco.newDraweeControllerBuilder()
                .setUri(list.get(position).getThumbnail_pic_s())
                .setOldController(holder.draweeView.getController())//内存优化  
                .setAutoPlayAnimations(true)
                .build();
        holder.draweeView.setController(controller);
    }

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

    class MyViewHolder extends RecyclerView.ViewHolder{

        @BindView(R.id.draweeView)
        SimpleDraweeView draweeView;
        @BindView(R.id.title)
        TextView title;
        public MyViewHolder(View itemView) {
            super(itemView);
            ButterKnife.bind(this,itemView);
        }
    }
}

3.5  adapter
<LinearLayout 
    android:orientation="horizontal"
    android:padding="6dp"
    xmlns:fresco="http://schemas.android.com/apk/res-auto"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <com.facebook.drawee.view.SimpleDraweeView
        android:id="@+id/draweeView"
        android:layout_width="100dp"
        android:layout_height="100dp"
        android:layout_marginLeft="6dp"
        fresco:placeholderImage="@drawable/app_default"
        fresco:placeholderImageScaleType="fitCenter"
        fresco:actualImageScaleType="focusCrop"
        fresco:failureImage="@drawable/load_error_image"
        fresco:failureImageScaleType="fitCenter"
        fresco:roundAsCircle="true"/>
    <TextView
        android:id="@+id/title"
        android:textSize="18sp"
        android:textStyle="bold"
        android:layout_marginLeft="6dp"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_gravity="center_vertical"/>

</LinearLayout>
五.权限与依赖
1.依赖

project的
dependencies { classpath 'com.android.tools.build:gradle:2.3.0' classpath 'com.jakewharton:butterknife-gradle-plugin:8.5.1' classpath 'org.greenrobot:greendao-gradle-plugin:3.2.0'//greenDao生产代码插件 // NOTE: Do not place your application dependencies here; they belong // in the individual module build.gradle files }
Module的

apply plugin: 'com.android.application' apply plugin: 'com.jakewharton.butterknife' apply plugin: 'org.greenrobot.greendao'//greendao插件

compile 'com.jakewharton:butterknife:8.8.1' annotationProcessor 'com.jakewharton:butterknife-compiler:8.8.1' //retrofit的两个依赖 compile 'com.squareup.retrofit2:retrofit:2.3.0' compile 'com.squareup.retrofit2:converter-gson:2.3.0' //eventbus的依赖 compile 'org.greenrobot:eventbus:3.1.1' //fresco的依赖 compile 'com.facebook.fresco:fresco:1.5.0' compile 'com.squareup.retrofit2:adapter-rxjava2:2.2.0' compile 'io.reactivex.rxjava2:rxandroid:2.0.1' //greendao两个依赖 compile 'org.greenrobot:greendao:3.2.2' compile 'net.zetetic:android-database-sqlcipher:3.5.7@aar' //recyclerview依赖 compile 'com.android.support:recyclerview-v7:25.3.1'
greendao { schemaVersion 1 daoPackage 'com.example.lenovo.retrofit_ceshi0629.dao'//自己的包名+.dao targetGenDir 'src/main/java' }

//版本
configurations.all { resolutionStrategy.eachDependency { DependencyResolveDetails details -> def requested = details.requested if (requested.group == 'com.android.support') { if (!requested.name.startsWith("multidex")) { details.useVersion '25.2.0' } } } }
2.权限

<uses-permission android:name="android.permission.INTERNET"/>

   
<application    
android:name=".api.MyApi"
></application>
六.GreenDao

1.User
@Entity//必须写的 public class User { @Id(autoincrement =true)//自增 private Long tid;//自己加的字段
}

之后Make Project就会自动创建Dao包

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值