zoukankan      html  css  js  c++  java
  • Android应用架构之Retrofit使用

    网络访问框架经过了从使用最原始的AsyncTask构建简单的网络访问框架(甚至不能称为框架),后来使用开源的android-async-http库,再到使用google发布的volley库,一直不懈的寻找更好的解决方案(银弹),到现在虽然银弹没找到,也算找 到了一些更好的方案,在这里做些记录,也做共享。

    目标架构如下图:



    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 获取json数据。


    先看看庐山真面目,大家看了也会说,酱紫啊,搜森破!



          

    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.   
    3. import com.micky.retrofitrxandroiddagger2.data.api.response.GetIpInfoResponse;  
    4.   
    5. import retrofit.Call;  
    6. import retrofit.http.GET;  
    7. import retrofit.http.Query;  
    8. import rx.Observable;  
    9.   
    10. /** 
    11.  * @Project retrofitrxandroiddagger2 
    12.  * @Packate com.micky.retrofitrxandroiddagger2.data.api 
    13.  * @Description 
    14.  * @Author Micky Liu 
    15.  * @Email mickyliu@126.com 
    16.  * @Date 2015-12-21 17:22 
    17.  * @Version 1.0 
    18.  */  
    19. public interface ApiService {  
    20.     @GET("service/getIpInfo.php")  
    21.     Call<GetIpInfoResponse> getIpInfo(@Query("ip") String ip);  
    22. }  

    3、定义接收数据的response

    [java] view plain copy
    1. package com.micky.retrofitrxandroiddagger2.data.api.response;  
    2.   
    3.   
    4. import com.micky.retrofitrxandroiddagger2.data.api.model.IpInfo;  
    5.   
    6. /** 
    7.  * @Project CommonProject 
    8.  * @Packate com.micky.commonproject.data.api.response 
    9.  * @Description 
    10.  * @Author Micky Liu 
    11.  * @Email mickyliu@126.com 
    12.  * @Date 2015-12-21 16:39 
    13.  * @Version 1.0 
    14.  */  
    15. public class GetIpInfoResponse extends BaseResponse {  
    16.     public IpInfo data;  
    17. }  

    4、请求数据并显示

    [java] view plain copy
    1. package com.micky.retrofitrxandroiddagger2;  
    2.   
    3. import android.os.Bundle;  
    4. import android.support.design.widget.FloatingActionButton;  
    5. import android.support.v7.app.AppCompatActivity;  
    6. import android.support.v7.widget.Toolbar;  
    7. import android.view.View;  
    8. import android.view.Menu;  
    9. import android.view.MenuItem;  
    10. import android.widget.ProgressBar;  
    11. import android.widget.TextView;  
    12. import android.widget.Toast;  
    13.   
    14. import com.micky.retrofitrxandroiddagger2.common.utils.CrashHandler;  
    15. import com.micky.retrofitrxandroiddagger2.data.api.ApiService;  
    16. import com.micky.retrofitrxandroiddagger2.data.api.response.GetIpInfoResponse;  
    17.   
    18. import retrofit.Call;  
    19. import retrofit.Callback;  
    20. import retrofit.GsonConverterFactory;  
    21. import retrofit.Response;  
    22. import retrofit.Retrofit;  
    23. import retrofit.RxJavaCallAdapterFactory;  
    24. import rx.Subscriber;  
    25. import rx.android.schedulers.AndroidSchedulers;  
    26. import rx.functions.Action1;  
    27. import rx.schedulers.Schedulers;  
    28.   
    29. /** 
    30.  * @Project retrofitrxandroiddagger2 
    31.  * @Packate com.micky.retrofitrxandroiddagger2 
    32.  * @Description 
    33.  * @Author Micky Liu 
    34.  * @Email mickyliu@126.com 
    35.  * @Date 2015-12-21 17:35 
    36.  * @Version 1.0 
    37.  */  
    38. public class MainActivity extends AppCompatActivity {  
    39.   
    40.     private static final String ENDPOINT = "http://ip.taobao.com";  
    41.     private TextView mTvContent;  
    42.     private ProgressBar mProgressBar;  
    43.   
    44.     @Override  
    45.     protected void onCreate(Bundle savedInstanceState) {  
    46.         super.onCreate(savedInstanceState);  
    47.         setContentView(R.layout.activity_main);  
    48.         Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);  
    49.         setSupportActionBar(toolbar);  
    50.         mTvContent = (TextView) findViewById(R.id.tv_content);  
    51.         mProgressBar = (ProgressBar) findViewById(R.id.progress_bar);  
    52.   
    53.         FloatingActionButton fab = (FloatingActionButton) findViewById(R.id.fab);  
    54.         fab.setOnClickListener(new View.OnClickListener() {  
    55.             @Override  
    56.             public void onClick(View view) {  
    57.   
    58.                 Retrofit retrofit = new Retrofit.Builder()  
    59.                         .baseUrl(ENDPOINT)  
    60.                         .addConverterFactory(GsonConverterFactory.create())  
    61.                         .build();  
    62.                 ApiService apiService = retrofit.create(ApiService.class);  
    63.   
    64.                 mProgressBar.setVisibility(View.VISIBLE);  
    65.   
    66.                 Call<GetIpInfoResponse> call = apiService.getIpInfo("63.223.108.42");  
    67.                 call.enqueue(new Callback<GetIpInfoResponse>() {  
    68.                     @Override  
    69.                     public void onResponse(Response<GetIpInfoResponse> response, Retrofit retrofit) {  
    70.                         mProgressBar.setVisibility(View.GONE);  
    71.                         GetIpInfoResponse getIpInfoResponse = response.body();  
    72.                         mTvContent.setText(getIpInfoResponse.data.country);  
    73.                     }  
    74.   
    75.                     @Override  
    76.                     public void onFailure(Throwable t) {  
    77.                         mProgressBar.setVisibility(View.GONE);  
    78.                         mTvContent.setText(t.getMessage());  
    79.                     }  
    80.                 });  
    81.             }  
    82.         });  
    83.     }  
    84.   
    85.     @Override  
    86.     public boolean onCreateOptionsMenu(Menu menu) {  
    87.         getMenuInflater().inflate(R.menu.menu_main, menu);  
    88.         return true;  
    89.     }  
    90.   
    91.     @Override  
    92.     public boolean onOptionsItemSelected(MenuItem item) {  
    93.         int id = item.getItemId();  
    94.         if (id == R.id.action_settings) {  
    95.             return true;  
    96.         }  
    97.   
    98.         return super.onOptionsItemSelected(item);  
    99.     }  
    100. }  

    就这么简单,上述代码已经实现通过retrofit访问restful api获取数据并显示。


    详细代码请见:http://download.csdn.net/download/liuhongwei123888/9372394

  • 相关阅读:
    Step by step Dynamics CRM 2013安装
    SQL Server 2012 Managed Service Account
    Step by step SQL Server 2012的安装
    Step by step 活动目录中添加一个子域
    Step by step 如何创建一个新森林
    向活动目录中添加一个子域
    活动目录的信任关系
    RAID 概述
    DNS 正向查找与反向查找
    Microsoft Dynamics CRM 2013 and 2011 Update Rollups and Service Packs
  • 原文地址:https://www.cnblogs.com/vegetate/p/9997285.html
Copyright © 2011-2022 走看看