国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學院 > 開發設計 > 正文

Retrofit淺析及使用

2019-11-06 09:55:06
字體:
來源:轉載
供稿:網友

retrofit淺析及使用

一、簡介

1、官方解釋

A type-safe HTTP client for Android and java一個針對Android和Java類型安全的http客戶端這是官網地址: http://square.github.io/retrofit/github地址:https://github.com/square/retrofit

2、白話解釋

Retrofit與okhttp共同出自于Square公司,retrofit就是對okhttp做了一層封裝。它是一個可以用于Android和java的網絡庫,輕松實現網網絡請求

3、特點

RESTfun—-REST風格的網絡接口

REST全稱是Resource RePResentational State Transfer:通俗來講就是:資源在網絡中以某種表現形式進行狀態轉移,描述的是在網絡中client和server的一種交互形式;REST本身不實用,實用的是如何設計 RESTful API(REST風格的網絡接口);比volley更快支持NIO默認使用OKhttp默認使用Gson解析

4、常用注釋接口解釋

@get@post@header頭信息參數@path路徑信息,替代URL地址中的”{“和”}”部分@Query查詢參數

@Query查詢參數集合

如果Query參數比較多,那么可以通過@QueryMap方式將所有的參數集成在一個Map統一傳遞,還以上文中的get請求方法為例

public interface BlueService { @GET("book/search") Call<BookSearchResponse> getSearchBooks(@QueryMap Map<String, String> options);}

調用的時候將所有的參數集合在統一的map中即可

Map<String, String> options = new HashMap<>();map.put("q", "小王子");map.put("tag", null);map.put("start", "0");map.put("count", "3");Call<BookSearchResponse> call = mBlueService.getSearchBooks(options);

@FormUrlEncoded

@Field@FieldMap@Multipart@PartPost

@BodyPost

接口介紹:http://blog.csdn.net/duanyy1990/article/details/52139294

二、準備

1、添加網絡權限

<uses-permission android:name="android.permission.INTERNET"/>

2、測試所用網址

http://www.tngou.net/api/food/show

三、如何使用(五步走)

1、導包

compile 'com.squareup.retrofit2:retrofit:2.1.0'//Retrofit2所需要的包compile 'com.squareup.retrofit2:converter-gson:2.1.0'//ConverterFactory的Gson依賴包compile 'com.squareup.retrofit2:converter-scalars:2.1.0'//ConverterFactory的String依賴包

注意:導入的retrofit2包的版本必須要一致,否則就會報錯。

2、定義一個接口:封裝URL地址和數據請求方式

public interface RequestServes { @GET("show") Call<Bean> getMenuById(@Query("id") String id);}

Retrofit提供的請求方式注解有@GET和@POST,參數注解有@PATH和@Query等。前兩個顧名思義就是定義你的請求方式Get、Post,后面的@PATH指的是通過參數填充完整的路徑,一般用法: @GET(“{name}”) CallgetUser(@Path(“name”) String name); 這里的參數username會被填充至{name}中,形成完整的Url請求地址,{name}相當于一個占位符; @Query就是我們的請求的鍵值對的設置,我們構建Call對象的時候會傳入此參數,

public interface RequestServes { @GET("show") Call<Bean> getMenuById(@Query("id") String id);}

這里@Query(“id”)就是鍵,后面的id就是具體的值了,值得注意的是Get和Post請求,都是這樣填充參數的;

3、通過一個類,提供Retrofit對象和RequestServes接口服務對象

public class Retrofit { private RequestServes service; /** * 獲取Retrofit實例 * @return */ public static Retrofit getRetrofit(){ return new Retrofit(); } /** * 獲取RequestServes實例 * @return */ public RequestServes getService(){ return service; } private Retrofit() { retrofit2.Retrofit retrofit = new retrofit2.Retrofit.Builder() .baseUrl("http://www.tngou.net/api/food/") .addConverterFactory(GsonConverterFactory.create()) .build(); service = retrofit.create(RequestServes.class); }}

- 這里的baseUrl加上之前@GET(“show”)定義的參數形成完整的請求地址; - addConverterFactory(ScalarsConverterFactory.create())的意思是構建了一個返回支持,如果你的Call對象的泛型接收另外的格式需要添加另外的支持:

//增加返回值為Gson的支持(以實體類返回) .addConverterFactory(GsonConverterFactory.create()) //增加返回值為Oservable<T>的支持 .addCallAdapterFactory(RxJavaCallAdapterFactory.create())

4、在activity中,獲取Retrofit和Requestservice對象,并且得到我們的Call對象請求網絡(同步異步)

