RetrolFit+rxjava + okHttp与服务 交互的例子+取消retrolfit网络请求

本demo在前一个demo有基础上添加了一个数据封装与取消http请求的操作,其他无异,欢迎各位大神批评指正!!

1.retrolfit网络请求接口类

  1. package com.example.yourdream.retrofitdemo;  
  2.   
  3.   
  4. import data.HttpResult;  
  5. import data.UserInfo;  
  6. import retrofit2.Call;  
  7. import retrofit2.http.GET;  
  8. import retrofit2.http.POST;  
  9. import retrofit2.http.Query;  
  10. import rx.Observable;  
  11.   
  12. /** 
  13.  * Created by yourdream on 2016/11/18. 
  14.  */  
  15.   
  16. public interface HttpRequest {  
  17.   
  18.     /** 
  19.      * 普通的Retrolfit请求,返回的是一个Call 
  20.      * @param username 
  21.      * @param password 
  22.      * @return 
  23.      */  
  24.     @POST("WebService/index.jsp" )  
  25.     Call<UserInfo> login(@Query("username") String username, @Query("password") String password);  
  26.   
  27.   
  28.     /** 
  29.      * 支持rxjava,返回的是一个Observable,被观察对象 
  30.      * 
  31.      * @param username 
  32.      * @param password 
  33.      * @return 
  34.      */  
  35.     @GET("WebService/index.jsp")  
  36.     Observable<UserInfo> loginByRxjava(@Query("username") String username, @Query("password") String password);  
  37.   
  38.     /** 
  39.      * 支持rxjava,返回的是一个Observable,被观察对象,其中数据用泛型封装 
  40.      * @param username 
  41.      * @param password 
  42.      * @return 
  43.      */  
  44.     @GET("WebService/index.jsp")  
  45.     Observable<HttpResult<UserInfo>> loginByRxjava2(@Query("username") String username, @Query("password") String password);  
  46. }  


2.服务后台回传数据的封装,,泛型类实现
  1. package data;  
  2.   
  3. /** 
  4.  * 对于服务器返回来的数据如果 格式上一致,可以对数据封装成泛型类 
  5.  * 信息格式类似这种: 
  6.  * { 
  7.      "resultCode": 0, 
  8.      "resultMessage": "成功", 
  9.      "data": {} 
  10.      } 
  11.  * Created by yourdream on 2016/11/21. 
  12.  */  
  13.   
  14. public class HttpResult<T> {  
  15.   
  16.     private int resultCode;         //前面2个字段固定  
  17.   
  18.     private String resultMessage;  
  19.   
  20.     private T data;                 //泛型格式一致的数据  
  21.   
  22.     public T getData() {  
  23.         return data;  
  24.     }  
  25.   
  26.     public void setData(T data) {  
  27.         this.data = data;  
  28.     }  
  29.   
  30.     public int getResultCode() {  
  31.         return resultCode;  
  32.     }  
  33.   
  34.     public void setResultCode(int resultCode) {  
  35.         this.resultCode = resultCode;  
  36.     }  
  37.   
  38.     public String getResultMessage() {  
  39.         return resultMessage;  
  40.     }  
  41.   
  42.     public void setResultMessage(String resultMessage) {  
  43.         this.resultMessage = resultMessage;  
  44.     }  
  45.   
  46.   
  47. }  

3.测试用的用户信息类
  1. package data;  
  2.   
  3. /** 
  4.  * Created by yourdream on 2016/11/21. 
  5.  */  
  6.   
  7. public class UserInfo {  
  8.   
  9.     private String password;  
  10.   
  11.     private String username;  
  12.   
  13.     public String getPassword() {  
  14.         return password;  
  15.     }  
  16.   
  17.     public void setPassword(String password) {  
  18.         this.password = password;  
  19.     }  
  20.   
  21.     public String getUsername() {  
  22.         return username;  
  23.     }  
  24.   
  25.     public void setUsername(String username) {  
  26.         this.username = username;  
  27.     }  
  28.   
  29.   
  30. }  


