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();
                    }
                });
    }
}

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM