Retrofit+Okhttp+RxJava打造網絡請求之Post

以前一直在準備Android培訓的事情,所幸的是終於完事啦,在這過程當中真的發現了自身不管從溝通能力仍是技術能力上不少的不足,就用一句 路漫漫其修遠兮,吾將上下而求索 來勉勵本身吧。以前也在項目上用上Okhttp,這幾天抽空學習了下Retrofit和Rxjava,就記錄記錄所學的知識點吧。java

在使用Retrofit+Okhttp+RxJava以前,咱們須要作一些準備工做,在gradle文件中導入相應的支持(所用的Retrofit,Okhttp,RxJava都是目前最新版本的)這裏附上一些學習資料入門。react

Retrofit官網:https://square.github.io/retrofit/android

OkHttp官網:http://square.github.io/okhttp/git

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

Rx入門(真的寫的特別好):http://gank.io/post/560e15be2dca930e00da1083 給Android開發者的RxJava詳解ajax

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'

導入OkHttpapp

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

導入RxJavaide

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();
                    }
                });
    }
}
相關文章
相關標籤/搜索