Retrofit+Okhttp+RxJava打造网络请求之Post

之前一直在准备Android培训的事情,所幸的是终于完事啦,在这过程中真的发现了自身无论从沟通能力还是技术能力上很多的不足,就用一句 路漫漫其修远兮,吾将上下而求索 来勉励自己吧。之前也在项目上用上Okhttp,这几天抽空学习了下Retrofit和Rxjava,就记录记录所学的知识点吧。

在使用Retrofit+Okhttp+RxJava之前,我们需要做一些准备工作,在gradle文件中导入相应的支持(所用的Retrofit,Okhttp,RxJava都是目前最新版本的)这里附上一些学习资料入门。

Retrofit官网:https://square.github.io/retrofit/

OkHttp官网:http://square.github.io/okhttp/

RxAndroid github:https://github.com/ReactiveX/RxAndroid/

Rx入门(真的写的特别好):http://gank.io/post/560e15be2dca930e00da1083 给Android开发者的RxJava详解

JakeWharton大神的RxBinding:https://github.com/JakeWharton/RxBinding

导入Retrofit

 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'

导入OkHttp

compile 'com.squareup.okhttp3:okhttp:3.4.1'
compile 'com.squareup.okio:okio:1.9.0'

导入RxJava

compile 'com.jakewharton.rxbinding:rxbinding:0.4.0'
compile 'io.reactivex:rxandroid:1.2.1'
compile 'io.reactivex:rxjava:1.1.6'

  我们可以在全局变量中初始化一个OKHttpClient 和 Retrofit,并且配置一些比如连接时间的配置,我们就可以不用每向服务器请求一次数据就初始化OKHttpClient和Retrofit啦。

package com.keranbin.retrofitdemo;

import android.app.Activity;
import android.app.Application;
import android.content.Context;

import com.keranbin.retrofitdemo.Bean.User;
import com.keranbin.retrofitdemo.httpHelp.Http;

import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.TimeUnit;

import okhttp3.Cache;
import okhttp3.OkHttpClient;
import retrofit2.Retrofit;
import retrofit2.adapter.rxjava.RxJavaCallAdapterFactory;
import retrofit2.converter.gson.GsonConverterFactory;

/**
 * Created by keranbin on 2016/8/9.
 */
public class App extends Application {
    private static OkHttpClient okHttpClient;
    private static Retrofit retrofit;

    public static App app;
    
    @Override
    public void onCreate() {
        super.onCreate();
        app = this;
        //初始化OkHttp
        OkHttpInstance();
        //初始化Retrofit
        RetrofitInstance();
    }


    /**
     * 初始化okHttp
     * @return
     */
    public static OkHttpClient OkHttpInstance() {
        if (okHttpClient == null) {
            okHttpClient = new OkHttpClient().newBuilder()
                    //设置连接时间
                    .connectTimeout(500, TimeUnit.MILLISECONDS)
                    //设置读时间
                    .readTimeout(1000, TimeUnit.MILLISECONDS)
                    //设置写时间
                    .writeTimeout(1000, TimeUnit.MILLISECONDS)
                    //设置缓存
                    .cache(new Cache(app.getExternalCacheDir(), 10 * 1024 * 1024))
                    .build();
            return okHttpClient;
        } else {
            return okHttpClient;
        }
    }

    /**
     * 初始化retrofit
     */
    public static Retrofit RetrofitInstance(){
        if(retrofit==null){
            retrofit=new Retrofit.Builder()
                    .baseUrl(Http.URL)
                    //添加Gson支持
                    .addConverterFactory(GsonConverterFactory.create())
                    //添加Retrofit对Rxjava的支持
                    .addCallAdapterFactory(RxJavaCallAdapterFactory.create())
                    //配置OkHttp
                    .client(okHttpClient).build();
            return retrofit;
        }else{
            return retrofit;
        }
    }
}

然后我们先添加一个方法

package com.keranbin.retrofitdemo.RetroFit;

import java.util.HashMap;

import retrofit2.http.POST;
import retrofit2.http.QueryMap;
import rx.Observable;

/**
 * Created by keranbin on 2016/10/28.
 */

public interface IPost {
    @POST("ajax.mobileSword")
    Observable<String> login(@QueryMap HashMap<String,String> paramsMap);
}

再看看Activity中怎么调用和接收结果的

package com.keranbin.retrofitdemo.Activity;

import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.util.Log;
import android.widget.Toast;

import com.jakewharton.rxbinding.view.RxView;
import com.keranbin.retrofitdemo.App;
import com.keranbin.retrofitdemo.R;
import com.keranbin.retrofitdemo.RetroFit.IPost;

import java.util.HashMap;

import rx.Subscriber;
import rx.android.schedulers.AndroidSchedulers;
import rx.functions.Action1;
import rx.schedulers.Schedulers;

public class MainActivity extends AppCompatActivity {
    private String TAG = MainActivity.this.getPackageName();


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

    /**
     * 初始化页面组件及数据
     */
    private void initView() {
        RxView.clicks(findViewById(R.id.btnLogin)).subscribe(new Action1<Void>() {
            @Override
            public void call(Void aVoid) {
                login();
            }
        });
    }

    /**
     * 登录请求
     */
    public void login() {
        //把参数封装到map中
        HashMap map = new HashMap<String, String>();
        map.put("tid", "login");
        map.put("userName", "xiaoming");
        map.put("passWd", "qwer1234");

        //使用类Retrofit生成接口IPost的实现
        IPost loginService = App.RetrofitInstance().create(IPost.class);

        loginService.login(map)
                //设置call()执行的线程为新起一个线程
                .subscribeOn(Schedulers.newThread())
                //设置onNext()执行的线程在主线程中
                .observeOn(AndroidSchedulers.mainThread())
                .subscribe(new Subscriber() {
                    @Override
                    public void onCompleted() {

                    }

                    @Override
                    public void onError(Throwable e) {
                        Log.i(TAG, e.getMessage());
                    }

                    @Override
                    public void onNext(Object o) {
                        Toast.makeText(MainActivity.this, o.toString(), Toast.LENGTH_SHORT).show();
                    }
                });
    }
}
原文地址:https://www.cnblogs.com/bdsdkrb/p/6016325.html