WebService+Rxjava

2023-10-29

最近公司有了个新项目,是之前有个项目需要迭代.由于这个项目比较老.所以用的是WebService的接口.我之前都是写的是restful的接口.没有接触过WebServiece.看到之前的代码我也有点闷逼,于是就花了几天去研究了下WebService

 

WebSerivce 比 restful出现的早.所以像像我这这种工作两三年的有点都可能没有接触过WebService. WebService底层是依赖SOAP协议的,主要核心是面向活动的,而restful其实就是我们常用的get  post 等 ,他是面向资源的 . WebService最早是针对RPC的一种解决方案简单对象访问协议,默认参数数据格式是XML的,而Restful是针对网络应用设计的,设计了不同的请求状态,来降低来发的复杂度,提高系统的可伸缩性 .其实WebService和Restful没有什么区别,底层都是用HttpURLConnection实现的只是他们参数,请求头(报文)的拼接方式不同而已,在Restful中叫请求头,在WebService中叫报文. 

现在Retrofit + Rxjava很火 ,主要是因为Retrofit使用方便并且解耦强 , 而Rxjava可以自由的切换线程 ,不用我们访问网络创建子线程,得到数据在转换到主线程

下面是我封装的一个简单的WebService+Rxjava的代码 ,如果我意见或问题 请大家留言,一起成长

package com.example.qikais.myapplication.webservice;


import com.example.qikais.myapplication.retfiter.ProgressSubscriber;
import com.google.gson.Gson;

import org.ksoap2.SoapEnvelope;
import org.ksoap2.serialization.SoapObject;
import org.ksoap2.serialization.SoapSerializationEnvelope;
import org.ksoap2.transport.AndroidHttpTransport;
import org.xmlpull.v1.XmlPullParserException;

import java.io.IOException;
import java.util.Map;

import rx.Observable;
import rx.Subscriber;
import rx.android.schedulers.AndroidSchedulers;
import rx.functions.Action0;
import rx.schedulers.Schedulers;

/**
 * Created by qikais on 2017/7/31.
 */

public class WebService<T> {
    private boolean isHttps = false;

    public void getRxjava(final Class clazz , final String NameSpace, final String MethodName,
                          final String URL , final Map<String ,String> map, final ProgressSubscriber<T> subscriber){
        //1.通过Observable.create创建一个被观察者对象  再重写call通知观察者
        Observable.create(new Observable.OnSubscribe<T>() {
            @Override
            public void call(Subscriber<? super T> subscriber) {
                try {
                    subscriber.onNext((T) new Gson().fromJson(getData(NameSpace, MethodName, URL ,map),clazz));
                } catch (Exception e) {
                    subscriber.onError(e);
                }
                subscriber.onCompleted();
            }
            //2.设置观察者和被观察者执行的线程
    }).subscribeOn(Schedulers.io())
                .unsubscribeOn(Schedulers.io())
                .observeOn(AndroidSchedulers.mainThread())
                .doOnSubscribe(new Action0() {
                    @Override
                    public void call() {
                        subscriber.showProgressDialog();
                    }
                    //3.观察者被观察者关联
                }).subscribe(subscriber);
    }

