RetrolFit+rxjava + okHttp與服務 互動的例子+取消retrolfit網路請求

TTMMJJ99發表於2017-11-11

本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> 

相關文章