关于Retrofit的逐渐认识(一)

本文介绍如何在Android应用中整合Retrofit和RxJava实现高效网络请求,包括依赖配置、请求封装及响应处理等关键步骤。

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


只用Retrofit

首先项目中Gradule中导入  依赖
 compile 'io.reactivex:rxjava:1.1.0'
    compile 'io.reactivex:rxandroid:1.1.0'
    compile 'com.squareup.retrofit2:retrofit:2.0.0-beta4'
    compile 'com.squareup.retrofit2:converter-gson:2.0.0-beta4'
    compile 'com.squareup.retrofit2:adapter-rxjava:2.0.0-beta4'
    compile 'com.google.code.gson:gson:2.6.2'

相关的联网权限不要忘了

然后我们请求这个网址:
https://api.douban.com/v2/movie/top250?start=0&count=10

Activity的布局 很简单  一个按钮,联网请求  下方显示联网请求后的结果
首先,在onCreate()方法中 初始化代码:
 mRetrofit = new Retrofit.Builder()
                .baseUrl(UrlConstant.baseUrl)
                .addConverterFactory(GsonConverterFactory.create())
                .build();

根据上面的网址, 封装一个Entity, 暂命名为MoviceEntity,

然后我们创建一个接口,取名为MoviceService,  代码如下:

public interface MoviceService {
    
    //top250  为baseUrl后面的,  而下方的Query的两个参数为?后面拼接的内容,在创建MoviceService的时候传入具体的值
   @GET("top250")
    Call<MoviceEntity> getTop(@Query("start") int start,@Query("count") int count);
}

回到Activity中,我们来写请求网络的代码, 

package com.example.retrofitdemo;

import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.view.View;
import android.widget.Button;
import android.widget.LinearLayout;
import android.widget.TextView;
import android.widget.Toast;

import com.example.retrofitdemo.bean.MoviceEntity;

import butterknife.Bind;
import butterknife.ButterKnife;
import retrofit2.Call;
import retrofit2.Callback;
import retrofit2.Response;
import retrofit2.Retrofit;
import retrofit2.converter.gson.GsonConverterFactory;

/**
 * https://api.douban.com/v2/movie/top250?start=0&count=10
 */
public class MainActivity extends AppCompatActivity implements View.OnClickListener {

    @Bind(R.id.tv)
    TextView mTv;
    @Bind(R.id.activity_main)
    LinearLayout mActivityMain;
    @Bind(R.id.bt)
    Button mButton;
    private Retrofit mRetrofit;


    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        ButterKnife.bind(this);

        mButton.setOnClickListener(this);

        mRetrofit = new Retrofit.Builder()
                .baseUrl(UrlConstant.baseUrl)
                .addConverterFactory(GsonConverterFactory.create())
                .build();
    }


    @Override
    public void onClick(View view) {
                getMovie();
    }


    private void getMovie() {
        //MoviceService接口对象 是通过mRetrofit create()
        MoviceService moviceService = mRetrofit.create(MoviceService.class);
        //传入具体的值,生成call对象
        Call<MoviceEntity> moviceEntityCall = moviceService.getTop(0, 10);
        moviceEntityCall.enqueue(new Callback<MoviceEntity>() {
            @Override
            public void onResponse(Call<MoviceEntity> call, Response<MoviceEntity> response) {
                String str = response.body().toString();
                mTv.setText(str);
            }

            @Override
            public void onFailure(Call<MoviceEntity> call, Throwable t) {
                Toast.makeText(MainActivity.this,t.toString(),Toast.LENGTH_LONG).show();
            }
        });
    }
}

以上为没有经过封装的,原生态的代码, 没有使用到RxJava  但是如果我们的Http返回的数据是统一的格式,例如:
{
    "resultCode": 0,
     "resultMessage" : "成功",
      "data" : {}
}

而且, 我的ProgressDialog的show() 在哪里调用呢?  在错误请求中 也想集中处理掉重复的代码

添加RxJava

在Gradule中添加 :
compile 'com.squareup.retrofit2:adapter-rxjava:2.0.0-beta4'
然后在创建Retrofit中 链式多添加一条
.addCallAdapterFactory(RxJavaCallAdapterFactory.create())
这样 MoviceService接口中 我们返回值就不是一个Call了  而是一个Observable, 重新定义MoviceService接口
public interface MovieService {
    @GET("top250")
    Observable<MovieEntity> getTopMovie(@Query("start") int start, @Query("count") int count);
}