    //访问网络获取数据
    private String getData(String NameSpace, String MethodName, String URL , Map<String , String> map) throws IOException, XmlPullParserException {
        if(isHttps){
            _FakeX509TrustManager.allowAllSSL();
        }
        //1.创建SoapObject 入参  命名空间  WebService服务端的具体方法名
        SoapObject soapObject = new SoapObject(NameSpace, MethodName);

        //2.通过SoapObject的addProperty方法添加参数
        for (Map.Entry<String, String> entry : map.entrySet()) {
            soapObject.addProperty(entry.getKey(), entry.getValue());
        }

        //3.创建SoapSerializationEnvelope对象,传入SOAP协议版本号  默认是VER11  主要还是看service
        SoapSerializationEnvelope envelope = new SoapSerializationEnvelope(SoapEnvelope.VER11);
        envelope.dotNet = false;   //true表示服务器获取入参按添加的顺序
        envelope.setOutputSoapObject(soapObject);

        //4.创建HttpTransportSE真正访问网络获取数据的对象 传入URL
        //AndroidHttpTransport HttpTransportS的子类 多需要传入一个连接时间 不过这个方法已经过期了
//        HttpTransportSE httpsE = new HttpTransportSE(URL);
        AndroidHttpTransport httpsE=new AndroidHttpTransport(URL,30000);
        httpsE.debug = false;    //是否是调试模式S

        //5.HttpTransportS调用call方法发起数据 传入    命名空间/方法名  ,  SoapSerializationEnvelope对象   ,  设置额外请求头
        //访问成功后 自动讲数据存储到 SoapSerializationEnvelope的bodyIn里面了
        httpsE.call(NameSpace + "/" + MethodName, envelope, null);
        return envelope.getResponse().toString();
//        envelope.bodyIn
//        logonResponse{logonReturn={"admin":false,"bureauID":null,"bureauName":"3440102","bureauTitle":null,"css":"default","departmentID":null,"departmentName":"0000073940","departmentTitle":null,"deskStyle":"default","groupID":null,"institutionID":null,"institutionName":null,"institutionPath":"","institutionTitle":null,"kind":4,"loginName":"yyy","logonTime":"2017-07-29T18:49:33","machineIP":"172.20.81.67","machineName":"172.20.81.67","modifyTime":"2017-04-24T09:09:08","modifyUserID":"{CD198DD6-82FD-5BBB-010B-519BD766787A}","personID":null,"personName":null,"personTitle":null,"sectionID":null,"sectionName":null,"sectionTitle":null,"user":{"ID":"{CD198DD6-82FD-5BBB-010B-519BD766787A}","alarmStyle":"complain.mp3","autoShowMessage":false,"bureauID":null,"bureauName":"3440102","bureauTitle":null,"css":"default","departmentID":null,"departmentName":"0000073940","departmentTitle":null,"deskStyle":"default","email":"glm19850719@163.com","email2":"aaaa@asf.com","endTime":null,"expired":false,"grantee":null,"grantors":null,"groupID":null,"index":0,"institutionID":null,"institutionName":null,"institutionTitle":null,"ipLimit":null,"macAddress":null,"mobile":"13800138001","modifyID":"{CD198DD6-82FD-5BBB-010B-519BD766787A}","modifyTime":"2017-04-24T09:09:08","name":"YYY","office1":"11","office2":"1111","personID":null,"personName":null,"personTitle":null,"realm":"","sectionID":null,"sectionName":null,"sectionTitle":null,"startTime":null,"title":"营业员","virtualNumber":"851997"},"userID":"{CD198DD6-82FD-5BBB-010B-519BD766787A}","userTitle":"营业员","userTitleEx":"营业员","username":"YYY","usernameEx":"YYY","validLogon":true,"webPath":"http:\/\/172.19.188.189:6070\/web"}; }
//        envelope.getResponse()
//        {"admin":false,"bureauID":null,"bureauName":"3440102","bureauTitle":null,"css":"default","departmentID":null,"departmentName":"0000073940","departmentTitle":null,"deskStyle":"default","groupID":null,"institutionID":null,"institutionName":null,"institutionPath":"","institutionTitle":null,"kind":4,"loginName":"yyy","logonTime":"2017-07-29T18:49:33","machineIP":"172.20.81.67","machineName":"172.20.81.67","modifyTime":"2017-04-24T09:09:08","modifyUserID":"{CD198DD6-82FD-5BBB-010B-519BD766787A}","personID":null,"personName":null,"personTitle":null,"sectionID":null,"sectionName":null,"sectionTitle":null,"user":{"ID":"{CD198DD6-82FD-5BBB-010B-519BD766787A}","alarmStyle":"complain.mp3","autoShowMessage":false,"bureauID":null,"bureauName":"3440102","bureauTitle":null,"css":"default","departmentID":null,"departmentName":"0000073940","departmentTitle":null,"deskStyle":"default","email":"glm19850719@163.com","email2":"aaaa@asf.com","endTime":null,"expired":false,"grantee":null,"grantors":null,"groupID":null,"index":0,"institutionID":null,"institutionName":null,"institutionTitle":null,"ipLimit":null,"macAddress":null,"mobile":"13800138001","modifyID":"{CD198DD6-82FD-5BBB-010B-519BD766787A}","modifyTime":"2017-04-24T09:09:08","name":"YYY","office1":"11","office2":"1111","personID":null,"personName":null,"personTitle":null,"realm":"","sectionID":null,"sectionName":null,"sectionTitle":null,"startTime":null,"title":"营业员","virtualNumber":"851997"},"userID":"{CD198DD6-82FD-5BBB-010B-519BD766787A}","userTitle":"营业员","userTitleEx":"营业员","username":"YYY","usernameEx":"YYY","validLogon":true,"webPath":"http:\/\/172.19.188.189:6070\/web"}
    }
}

 

 

 

