网络访问框架经过了从使用最原始的AsyncTask构建简单的网络访问框架(甚至不能称为框架),后来使用开源的android-async-http库,再到使用google发布的volley库,一直不懈的寻找更好的解决方案,到现在也没找到,不过据行业所说,Retrofit算是行业比较牛逼的开源请求框架了吧,也算找 到了一些更好的方案,在这里做些记录,也做共享。

下面是我们常用的mvp模式的运行模型:


Android网络请求框架之Retrofit实践_android

Retrofit:Square提供的开源产品,为Android平台的应用提供一个类型安全的REST客户端


[html]  ​​view plain​​​  ​​​copy​




  1. ​https://github.com/square/retrofit​




RxAndroid:响应式编程框架RxJava针对Android平台的扩展。


[html]  ​​view plain​​​  ​​​copy​




  1. ​https://github.com/ReactiveX/RxAndroid​
  2. ​https://github.com/ReactiveX/RxJava​


Dagger2:依赖注入(或叫ioc,用过Spring的都知道这东东)框架,用于解耦的。


[html]  ​​view plain​​​  ​​​copy​




  1. ​https://github.com/google/dagger/​




为了书写 方便,便于实践,我们用下面的地址作为服务器请求地址:http://ip.taobao.com/service/getIpInfo.php?ip=21.22.11.33

接下来我们开始新建一个项目;


Android网络请求框架之Retrofit实践_java_02


1、通过配置gradle配置将Retrofit框架引入项目。



[java]  ​​view plain​​​  ​​​copy​




  1. compile 'com.squareup.retrofit:retrofit:2.0.0-beta2'
  2. compile 'com.squareup.retrofit:converter-gson:2.0.0-beta2'



2、编写API服务代码

     



[java]  ​​view plain​​​  ​​​copy​




  1. package com.micky.retrofitrxandroiddagger2.data.api;

  2. import com.micky.retrofitrxandroiddagger2.data.api.response.GetIpInfoResponse;

  3. import retrofit.Call;
  4. import retrofit.http.GET;
  5. import retrofit.http.Query;
  6. import rx.Observable;


  7. public interface ApiService {
  8. @GET("service/getIpInfo.php")
  9. @Query("ip") String ip);
  10. }



3、定义接收数据的response



[java]  ​​view plain​​​  ​​​copy​




  1. package com.micky.retrofitrxandroiddagger2.data.api.response;


  2. import com.micky.retrofitrxandroiddagger2.data.api.model.IpInfo;

  3. public class GetIpInfoResponse extends BaseResponse {
  4. public IpInfo data;
  5. }



4、请求数据并显示



[java]  ​​view plain​​​  ​​​copy​




  1. package com.micky.retrofitrxandroiddagger2;

  2. import android.os.Bundle;
  3. import android.support.design.widget.FloatingActionButton;
  4. import android.support.v7.app.AppCompatActivity;
  5. import android.support.v7.widget.Toolbar;
  6. import android.view.View;
  7. import android.view.Menu;
  8. import android.view.MenuItem;
  9. import android.widget.ProgressBar;
  10. import android.widget.TextView;
  11. import android.widget.Toast;

  12. import com.micky.retrofitrxandroiddagger2.common.utils.CrashHandler;
  13. import com.micky.retrofitrxandroiddagger2.data.api.ApiService;
  14. import com.micky.retrofitrxandroiddagger2.data.api.response.GetIpInfoResponse;

  15. import retrofit.Call;
  16. import retrofit.Callback;
  17. import retrofit.GsonConverterFactory;
  18. import retrofit.Response;
  19. import retrofit.Retrofit;
  20. import retrofit.RxJavaCallAdapterFactory;
  21. import rx.Subscriber;
  22. import rx.android.schedulers.AndroidSchedulers;
  23. import rx.functions.Action1;
  24. import rx.schedulers.Schedulers;


  25. public class MainActivity extends AppCompatActivity {

  26. private static final String ENDPOINT = "http://ip.taobao.com";
  27. private TextView mTvContent;
  28. private ProgressBar mProgressBar;

  29. @Override
  30. protected void onCreate(Bundle savedInstanceState) {
  31. super.onCreate(savedInstanceState);
  32. setContentView(R.layout.activity_main);
  33. Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
  34. setSupportActionBar(toolbar);
  35. mTvContent = (TextView) findViewById(R.id.tv_content);
  36. mProgressBar = (ProgressBar) findViewById(R.id.progress_bar);

  37. FloatingActionButton fab = (FloatingActionButton) findViewById(R.id.fab);
  38. new View.OnClickListener() {
  39. @Override
  40. public void onClick(View view) {

  41. new Retrofit.Builder()
  42. .baseUrl(ENDPOINT)
  43. .addConverterFactory(GsonConverterFactory.create())
  44. .build();
  45. class);

  46. mProgressBar.setVisibility(View.VISIBLE);

  47. "63.223.108.42");
  48. new Callback<GetIpInfoResponse>() {
  49. @Override
  50. public void onResponse(Response<GetIpInfoResponse> response, Retrofit retrofit) {
  51. mProgressBar.setVisibility(View.GONE);
  52. GetIpInfoResponse getIpInfoResponse = response.body();
  53. mTvContent.setText(getIpInfoResponse.data.country);
  54. }

  55. @Override
  56. public void onFailure(Throwable t) {
  57. mProgressBar.setVisibility(View.GONE);
  58. mTvContent.setText(t.getMessage());
  59. }
  60. });
  61. }
  62. });
  63. }

  64. @Override
  65. public boolean onCreateOptionsMenu(Menu menu) {
  66. getMenuInflater().inflate(R.menu.menu_main, menu);
  67. return true;
  68. }

  69. @Override
  70. public boolean onOptionsItemSelected(MenuItem item) {
  71. int id = item.getItemId();
  72. if (id == R.id.action_settings) {
  73. return true;
  74. }

  75. return super.onOptionsItemSelected(item);
  76. }
  77. }