MainActivity中的联网请求代码:
package com.example.retrofitdemo;

import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.view.View;
import android.widget.Button;
import android.widget.LinearLayout;
import android.widget.TextView;
import android.widget.Toast;

import com.example.retrofitdemo.bean.MoviceEntity;

import butterknife.Bind;
import butterknife.ButterKnife;
import retrofit2.Retrofit;
import retrofit2.adapter.rxjava.RxJavaCallAdapterFactory;
import retrofit2.converter.gson.GsonConverterFactory;
import rx.Subscriber;
import rx.android.schedulers.AndroidSchedulers;
import rx.schedulers.Schedulers;

/**
 * https://api.douban.com/v2/movie/top250?start=0&count=10
 */
public class MainActivity extends AppCompatActivity implements View.OnClickListener {

    @Bind(R.id.tv)
    TextView mTv;
    @Bind(R.id.activity_main)
    LinearLayout mActivityMain;
    @Bind(R.id.bt)
    Button mButton;
    private Retrofit mRetrofit;


    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        ButterKnife.bind(this);

        mButton.setOnClickListener(this);

        mRetrofit = new Retrofit.Builder()
                .baseUrl(UrlConstant.baseUrl)
                .addConverterFactory(GsonConverterFactory.create())
                .addCallAdapterFactory(RxJavaCallAdapterFactory.create())   //添加RxJavaCallAdapterFactory
                .build();
    }


    @Override
    public void onClick(View view) {
        getMovie();
    }


    private void getMovie() {
        //MoviceService接口对象 是通过mRetrofit create()
        MoviceService moviceService = mRetrofit.create(MoviceService.class);
        //传入具体的值,生成call对象
//        Call<MoviceEntity> moviceEntityCall = moviceService.getTop(0, 10);
//        moviceEntityCall.enqueue(new Callback<MoviceEntity>() {
//            @Override
//            public void onResponse(Call<MoviceEntity> call, Response<MoviceEntity> response) {
//                String str = response.body().toString();
//                mTv.setText(str);
//            }
//
//            @Override
//            public void onFailure(Call<MoviceEntity> call, Throwable t) {
//                Toast.makeText(MainActivity.this,t.toString(),Toast.LENGTH_LONG).show();
//            }
//        });

        //添加RxJava
       moviceService.getTop(0,10)
               .subscribeOn(Schedulers.io())   //在线程订阅
                .observeOn(AndroidSchedulers.mainThread())   //在主线程观察
                .subscribe(new Subscriber<MoviceEntity>() {
                    @Override
                    public void onCompleted() {
                        Toast.makeText(MainActivity.this, "Get Top Movie Completed", Toast.LENGTH_SHORT).show();
                    }

                    @Override
                    public void onError(Throwable e) {

                    }

                    @Override
                    public void onNext(MoviceEntity moviceEntity) {
                        String str = moviceEntity.toString();
                        mTv.setText(str);
                    }
                });
    }
}

这就完成了Retrofit和RxJava的结合,  接下来我们把创建Retrofit的过程封装一下,然后希望Activity创建Subscriber对象进来


将请求过程进行封装

直接贴 封装的HttpMethod类的代码:
package com.example.retrofitdemo;

import com.example.retrofitdemo.bean.MoviceEntity;

import java.util.concurrent.TimeUnit;

import okhttp3.OkHttpClient;
import retrofit2.Retrofit;
import retrofit2.adapter.rxjava.RxJavaCallAdapterFactory;
import retrofit2.converter.gson.GsonConverterFactory;
import rx.Subscriber;
import rx.android.schedulers.AndroidSchedulers;
import rx.schedulers.Schedulers;

/**
 * Created by zmybi on 2017/1/13.
 *
 * 将请求进行封装的类
 */

public class HttpMethod {

    private String baseUrl = UrlConstant.baseUrl;


    private Retrofit mRetrofit;
    private MoviceService mMoviceService;

    //私有构造方法
    private HttpMethod() {
        //手动设置一个OkHttpClient并设置超时时间
        OkHttpClient.Builder httpClient = new OkHttpClient.Builder();
        httpClient.connectTimeout(2, TimeUnit.SECONDS);   //设置2秒超时

        mRetrofit = new Retrofit.Builder()
                .baseUrl(baseUrl)
                .addConverterFactory(GsonConverterFactory.create())
                .addCallAdapterFactory(RxJavaCallAdapterFactory.create())
                .build();

        mMoviceService = mRetrofit.create(MoviceService.class);
    }