里面的Subsceiber观察者我写了个带加载动画和异常处理的功能

 

package com.example.qikais.myapplication.retfiter;


import android.content.Context;

import com.example.dome.MyApplition;
import com.example.dome.retfiter.ProgressCancelListener;
import com.example.qikais.myapplication.retfiter.exception.ApiException;
import com.example.qikais.myapplication.utils.NetworkUtils;
import com.example.qikais.myapplication.view.widget.SimpleLoadDialog;

import rx.Subscriber;

public  abstract class ProgressSubscriber<T> extends Subscriber<T> implements ProgressCancelListener{

    private SimpleLoadDialog dialogHandler;

    public ProgressSubscriber(Context context) {
        dialogHandler = new SimpleLoadDialog(context,this,true);
    }

    @Override
    public void onCompleted() {
        dismissProgressDialog();
    }


    /** 显示Dialog*/
    public void showProgressDialog(){
        if (dialogHandler != null) {
            dialogHandler.obtainMessage(SimpleLoadDialog.SHOW_PROGRESS_DIALOG).sendToTarget();
            dialogHandler.show();
        }
    }

    @Override
    public void onNext(T t) {
        _onNext(t);
    }

    /** 隐藏Dialog*/
    private void dismissProgressDialog(){
        if (dialogHandler != null) {
            dialogHandler.obtainMessage(SimpleLoadDialog.DISMISS_PROGRESS_DIALOG).sendToTarget();
            dialogHandler.dismiss();
            dialogHandler=null;
        }
    }
    @Override
    public void onError(Throwable e) {
        e.printStackTrace();
        if (NetworkUtils.checkNetwork(MyApplition.appcontext)) {
            _onError("网络不可用");
        } else if (e instanceof ApiException) {
            _onError(e.getMessage());
        } else {
            _onError("请求失败,请稍后再试...");
        }
        dismissProgressDialog();
    }


    @Override
    public void onCancelProgress() {
        if (!this.isUnsubscribed()) {
            System.out.println("销毁");
            this.unsubscribe();
        }
    }
    protected abstract void _onNext(T t);
    protected abstract void _onError(String message);
}

 

 

 

 

 

 

 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