4.取消retrlfit网络请求工具类
  1. package utils;  
  2.   
  3. import rx.Subscription;  
  4.   
  5. /** 
  6.  * 取消retrolfit中的http请求,直接取消它的订阅就行 
  7.  * Created by yourdream on 2016/11/22. 
  8.  */  
  9. public class SubscribeUtils {  
  10.   
  11.     /** 
  12.      * 取消订阅 
  13.      * @param subscription 
  14.      */  
  15.     public static void unSubscribe(Subscription subscription) {  
  16.         if (subscription != null && !subscription.isUnsubscribed()) {  
  17.             subscription.unsubscribe();  
  18.         }  
  19.     }  
  20. }  
4.mainactivity类
  1. package com.example.yourdream.retrofitdemo;  
  2.   
  3. import android.app.Activity;  
  4. import android.os.Bundle;  
  5. import android.view.View;  
  6. import android.widget.Button;  
  7. import android.widget.TextView;  
  8. import android.widget.Toast;  
  9.   
  10. import data.HttpResult;  
  11. import data.UserInfo;  
  12. import retrofit2.Call;  
  13. import retrofit2.Callback;  
  14. import retrofit2.Response;  
  15. import retrofit2.Retrofit;  
  16. import retrofit2.adapter.rxjava.RxJavaCallAdapterFactory;  
  17. import retrofit2.converter.gson.GsonConverterFactory;  
  18. import rx.Subscriber;  
  19. import rx.Subscription;  
  20. import rx.android.schedulers.AndroidSchedulers;  
  21. import rx.schedulers.Schedulers;  
  22. import utils.SubscribeUtils;  
  23.   
  24. public class MainActivity extends Activity {  
  25.   
  26.     private TextView normaltxt;  
  27.     private TextView rxjavatxt;  
  28.   
  29.     private Button normalBtn;  
  30.     private Button rxjava;  
  31.   
  32.     private Subscription tmpSubscription;        //取消订阅用的  
  33.   
  34.     private static final String BASE_URL = "http://192.168.4.42:8080/";  
  35.   
  36.     @Override  
  37.     protected void onCreate(Bundle savedInstanceState) {  
  38.         super.onCreate(savedInstanceState);  
  39.         setContentView(R.layout.activity_main);  
  40.         normaltxt = (TextView)findViewById(R.id.txt);  
  41.         rxjavatxt = (TextView)findViewById(R.id.rxjava_txt);  
  42.   
  43.         normalBtn = (Button)findViewById(R.id.norml);  
  44.         rxjava = (Button)findViewById(R.id.rxjava);  
  45.   
  46.   
  47.         EventClick click = new EventClick();  
  48.         normalBtn.setOnClickListener(click);  
  49.         rxjava.setOnClickListener(click);  
  50.   
  51.   
  52.     }  
  53.   
  54.     private class EventClick implements View.OnClickListener  
  55.     {  
  56.         @Override  
  57.         public void onClick(View view) {  
  58.             switch(view.getId())  
  59.             {  
  60.                 case R.id.norml:  
  61.                     requestNormal();  
  62.                     break;  
  63.                 case R.id.rxjava:  
  64.                     requestByRxjava();  
  65.                     break;  
  66.   
  67.             }  
  68.         }  
  69.     }  
  70.   
  71.     /** 
  72.      * Retrofit普通 请求 
  73.      */  
  74.     private void requestNormal()  
  75.     {  
  76.         Retrofit retrofit = new Retrofit.Builder()  
  77.                         .addConverterFactory(GsonConverterFactory.create())  
  78.                         .baseUrl(BASE_URL)  
  79.                         .build();  
  80.   
  81.         HttpRequest service = retrofit.create(HttpRequest.class);  
  82.   
  83.         Call<UserInfo> call = service.login("liu""123");  
  84.   
  85.         call.enqueue(new Callback<UserInfo>() {  
  86.             @Override  
  87.             public void onResponse(Call<UserInfo> call, Response<UserInfo> response) {  
  88.                 //请求成功操作  
  89.                 normaltxt.setText("82---"+response.body().getUsername());  
  90.             }  
  91.             @Override  
  92.             public void onFailure(Call<UserInfo> call, Throwable t) {  
  93.                 //请求失败操作  
  94.                 normaltxt.setText("87--"+t.getMessage());  
  95.             }  
  96.         });  
  97.     }  
  98.   
  99.     /** 
  100.      * Retrofit支持rxjava的网络请求 
  101.      */  
  102.     private void requestByRxjava()  
  103.     {  
  104.         //测试一  
  105.        /* Retrofit retrofit = new Retrofit.Builder() 
  106.                 .baseUrl(BASE_URL) 
  107.                 .addConverterFactory(GsonConverterFactory.create()) 
  108.                 .addCallAdapterFactory(RxJavaCallAdapterFactory.create()) 
  109.                 .build(); 
  110.  
  111.         HttpRequest service = retrofit.create(HttpRequest.class); 
  112.  
  113.         service.loginByRxjava("liuhulai", "123") 
  114.                 .subscribeOn(Schedulers.io()) 
  115.                 .observeOn(AndroidSchedulers.mainThread()) 
  116.                 .subscribe(new Subscriber<UserInfo>() { 
  117.                     @Override 
  118.                     public void onCompleted() { 
  119.                         Toast.makeText(MainActivity.this, "Get Top Movie Completed", Toast.LENGTH_SHORT).show(); 
  120.                     } 
  121.  
  122.                     @Override 
  123.                     public void onError(Throwable e) { 
  124.  
  125.                         Toast.makeText(MainActivity.this, e.getMessage(), Toast.LENGTH_SHORT).show(); 
  126.                     } 
  127.  
  128.                     @Override 
  129.                     public void onNext(UserInfo movieEntity) { 
  130.                         rxjavatxt.setText("124----"+movieEntity.getUsername()); 
  131.                     } 
  132.                 });*/  
  133.   
  134.         //测试二,返回的数据结果为泛型类  
  135.         Retrofit retrofit = new Retrofit.Builder()  
  136.                 .baseUrl(BASE_URL)  
  137.                 .addConverterFactory(GsonConverterFactory.create())  
  138.                 .addCallAdapterFactory(RxJavaCallAdapterFactory.create())  
  139.                 .build();  
  140.   
  141.         HttpRequest service = retrofit.create(HttpRequest.class);  
  142.   
  143.         tmpSubscription = service.loginByRxjava2("liuhulai""123")  
  144.                 .subscribeOn(Schedulers.io())  
  145.                 .observeOn(AndroidSchedulers.mainThread())  
  146.                 .subscribe(new Subscriber<HttpResult<UserInfo>>() {  
  147.                     @Override  
  148.                     public void onCompleted() {  
  149.                         Toast.makeText(MainActivity.this"Get Top Movie Completed", Toast.LENGTH_SHORT).show();  
  150.                     }  
  151.   
  152.                     @Override  
  153.                     public void onError(Throwable e) {  
  154.   
  155.                         Toast.makeText(MainActivity.this, e.getMessage(), Toast.LENGTH_SHORT).show();  
  156.                     }  
  157.   
  158.                     @Override  
  159.                     public void onNext(HttpResult<UserInfo> userInfoHttpResult) {  
  160.                         HttpResult<UserInfo> result = userInfoHttpResult;  
  161.                         rxjavatxt.setText("124----"+ result.getResultMessage() +"\n"+result.getData().getUsername());  
  162.   
  163.                     }  
  164.                 });  
  165.   
  166.   
  167.     }  
  168.   
  169.     @Override  
  170.     protected void onDestroy() {  
  171.         super.onDestroy();  
  172.         SubscribeUtils.unSubscribe(tmpSubscription);  //取消订阅请求用的  
  173.     }  
  174. }  