    //对外提供公共的获得方法
    public static HttpMethod getInstance() {
        HttpMethod httpMethod = new HttpMethod();
        return httpMethod;
    }

    /**
     * 其实也是对接口中的getTop()方法进行了一次包装
     * 用于获取豆瓣电影Top250的数据
     * @param subscriber 由调用者 传递过来的观察者对象
     * @param start  url后面get请求的参数
     * @param count  同start
     */
    public void getTopMovice(Subscriber<MoviceEntity> subscriber, int start, int count) {
        mMoviceService.getTop(start,count)
                .subscribeOn(Schedulers.io())    //在子线程中观察
                .unsubscribeOn(Schedulers.io())
                .observeOn(AndroidSchedulers.mainThread())
                .subscribe(subscriber);
    }


}
MainActivity中的代码瘦身了很多:
package com.example.retrofitdemo;

import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.view.View;
import android.widget.Button;
import android.widget.LinearLayout;
import android.widget.TextView;
import android.widget.Toast;

import com.example.retrofitdemo.bean.MoviceEntity;

import butterknife.Bind;
import butterknife.ButterKnife;
import rx.Subscriber;

/**
 * https://api.douban.com/v2/movie/top250?start=0&count=10
 */
public class MainActivity extends AppCompatActivity implements View.OnClickListener {

    @Bind(R.id.tv)
    TextView mTv;
    @Bind(R.id.activity_main)
    LinearLayout mActivityMain;
    @Bind(R.id.bt)
    Button mButton;
//    private Retrofit mRetrofit;
    private HttpMethod mHttpMethodInstance;

    private Subscriber<MoviceEntity> mSubscriber;


    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        ButterKnife.bind(this);

        mButton.setOnClickListener(this);

//        mRetrofit = new Retrofit.Builder()
//                .baseUrl(UrlConstant.baseUrl)
//                .addConverterFactory(GsonConverterFactory.create())
//                .addCallAdapterFactory(RxJavaCallAdapterFactory.create())   //添加RxJavaCallAdapterFactory
//                .build();

        mHttpMethodInstance = HttpMethod.getInstance();
    }


    @Override
    public void onClick(View view) {
        getMovie();
    }


    private void getMovie() {
        //MoviceService接口对象 是通过mRetrofit create()
//                MoviceService moviceService = mRetrofit.create(MoviceService.class);
        // 一:传入具体的值,生成call对象
//        Call<MoviceEntity> moviceEntityCall = moviceService.getTop(0, 10);
//        moviceEntityCall.enqueue(new Callback<MoviceEntity>() {
//            @Override
//            public void onResponse(Call<MoviceEntity> call, Response<MoviceEntity> response) {
//                String str = response.body().toString();
//                mTv.setText(str);
//            }
//
//            @Override
//            public void onFailure(Call<MoviceEntity> call, Throwable t) {
//                Toast.makeText(MainActivity.this,t.toString(),Toast.LENGTH_LONG).show();
//            }
//        });

        //二 :添加RxJava
//       moviceService.getTop(0,10)
//               .subscribeOn(Schedulers.io())   //在线程订阅
//                .observeOn(AndroidSchedulers.mainThread())   //在主线程观察
//                .subscribe(new Subscriber<MoviceEntity>() {
//                    @Override
//                    public void onCompleted() {
//                        Toast.makeText(MainActivity.this, "Get Top Movie Completed", Toast.LENGTH_SHORT).show();
//                    }
//
//                    @Override
//                    public void onError(Throwable e) {
//
//                    }
//
//                    @Override
//                    public void onNext(MoviceEntity moviceEntity) {
//                        String str = moviceEntity.toString();
//                        mTv.setText(str);
//                    }
//                });

        //三: 对请求体 进行封装
        mSubscriber = new Subscriber<MoviceEntity>() {
            @Override
            public void onCompleted() {
                Toast.makeText(MainActivity.this, "Get Top Movie Completed", Toast.LENGTH_SHORT).show();
            }

            @Override
            public void onError(Throwable e) {

            }

            @Override
            public void onNext(MoviceEntity moviceEntity) {
                String str = moviceEntity.toString();
                mTv.setText(str);
            }
        };

        mHttpMethodInstance.getTopMovice(mSubscriber,0,10);
    }
}




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值