WebService+Rxjava 的相关文章

  • Android 中所有活动的单套接字 IO 连接

    我已经为 SocketIOClient 参考创建了 Singleton 类here https stackoverflow com questions 13709783 android socket io switch activities
  • Android SQLite 数据库从查询中删除重复项

    我是 SQLite 新手 我使用此查询是为了从特定用户的列中提取所有行 Cursor c db query true TABLE COLUMN USER user null null null null null 这是表格的示例 group
  • Android 上的多处理

    我一直在 Android 上执行一些测试 以验证并行化算法 如 FFT 的性能可以提高多少 我通过使用带有 JNI FFTW 的 pthread 和 Java 线程 来自 JTransforms 来实现这些算法 我没有像预期那样通过使用线程
  • 如何检测手机一整圈(360 度)?

    由于我在网络上搜索没有找到任何相关答案 因此我发布了有关检测的问题360度转弯使用加速度计绕其轴的 Android 设备 例如 在横向模式下围绕 y 轴 假设在起始位置 y 值为 0 设备平坦于地面 当手机向前旋转 90 度时y 10 18
  • Android Volley:意外响应代码 405

    我的 Android Volley JsonObjectRequest 遇到 onErrorResponse 并出现以下问题 BasicNetwork performRequest Unexpected response code 405
  • 使用 HashMap 映射 String 和 int

    我有一个显示国家 地区名称的列表视图 我已将名称作为字符串数组存储在 strings xml 中 称为国家 地区名称 在填充 ListView 时 我使用从 strings xml 读取的 ArrayAdapter String count
  • 尝试在谷歌地图V2 Android应用程序中获取空数组的长度

    我目前正在使用谷歌地图API开发一个Android应用程序 有时我会因为没有明显的原因而发生奇怪的崩溃 在我看来 这是崩溃日志 12 02 16 38 57 071 20796 21137 com appsolute ParkYoo E A
  • 从 Android 函数更新 Textview

    有人可以告诉我如何从函数更新 Android Textview 控件吗 我在互联网上进行了深入搜索 看到很多人都问同样的问题 我测试了线程但无法工作 有人有一个简单的工作示例吗 例如 调用一个函数 在循环中运行多次 并且该函数在 TextV
  • Android 偏好设置中的“是”或“否”确认[重复]

    这个问题在这里已经有答案了 我需要在 设置 中实现 重置 选项 单击该设置后 将打开一个简单的对话框 要求确认 我看过了DialogPreference但我似乎无法在任何地方找到好的解决方案或教程 有人可以帮我吗 我是初学者 想法甚至代码都
  • 如何以编程方式关闭画中画

    我在使用画中画模式时遇到了这个问题 当从 PIP 本身以外的其他位置再次打开 Activity 时 我想关闭 PIP 画中画 不是来自关闭按钮 我想要与 youtube 相同的场景 即当用户单击 PIP 画中画 时 它会打开相同的活动 但是
  • 在 Unity 中构建 apk 应用程序时包含文件

    在unity中构建apk文件时如何将文件和文件夹添加到apk文件中 我需要的是在Android上安装应用程序后 在应用程序的父目录 android data com company product files 中存在一些文件和文件夹 这是我
  • 视图随软键盘移动,遮挡其他 UI 对象

    我有一个容器视图 我希望它始终位于视图底部 位于 ScrollView 下方 ScrollView 有一些 UI 对象 其中一个是 EditText 对象 目前 当用户点击 EditText 对象内部时 android softkeyboa
  • 无法读取第 0 行,第 -1 列

    我正在尝试复制使用 SQLite 管理器创建的数据库 我在其中执行了以下操作 CREATE TABLE android metadata locale TEXT DEFAULT en US and INSERT INTO android m
  • java.exe 以非零退出值 1 结束

    只是为了开始 我并不是真正尝试从 Android 中的 xlsx 文件中读取单元格 我已经尝试了几乎所有我在 Google 上搜索到的内容 但是每次 在两台不同的 PC 上 都是 Java 1 7 0 79 当我尝试构建 运行 这个应用程序
  • 地理围栏不可用以及如何处理

    我正在 Android 上使用地理围栏 它在大多数手机上都工作正常 但在其中一些上 它不起作用 在我的错误日志中显示 地理围栏不可用 某些用户没有为 Google Play 服务启用位置跟踪 我认为这就是地理围栏在他们的手机上不起作用的原因
  • Meteor:即使设置了 ANDROID_HOME 也未设置

    操作系统 Ubuntu 14 04 框架 流星1 1 0 2 应用名称 Songofy 这是输出meteor install sdk android meteor install sdk android Found Android bund
  • 在 Tensorflow-lite Android 中将位图转换为 ByteBuffer(浮点)

    在用于图像分类的tensorflow lite android演示代码中 图像首先转换为ByteBuffer格式以获得更好的性能 这种从位图到浮点格式的转换以及随后到字节缓冲区的转换似乎是一个昂贵的操作 循环 按位运算符 float mem
  • 使用Gradle组装时如何更改Android应用程序包名称?

    是否可以使用 Gradle 更改 Android 应用程序的包名称 我需要编译同一应用程序的两个副本 并具有唯一的包名称 这样我就可以向市场发布两次 作为使用的更简单的替代方案产品口味 正如伊森的回答 https stackoverflow
  • FragmentMap + ActionBar 选项卡

    我一直在尝试插入一个MapView进入一个ActionBar Tab 但我什至无法解决问题 即使谷歌搜索 这是主要活动 Override public void onCreate Bundle savedInstanceState supe
  • Android:通过查找带有标签而不是 ID 的容器来添加片段

    我正在使用 for 循环创建片段的多个实例 在每个片段中 我需要添加另一组子片段 为此 我需要找到正确的容器 如果我使用容器的 ID 所有子片段都会添加到第一个父片段 而不是它们自己的父片段 在我的主要片段中 for ParentFragm

