Rxjava+Retrofit 简单使用

从去年开始就比较流行 Rxjava,Rxandroid,当然也有Retrofit 。

git地址:https://github.com/meijius/RxRetrofitDemo


1.bulid.gradle 文件


compile 'io.reactivex:rxjava:1.1.6'
    compile 'io.reactivex:rxandroid:1.2.1'
    compile 'com.squareup.retrofit2:retrofit:2.1.0'
    compile 'com.squareup.retrofit2:converter-gson:2.1.0'
    compile 'com.squareup.retrofit2:adapter-rxjava:2.1.0'
    compile 'com.bigkoo:svprogresshud:1.0.2'
    compile 'com.jakewharton:butterknife:7.0.1'

2.封装network请求框架。

Network.java


public class Network {

    private static LiaoMeiApi zhuangbiApi;
    private static OkHttpClient okHttpClient = new OkHttpClient();
    private static Converter.Factory gsonConverterFactory = GsonConverterFactory.create();
    private static CallAdapter.Factory rxJavaCallAdapterFactory = RxJavaCallAdapterFactory.create();

    public static LiaoMeiApi getZhuangbiApi() {
        NetworkDialogUtils.getInstance().ShowNetworkDialog(); // 加载框
        if (zhuangbiApi == null) {
            Retrofit retrofit = new Retrofit.Builder()
                    .client(okHttpClient)
                    .baseUrl("http://www.560797.com/")
                    .addConverterFactory(gsonConverterFactory)
                    .addCallAdapterFactory(rxJavaCallAdapterFactory)
                    .build();
            zhuangbiApi = retrofit.create(LiaoMeiApi.class);
        }
        return zhuangbiApi;
    }
}

RxObserver.java  Rxjava 封装返回类


public abstract class RxObserver<T> extends Subscriber<T> {

    @Override
    public void onStart() {
        super.onStart();
    }

    @Override
    public void onCompleted() {
        NetworkDialogUtils.getInstance().HideNetworkDialog();
    }

    @Override
    public void onError(Throwable e) {
        NetworkDialogUtils.getInstance().HideNetworkDialog();
        Logger.e(this,e.getMessage());
        e.printStackTrace();
        //在这里做全局的错误处理
        if (e instanceof HttpException) {
             ToastUtils.getInstance().showToast(e.getMessage());
        }
        ToastUtils.getInstance().showToast(e.getMessage());

    }

    @Override
    public void onNext(T t) {
        onSuccess(t);
    }

    public abstract void onSuccess(T t);


}


LiaoMeiApi.java  Retrofit接口类


public interface LiaoMeiApi {

    /**
     * 这里需要稍作说明,@GET注解就表示get请求,@Query表示请求参数,将会以key=value的方式拼接在url后面    @QueryMap 传map 把key value丢进去
     * @POST注解就表示post请求,@Field表示请求参数,将会以表单的方式提交  @FieldMap 意思一样
     * 除此之外还有 @Body @Path 添加header等方法
     * @return
     */

    // http://www.560797.com/sms/login.html   account password
    @FormUrlEncoded
    @POST("sms/login")
    Observable<Rersults> login(@Field(value = "account", encoded = true) String account, @Field(value = "password", encoded = true) String pwd);

}


3.activity主代码


LoginActivity.java 


public class LoginActivity extends AppCompatActivity {

    @Bind(R.id.email)
    AutoCompleteTextView email;
    @Bind(R.id.password)
    EditText password;
    @Bind(R.id.content)
    TextView content;

    String account, pwd;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_login);

        ButterKnife.bind(this);
        NetworkDialogUtils.init(this);

    }

    @OnClick({R.id.email_sign_in_button})
    public void onClick(View view){
        switch (view.getId()){
            case R.id.email_sign_in_button:
                login();
                break;
        }
    }

    Observer<Rersults> observer = new RxObserver<Rersults>() {
        @Override
        public void onSuccess(Rersults s) {
            Toast.makeText(LoginActivity.this, s.getErrmsg(), Toast.LENGTH_SHORT).show();
            content.setText(s.toString());
        }
    };

    protected Subscription subscription;

    private void login(){
        account = email.getText().toString();
        pwd = password.getText().toString();
        if(TextUtils.isEmpty(account)){
            Toast.makeText(LoginActivity.this, "用户名不能为空!", Toast.LENGTH_SHORT).show();
            return;
        }
        if(TextUtils.isEmpty(pwd)){
            Toast.makeText(LoginActivity.this, "密码不能为空!", Toast.LENGTH_SHORT).show();
            return;
        }

        subscription = Network.getZhuangbiApi()
                .login("a123456", "a123456")
                .subscribeOn(Schedulers.io())
                .observeOn(AndroidSchedulers.mainThread())
                .subscribe(observer);

    }

}

4.其它相关类。

APPApplication

public class APPApplication extends Application {

    public void onCreate() {
        super.onCreate();
        init();
    }
    
    private void init() {

        ToastUtils.init(this);

    }
    
}

NetworkDialogUtils

public class NetworkDialogUtils {

    private static Context mContext;
    private static NetworkDialogUtils mInstance;
    private static SVProgressHUD svProgressHUD;
    private static boolean isShowHUD = true;

    public static NetworkDialogUtils getInstance() {
        return mInstance;
    }

    public static void init(Context ctx) {
        mInstance = new NetworkDialogUtils(ctx);
    }

    private NetworkDialogUtils(Context ctx) {
        mContext = ctx;
    }

    public void ShowNetworkDialog(){
        if(isShowHUD){
            if(svProgressHUD == null){
                svProgressHUD = new SVProgressHUD(mContext);
            }
            svProgressHUD.showWithStatus(mContext.getString(R.string.wait));
        }
    }

    public void HideNetworkDialog(){
        if(isShowHUD){
            if(svProgressHUD.isShowing()){
                svProgressHUD.dismiss();
            }
        }
    }
}

相关图片:










git地址:https://github.com/meijius/RxRetrofitDemo




猜你喜欢

转载自blog.csdn.net/u010090644/article/details/52277650