public class MainActivity extends Activity implements View.OnClickListener { private EditText mEditText; private TextView mTextView; private Button bt_query_synchronous; private Button bt_query_asynchronous; private RequestServes service; private Retrofit retrofit; private String msg; private String name; private String keyWords; private Bean result; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); initView(); initRetrofit(); initListener(); } private void initListener() { bt_query_asynchronous.setOnClickListener(this); bt_query_synchronous.setOnClickListener(this); } private void initRetrofit() { retrofit = Retrofit.getRetrofit(); service = retrofit.getService(); } private void initView() { setContentView(R.layout.activity_main); mEditText = (EditText) findViewById(R.id.et_input); mTextView = (TextView) findViewById(R.id.tv_2); bt_query_asynchronous = (Button)findViewById(R.id.bt_query_asynchronous); bt_query_synchronous = (Button)findViewById(R.id.bt_query_synchronous); } @Override public void onClick(View view) { switch (view.getId()) { case R.id.bt_query_synchronous: querySynchronous(); break; case R.id.bt_query_asynchronous: queryAsynchronous(); break; } } //同步查詢 private void queryAsynchronous() { String num = mEditText.getText().toString(); if (num.isEmpty()) { Toast.makeText(MainActivity.this, "請輸入ID", Toast.LENGTH_SHORT).show(); return; } final Call<Bean> call = service.getMenuById(num); new Thread(new Runnable() { @Override public void run() { try { result = call.execute().body(); msg = result.getMessage(); name = result.getName(); keywords = result.getKeywords(); runOnUiThread(new Runnable() { @Override public void run() { mTextView.setText("名稱:" + name + "/n關鍵字:" + keywords + "/n詳情:" + msg); } }); } catch (IOException e) { e.printStackTrace(); } } }).start(); } //異步查詢 private void querySynchronous() { String num = mEditText.getText().toString(); if (num.isEmpty()) { Toast.makeText(MainActivity.this, "請輸入ID", Toast.LENGTH_SHORT).show(); return; } final Call<Bean> call = service.getMenuById(num); //異步請求 call.enqueue(new Callback<Bean>() { @Override public void onResponse(Call<Bean> call, Response<Bean> response) { if (response.isSuccessful()) { Bean result = response.body();//關鍵 if (result != null) { String msg = result.getMessage(); String name = result.getName(); String keywords = result.getKeywords(); mTextView.setText("名稱:" + name + "/n關鍵字:"+keywords+"/n詳情:" + msg); } } } @Override public void onFailure(Call<Bean> call, Throwable t) { Log.e("TAG", "call==========="+call.toString()); Log.e("TAG", "t============"+t.getLocalizedMessage()); } }); }}

5、最后貼上布局

<?xml version="1.0" encoding="utf-8"?><RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:id="@+id/activity_main" android:layout_width="match_parent" android:layout_height="match_parent" tools:context="com.metashipanwf.retrofit.MainActivity"> <TextView android:id="@+id/tv_1" android:layout_width="wrap_content" android:layout_height="40dp" android:layout_alignParentLeft="true" android:text="ID是:" android:textColor="#000000" android:textSize="20sp" /> <EditText android:id="@+id/et_input" android:layout_width="180dp" android:layout_height="40dp" android:layout_toRightOf="@id/tv_1" /> <Button android:id="@+id/bt_query_synchronous" android:layout_width="wrap_content" android:layout_height="40dp" android:layout_below="@id/tv_1" android:text="同步查詢" /> <Button android:id="@+id/bt_query_asynchronous" android:layout_width="wrap_content" android:layout_height="40dp" android:layout_toRightOf="@id/bt_query_synchronous" android:layout_below="@id/tv_1" android:text="異步查詢" /> <TextView android:id="@+id/tv_2" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_alignLeft="@id/tv_1" android:layout_below="@id/bt_query_synchronous" android:layout_marginTop="20dp" android:textColor="#000000" android:textSize="15sp" /> </RelativeLayout>
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 广宗县| 合江县| 宝鸡市| 郴州市| 紫阳县| 牟定县| 清流县| 珠海市| 丹凤县| 遂宁市| 潞西市| 长垣县| 那曲县| 天门市| 呼伦贝尔市| 吉木萨尔县| 甘南县| 贵定县| 长岛县| 辽宁省| 察隅县| 株洲县| 成都市| 武乡县| 黄梅县| 陵川县| 凌云县| 六盘水市| 盐山县| 句容市| 六安市| 桓台县| 扶余县| 九台市| 东乡族自治县| 南京市| 怀化市| 靖远县| 密山市| 江山市| 沛县|