随机推荐

  • 【UE4从零开始 021】控件类型介绍

    1 Common 选项 说明 边框 Border 边框是容器控件 可以包含一个子控件 提供使用边框图像和可调节的填补将其包围起来的机会 按钮 Button 按钮是单子项 可点击的Primitive控件 它可实现基本交互 你可将任何其他控件放
  • 网友最想问Chatgpt的问题,我都整理在这里了

    前言 我整理了几个网友最想问chatgpt的问题 帮助那些还没用上chatgpt的网友们 首先申明本人使用chatgpt仅作为技术探讨 学习交流用途 没有任何不良导向 考虑到英文阅读的难度 我就直接问中文了 问题内容 1 如何成为百万富翁
  • 2021年CCPC河南省赛部分题解

    文章目录 2825 收集金币 状态机dp 2826 使用技能 乘法逆元 组合数学 2827 欢度佳节 位运算 枚举 2829 闯关游戏 DP 2834 小凯的书架 树状数组 二分 2835 未成年人之友 模拟 2836 黑曜石 思维 282
  • vs工程 vcproj和开发环境定义宏---$(IntDir)和$(OutDir)

    一 vs 基础配置文件解析 vcproj是工程文件 sln是解决方案文件 一个解决方案里面可以包含多个工程 你打开vcproj文件编译不了可能是因为这个工程里面用到了同一个解决方案中其它工程的东西 visual Studio NET采用两种
  • 解决network-manager中wired为unmanaged的问题

    我的Debian 7 1安装好时没有network manager 便下载安装了一个 但安装完后wired总显示为unmanaged 解决方法如下 打开 etc NetworkManager NetworkManager conf 将man
  • Android 属性动画(Property Animation) 完全解析 (上)

    转载请标明出处 http blog csdn net lmj623565791 article details 38067475 1 概述 Android提供了几种动画类型 View Animation Drawable Animation
  • matlab 转换为正整数_【MATLAB】专题1笔记 MATLAB基础知识

    视频课程参考 https www bilibili com video BV19J411W7Ta 数值问题 gt 求解算法 gt 程序实现 gt 结果分析 MATLAB 功能 数值计算 符号计算 图形绘制 程序流程绘制 工具箱 数值计算方法
  • 什么是哈希函数

    Hash函数译为哈希函数 又称散列函数 是把任意长度的输入 通过散列算法 变换成固定长度的输出 该输出的值称为散列值或消息摘要 简单来说就是一种将任意长度的输入消息压缩成某一固定长度的消息摘要的函数 它具备以下的性质 哈希函数所必须的性质
  • 《数据结构》_PTA_数据结构作业5:树和二叉树

    判断题 1 1 某二叉树的前序和中序遍历序列正好一样 则该二叉树中的任何结点一定都无右孩子 F 1 2 存在一棵总共有2016个结点的二叉树 其中有16个结点只有一个孩子 F 1 3 哈夫曼树中一定没有度为 1 的结点 T 1 4 一棵非空
  • jdk1.8接口

    在1 8版本之前 接口中的常量必须复制 且接口中的方法都是抽象方法 public interface Bird int a 这里会报错 因为常量必须赋值才行 int b 10 void shout1 这里报错 因为抽象方法没有方法体 voi
  • KMP算法最浅显理解

    角色 甲 abbaabbaaba 乙 abbaaba 乙对甲说 帮忙找一下我在你的哪个位置 甲从头开始与乙一一比较 发现第 7 个字符不匹配 要是在往常 甲会回退到自己的第 2 个字符 乙则回退到自己的开头 然后两人开始重新比较 这样的事情
  • 加密世界的价值捕获:谁是超级捕获者?

    来源 蓝狐笔记 麦田的收获者 梵高 加密世界还很早期 整个行业都还处于构建的初级阶段 在这种情况下 有哪些赛道正在捕获价值 捕获价值的量级有多大 蓝狐笔记简要梳理一下加密行业的整体价值捕获情况 从中窥见加密行业不同赛道的价值捕获现状 尤其是
  • Gradle史上最详细解析

    转自 http www cnblogs com wxishang1991 p 5532006 html 前言 对于Android工程师来说编译 打包等问题立即就成痛点了 一个APP有多个版本 Release版 Debug版 Test版 甚至
  • 计算机提示xinput1_4.dll丢失的解决方法,哪种更值得推荐

    最近我在使用某个游戏时遇到了一个问题 就是出现了xinput1 4 dll文件缺失的错误 这个错误让我无法正常启动游戏 让我感到非常困扰和沮丧 经过一番努力 我终于成功修复了这个问题 也总结了一些解决方法 大家可以对比一下哪种更值得推荐 x
  • react 属性验证与默认属性

    类组件属性验证与默认属性 通过static定义类的属性 属性验证可以引入模板自带的prop types来进行类型判断 当然你也可以自己写一个类型判断的方法 然后对类的propTypes属性进行类型编写 propTypes 这个属性名不可自定
  • 【AWS实验】 使用 Lake Formation 设置数据湖

    文章目录 实验概览 目标 实验环境 任务 1 探索实验环境 任务 1 1 在 S3 存储桶中创建文件夹 任务 1 2 加载 AWS Cloud9 IDE 任务 1 3 将数据复制到 S3 存储桶 任务 2 设置 AWS Lake Forma
  • jq的ajax里面的datagrid,详解jquery easyui之datagrid使用参考

    本文介绍了jquery easyui之datagrid使用 具体如下 创建datagrid 在页面上添加一个div或table标签 然后用jquery获取这个标签 并初始化一个datagrid 代码如下 页面上的div标签 js代码 mag
  • ES配置与使用

    一 单机版安装 地址 www elastic co 下载tar格式 或者复制链接 wget url下载 启动 bin elasticsearch 二 插件 解决页面问题 GitHub下载 elasticsearch head 需要node环
  • RISC-V新进展!deepin 成功适配VisionFive 2

    RISC V指令集是基于精简指令集计算 RISC 原理建立的开放指令集架构 ISA RISC V则是在指令集不断发展和成熟的基础上建立的全新指令 RISC V指令集完全开源 设计简单 拥有模块化的设计 完整的工具链 易于移植Unix系统 以
  • WebService+Rxjava

    最近公司有了个新项目 是之前有个项目需要迭代 由于这个项目比较老 所以用的是WebService的接口 我之前都是写的是restful的接口 没有接触过WebServiece 看到之前的代码我也有点闷逼 于是就花了几天去研究了下WebSer