この記事では、Kotlin + Retrofit + Rxjavaの簡単なパッケージの詳細な説明を紹介します。それはあなたと共有されます。詳細は次のとおりです。
インスタンスレトロフィット
Object Retrofitutil {val Connect_time_out = 30 //接続タイムアウト期間x秒val read_time_out = 30 //読み取りタイムアウト持続時間x秒val write_time_out = 30 // write data timeout durate x sensuls val retrofit:lazy {log.d( "retrofitutil"、 "retrofit init") ") .baseurl( "http://gank.io/api/")//この記事では、github apiを例として使用しています。 getokhttpclient():okhttpclient {val builder = okhttpclient()builder.connecttimeout(connect_time_out.tolong()、timeunit.seconds).writeTimeout(write_time_out.tolong()、timeunit.seconds().seconds()。 timeUnit.seconds)if(buildconfig.debug){builder.addinterceptor(httplogginginterceptor()。 Header Builder.AddInterceptor {chain-> val time =(system.currenttimemillis() / 1000).toString() + "" bal requestbuilder = chain.request()。newbuilder()requestbuilder.addheader( "time"、time)chain.prueque }}データカプセル化に戻ります
クラス応答<t> {varエラー:boolean = false var results:t? = null}gank.ioの開発APIがデモで使用されました。以前の一般的なプロジェクトの返品形式は、コード +メッセージ + Tでした。
APIインターフェイスエラー/例外統合処理クラス
クラスApiexception:例外{varコード:int = 0 //エラーコードvar msg:string? = null //エラーメッセージコンストラクター(スロー可能:スロー可能、コード:int:int):super(throwable){this.code = code} constructor(code:int、msg:string){this.code = code this.msg = msg}}}externorresumenextのexceptionFunctionハンドルを定義します。
class exceptionfunction <t>:function <throwable、observable <t >> {override fun apply(@nonnull showable:shownable):observable <t> {log.e( "exceptionfunction"、throwable.message)returnable.error(exceptionEngine()。 1000 //不明なエラーval Analytic_server_data_error = 1001 // Paste(server)データエラーval connect_error = 1002 //ネットワーク接続エラーval time_out_Error = 1003 //ネットワーク接続タイムアウトファンハンドルエクセプト(E:スロー可能):apiexception {val ex:apiexception if(e is is ais ais emer returned e {//エラーリターンhttpexception){// httpエラーex = apiexception(e、e.code())ex.msg = "networkエラー:" + ex.code return ex} else if(e is jsonexception || eはjsonexception || e is parsexception || e Analytic_server_data_error)ex.msg = "parse error" return ex} else(e is connectexception){// connect networkエラーex = apiexception(e、connect_error)ex.msg = "connection failed" return ex} return ex} else {//不明なエラーex = apiexception(e、un_known_error)ex.msg = e.message return ex}}}}カプセル化要求処理
オブジェクトrx { / *** rxlifecycleバインドライフサイクル* / fun <t、e> get(観測可能:観察可能<応答<t >>、ライフサイクルプロバイダー:ライフサイクルプロバイダー<e>):観察可能<t> {//バインドライフサイクルをリクエストしてメモリリークを防ぐためにリクエストを要求し、ナルポインターエラーの攻撃を受けた場合、null pointerエラーはポイズエラーを除外します( rxAppCompatActivity){val rxAppCompatActivity = lifeCycleProvider as RxAppCompataCivity Observable.compose(rxappCompatactivity.binduntilevent(Activityevent.destroy))} else if(lifecycleprovider is rxfragment) Observable.compose(rxfragment.binduntilevent(fragmentevent.destroy))} return observable .compose(handleresult()).onerrorresumenext(excepderfunction())} / ***部分的な背景要求.compose(handleresult()).onerrorresumenext(exceptionfunction())} private class handleresult <t>:observabletransformer <response <t>、{override fun apply(upstream:observable <response <t >>):exturvableablesource <t> {return upstream.flatmap {response -> creseresul .subscribeon(schedulers.io()).unsubscribeon(schedulers.io()).observeon(androidschedulers.mainthread()}} private <t> createresult(response:response <t>):{experivable -apire -creax({1 durccribable -crure -create) 「サーバーの例外 ")//一般的に言えば、独自のサーバーの例外は、対応するコードとメッセージのelse response.lesults?.let {subscriber.onnext(response.Results !!)}?:subscriber.oncomplete()}}}}}を返します。 httpobserver統合処理リターンを定義します
abstract class HttpObserver<T> : Observer<T> { /** * Tag is a special case*/ private var resultNull: Boolean = true override fun onComplete() { // Special case: OnNext will be skipped when the request is successful, but T == null, and it still needs to be processed successfully if (resultNull) onSuccess(null) } override fun onsubscribe(d:dasuperable){//ダイアログをここに追加できます} onerrorをオーバーライドすることができます。 onsuccess(t:t?) / ** * unified処理は、ログイン障害などなど、失敗しました。 API
class result {var _id:string? = null var createdat:文字列? = null var desc:文字列? = null var publishedat:文字列? = null varソース:文字列? = null varタイプ:文字列? = null var url:string = "" var isused:boolean = false var who:string? = null var images:list <string>? = null/***女の子の小さな写真*/fun meizismallurl():string {val meizi = url return meizi.replace( "large"、 "small")}} interface apiservice {@get( "data/{type}/10/{page}")ファンゲッガンク( @patis( "int")int:int ")pigh(") Observable <Response <list <result >>>} object api {val apiservice:apiservice by lazy {log.d( "api"、 "apiservice create")retofitutil.retrofit.create(apiservice :: class.java)}}}使用
Fun loadData(){rx.get(api.apiservice.getGank(getType()、MintPage)、this).Subscribe(object:httpobserver <list <result >>(){everride fun onsuckes(t:list <>? msg:string?){super.onerror(code、msg)// getDatafailed()}})}rxlifecycleバインドライフサイクルは、可能なメモリリークを処理するために使用されます。フラグメントとアクティビティは、RXの対応するベースクラスを継承する必要があります。
練習プログラム
meizikt gank.io androidクライアント、kotlin + retrofit2 + rxjavaを使用
上記はこの記事のすべての内容です。みんなの学習に役立つことを願っています。誰もがwulin.comをもっとサポートすることを願っています。