5.布局文件:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout 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"
    android:paddingBottom="@dimen/activity_vertical_margin"
    android:paddingLeft="@dimen/activity_horizontal_margin"
    android:paddingRight="@dimen/activity_horizontal_margin"
    android:paddingTop="@dimen/activity_vertical_margin"
    android:orientation="vertical"
    tools:context="com.example.yourdream.retrofitdemo.MainActivity">

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:orientation="horizontal">

        <Button
            android:id="@+id/norml"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_weight="1"
            android:text="普通请求"/>

        <Button
            android:id="@+id/rxjava"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_weight="1"
            android:text="rxjava请求"/>

    </LinearLayout>

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:orientation="horizontal">

        <TextView
            android:id="@+id/txt"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_weight="1"
            android:text="Hello World!" />

        <TextView
            android:id="@+id/rxjava_txt"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_weight="1"
            android:text="Hello World!" />

    </LinearLayout>

</LinearLayout>


6.jsp服务后台类
  1. <%@ page contentType="text/html; charset=utf-8" language="java"%>  
  2. <%@ page import"java.io.InputStream "%>  
  3. <%@ page import="java.io.BufferedReader"  %>  
  4. <%@ page import="java.io.InputStreamReader" %>  
  5. <%@ page import="java.io.PrintWriter" %>  
  6. <%@ page import="org.json.JSONObject" %>  
  7.   
  8. <%  
  9.   
  10.       
  11.     System.out.println("12-------username:"+request.getParameter("username"));  
  12.     System.out.println("12-------pwd:"+request.getParameter("username"));  
  13.       
  14.     /* BufferedReader br = new BufferedReader(new InputStreamReader(request.getInputStream(), "UTF-8")); 
  15.     System.out.println("14-------ReadClientInputStream........."+(br==null)); 
  16.     StringBuffer sb =new StringBuffer("");   
  17.     String temp; 
  18.      
  19.     while((temp=br.readLine())!=null) 
  20.     {   
  21.         sb.append(temp);   
  22.         System.out.println("21........."+temp); 
  23.     }   
  24.     br.close();   
  25.     System.out.println("ReadClientInputStream........."+sb); */  
  26.       
  27.     /** 
  28.     *回传给服务端的数据 测试一 
  29.     */  
  30.     /* JSONObject recObj= new JSONObject(); 
  31.     recObj.put("username", "liuxb"); 
  32.     recObj.put("password","123456"); 
  33.      
  34.     PrintWriter pw=response.getWriter(); 
  35.     pw.write(recObj.toString()); 
  36.     pw.flush(); 
  37.     pw.close(); */  
  38.       
  39.       
  40.     /** 
  41.      *回传给服务端的数据  测试二 
  42.      */  
  43.     JSONObject recObj= new JSONObject();  
  44.       
  45.     recObj.put("resultCode"0);  
  46.     recObj.put("resultMessage","成功");  
  47.       
  48.     JSONObject data= new JSONObject();  
  49.     data.put("username""liuxb");  
  50.     data.put("password","123456");  
  51.       
  52.     recObj.put("data",data);  
  53.       
  54.     PrintWriter pw=response.getWriter();  
  55.     pw.write(recObj.toString());  
  56.     pw.flush();  
  57.     pw.close();  
  58.   
  59.      
  60. %>  
  61. <html>  
  62.  <head>  
  63.      
  64.      <script language="javascript">  
  65.       
  66.      </script>  
  67.        
  68.   </head>  
  69.   <body >  
  70.     <div>  
  71.                      提交监听数据页面  
  72.     </div>  
  73.       
  74.         
  75.   </body>  
  76. </html> 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: OkHttpRxJava和Retrofit是个非常常用的组合,用来进行网络请求和处理。 首先,OkHttp是一个开源的HTTP客户端,提供了简洁的接口,用于与服务器进行通信,并且支持HTTP/2协议,拥有连接池、请求重试和缓存等功能。 然后,RxJava是一个基于观察者模式的异步编程库,可以用于处理异步操作,如网络请求、文件IO等。它的核心是Observable(被观察者)和Subscriber(订阅者),通过各种操作符可以对数据进行变换和处理。 最后,Retrofit是一个RESTful风格的HTTP请求库,它基于OkHttp,使用了Retrofit的注解和接口定义的方式,可以方便地进行网络请求。它支持动态代理,可以将网络请求接口转化为对应的HTTP请求,支持同步和异步请求,并且可以将响应数据转化为Java对象。 综上所述,我们可以使用OkHttp作为底层网络库,然后结合RxJava和Retrofit进行网络请求和数据处理。使用Retrofit的注解和接口定义方式,可以简化网络请求的代码,并且通过RxJava的操作符可以对请求结果进行变换和处理,使得代码更加清晰和可读性。 在使用过程中,可以先创建一个Retrofit实例,并指定OkHttpClient作为网络客户端,然后定义一个接口,在该接口中使用Retrofit的注解,定义网络请求的方法。最后,通过创建该接口的实例,即可进行网络请求,并结合RxJava进行操作。 总之,使用OkHttpRxJava和Retrofit组合进行网络请求可以提高效率和可读性,并且可以处理各种复杂的网络场景,是一种非常实用的方式。 ### 回答2: OKHTTPRXJava和Retrofit是Android开发中常用的三个库,可以一起使用来进行网络请求和数据处理。 OKHTTP是一个用于处理网络请求的库,可以发送HTTP请求并获取服务器返回的数据。它提供了简洁的API和高效的网络堆栈,可以很好地处理网络请求。我们可以使用OKHTTP来发送SOAP请求到WebService,并获得响应。 RXJava是一个流编程库,它提供了一种被观察者和观察者模式,可以简化异步操作和事件处理。我们可以使用RXJava来处理OKHTTP返回的响应数据,在主线程或后台线程中进行处理,实现数据的异步处理和流式编程。 Retrofit是一个基于OKHTTP的RESTful风格的网络请求库,它提供了一种简洁的方式来定义和发送HTTP请求,并将响应转换为可用的Java对象。我们可以使用Retrofit来定义WebService接口,然后使用注解来指定请求方法、路径和参数,Retrofit会自动帮我们处理请求和响应。 通过OKHTTP的原生支持、RXJava的异步处理和Retrofit的网络请求,我们可以很方便地使用OKHTTPRXJava和Retrofit一起发送WebService请求。首先,我们可以使用Retrofit定义WebService接口,再使用RXJava来处理OKHTTP返回的响应数据,实现简洁高效的网络请求和数据处理。 综上所述,OKHTTPRXJava和Retrofit是Android开发中常用的网络请求库,它们能够很好地协作,实现对WebService的请求和响应的处理。通过使用它们,我们可以简化网络请求的编写,并实现高效的数据处理。 ### 回答3: OkHttpRxJava和Retrofit是三个在Android开发中常用的网络请求库,它们在一起能够提供更加便捷和高效的网络请求处理。 首先,OkHttp是一个开源的HTTP客户端,它能够处理网络请求、连接管理、请求重试等一系列的网络相关事务。它的特点是简单易用、性能优越、可定制性强。我们可以通过使用OkHttp来发送和接收基于HTTP的请求响应,并进行网络请求的管理和处理。 其次,RxJava是一个响应式编程框架,它基于观察者模式和函数式编程的思想,提供了一系列强大的操作符和线程切换的能力。我们可以使用RxJava来处理异步任务,加快网络请求的响应时间,并且提供方便的线程切换和错误处理机制。 最后,Retrofit是一个RESTful风格的网络请求框架,它结合了OkHttpRxJava的强大功能。它提供了一种简单的方式来定义和处理RESTful API的请求和响应。我们可以使用Retrofit来创建和处理webservice的请求,根据API的接口定义来发送请求,并将返回的结果映射到Java对象中。 综上所述,使用OkHttpRxJava和Retrofit能够方便地进行webservice的网络请求,并在处理过程中提供更好的性能和便利性。这三个库的结合能够大大简化网络请求的开发工作,提高开发效率,并提供更好的用户体验。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值