封装Okhttp+retrofit+rxjava使用MVP模式实现登录注册

mvp+retrofit+okhttp实现登录demo mvp+retrofit+okhttp实现登录demo,接口访问日志过滤输入OkHttp 可以自己换个环境 立即下载

一,首先就是两个页面布局

    1,登录页面的布局

 

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/activity_main"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical">

    <EditText
        android:id="@+id/phone"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_marginTop="50dp"
        android:gravity="center"
        android:hint="请输入手机号" />

    <EditText
        android:id="@+id/password"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_marginTop="50dp"
        android:gravity="center"
        android:hint="请输入密码" />

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_marginTop="50dp"
        android:gravity="center"
        android:orientation="horizontal">

        <Button
            android:id="@+id/login"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_weight="1"
            android:text="登录" />

        <Button
            android:id="@+id/reg"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_weight="1"
            android:text="注册" />
    </LinearLayout>
</LinearLayout>

    2,注册页面的布局

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/activity_main"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical">

    <EditText
        android:id="@+id/phone"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_marginTop="50dp"
        android:gravity="center"
        android:hint="请输入手机号" />

    <EditText
        android:id="@+id/password"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_marginTop="50dp"
        android:gravity="center"
        android:hint="请输入密码" />

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_marginTop="50dp"
        android:gravity="center"
        android:orientation="horizontal">

        <Button
            android:id="@+id/reg"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_weight="1"
            android:text="注册" />
    </LinearLayout>
</LinearLayout>

二,拿到登录和注册的接口,分别请求,创建出实体bean类。

           1,登录bean类

public class LoginBean {

    /**
     * msg : 登录成功
     * code : 0
     * data : {"age":null,"appkey":"9cdef4b09eb65685","appsecret":"66B6E2E5F439618D01B67FBAEA31EFDA","createtime":"2018-01-15T16:19:03","email":null,"fans":null,"follow":null,"gender":null,"icon":null,"latitude":null,"longitude":null,"mobile":"18765432100","money":null,"nickname":null,"password":"473344696F4685CAE5B5B3C354BC77BE","praiseNum":null,"token":"AFD92DF6C6046F01B76D7C551AEC985B","uid":4362,"userId":null,"username":"18765432100"}
     */

    private String msg;
    private String code;
    private DataBean data;

    public String getMsg() {
        return msg;
    }

    public void setMsg(String msg) {
        this.msg = msg;
    }

    public String getCode() {
        return code;
    }

    public void setCode(String code) {
        this.code = code;
    }

    public DataBean getData() {
        return data;
    }

    public void setData(DataBean data) {
        this.data = data;
    }

    public static class DataBean {
        /**
         * age : null
         * appkey : 9cdef4b09eb65685
         * appsecret : 66B6E2E5F439618D01B67FBAEA31EFDA
         * createtime : 2018-01-15T16:19:03
         * email : null
         * fans : null
         * follow : null
         * gender : null
         * icon : null
         * latitude : null
         * longitude : null
         * mobile : 18765432100
         * money : null
         * nickname : null
         * password : 473344696F4685CAE5B5B3C354BC77BE
         * praiseNum : null
         * token : AFD92DF6C6046F01B76D7C551AEC985B
         * uid : 4362
         * userId : null
         * username : 18765432100
         */

        private Object age;
        private String appkey;
        private String appsecret;
        private String createtime;
        private Object email;
        private Object fans;
        private Object follow;
        private Object gender;
        private Object icon;
        private Object latitude;
        private Object longitude;
        private String mobile;
        private Object money;
        private Object nickname;
        private String password;
        private Object praiseNum;
        private String token;
        private int uid;
        private Object userId;
        private String username;

        public Object getAge() {
            return age;
        }

        public void setAge(Object age) {
            this.age = age;
        }

        public String getAppkey() {
            return appkey;
        }

        public void setAppkey(String appkey) {
            this.appkey = appkey;
        }

        public String getAppsecret() {
            return appsecret;
        }

        public void setAppsecret(String appsecret) {
            this.appsecret = appsecret;
        }

        public String getCreatetime() {
            return createtime;
        }

        public void setCreatetime(String createtime) {
            this.createtime = createtime;
        }

        public Object getEmail() {
            return email;
        }

        public void setEmail(Object email) {
            this.email = email;
        }

        public Object getFans() {
            return fans;
        }

        public void setFans(Object fans) {
            this.fans = fans;
        }

        public Object getFollow() {
            return follow;
        }

        public void setFollow(Object follow) {
            this.follow = follow;
        }

        public Object getGender() {
            return gender;
        }

        public void setGender(Object gender) {
            this.gender = gender;
        }

        public Object getIcon() {
            return icon;
        }

        public void setIcon(Object icon) {
            this.icon = icon;
        }

        public Object getLatitude() {
            return latitude;
        }

        public void setLatitude(Object latitude) {
            this.latitude = latitude;
        }

        public Object getLongitude() {
            return longitude;
        }

        public void setLongitude(Object longitude) {
            this.longitude = longitude;
        }

        public String getMobile() {
            return mobile;
        }

        public void setMobile(String mobile) {
            this.mobile = mobile;
        }

        public Object getMoney() {
            return money;
        }

        public void setMoney(Object money) {
            this.money = money;
        }

        public Object getNickname() {
            return nickname;
        }

        public void setNickname(Object nickname) {
            this.nickname = nickname;
        }

        public String getPassword() {
            return password;
        }

        public void setPassword(String password) {
            this.password = password;
        }

        public Object getPraiseNum() {
            return praiseNum;
        }

        public void setPraiseNum(Object praiseNum) {
            this.praiseNum = praiseNum;
        }

        public String getToken() {
            return token;
        }

        public void setToken(String token) {
            this.token = token;
        }

        public int getUid() {
            return uid;
        }

        public void setUid(int uid) {
            this.uid = uid;
        }

        public Object getUserId() {
            return userId;
        }

        public void setUserId(Object userId) {
            this.userId = userId;
        }

        public String getUsername() {
            return username;
        }

        public void setUsername(String username) {
            this.username = username;
        }
    }
}

2,注册类的Bean类

public class RegBean {

    /**
     * msg : 天呢!用户名或密码不能为空
     * code : 1
     * data : {}
     */

    private String msg;
    private String code;
    private String data;

    public String getMsg() {
        return msg;
    }

    public void setMsg(String msg) {
        this.msg = msg;
    }

    public String getCode() {
        return code;
    }

    public void setCode(String code) {
        this.code = code;
    }

    public String getData() {
        return data;
    }

    public void setData(String data) {
        this.data = data;
    }
}

三,okhttp+retrofit+rxjava封装

         1,ApiServi接口

   

public interface ApiService {



    @GET
    Observable<String> get(@Url String url, @QueryMap Map<String, String> map);


    @FormUrlEncoded
    @POST
    Observable<String> post(@Url String url, @FieldMap Map<String, String> map);



}

           2,BaseObserver

public abstract class BaseObserver<T> implements Observer<String> {


    @Override
    public void onSubscribe(Disposable d) {

    }

    @Override
    public void onNext(String s) {



        try {
            Type genType = getClass().getGenericSuperclass();
            Type[] params = ((ParameterizedType) genType).getActualTypeArguments();
            Class entityClass = (Class) params[0];
            Gson gson = new Gson();
            T t = (T)gson.fromJson(s,entityClass);
            success(t);

        } catch (Exception e) {
            failure(1001);
            e.printStackTrace();
        }




    }

    @Override
    public void onError(Throwable e) {
        try {
            if(e != null){
                if(e instanceof HttpException){
                    failure(HTTP_ERROR);
                } else if(e instanceof SocketException){
                    failure(NET_WORK_ERROR);
                }else {
                    failure(UNKNOW_ERROR);
                }
            }else {
                failure(UNKNOW_ERROR);
            }
            e.printStackTrace() ;
        } catch (Exception e1) {
            failure(UNKNOW_ERROR);
            e1.printStackTrace();
        }


    }

    @Override
    public void onComplete() {

    }


    //

    /**
     * code
     *  1000 UNKNOW_ERROR 未知错误
     *  1001 json 转化异常  parse error
     *  1002 当前网络不可用     java.net.SocketException: Network is unreachable  超时
     *  1003 服务器不可用 401 402 403 500 502 503 504
     * @param code
     */

    public static final int UNKNOW_ERROR = 1000;
    public static final int JSON_FORMAT_ERROR = 1001;
    public static final int NET_WORK_ERROR = 1002;
    public static final int HTTP_ERROR = 1003;


    public abstract void success(T t);
    public abstract void failure(int code);

    public abstract void onNextLog(LoginBean bean);
    public abstract void onNextReg(RegBean regBean);

}

      3,RetrofitManager

public class RetrofitManager {



    public static OkHttpClient client = new OkHttpClient.Builder()
            .build();

    public static  ApiService  apiService = new Retrofit.Builder()
           
       //这里是接口地址的域名
       .baseUrl("http://120.27.23.105/")
.addCallAdapterFactory(RxJava2CallAdapterFactory.create()) .addConverterFactory(ScalarsConverterFactory.create()) .client(client) .build() .create(ApiService.class); public static void get(String url, Map<String,String> map, Observer observer){ apiService.get(url,map) .subscribeOn(Schedulers.io()) .observeOn(AndroidSchedulers.mainThread()) .subscribe(observer); } public static void post(String url,Map<String,String> map,Observer observer){ apiService.post(url,map) .subscribeOn(Schedulers.io()) .observeOn(AndroidSchedulers.mainThread()) .subscribe(observer); }}

四,MVP框架

     1,登录

            登录的model层

public class LoginModel {
    //创建一个map集合
    Map<String,String> map=new HashMap<>();

    public void getData(String phone,String pwd,final loginCallBack loginCallBack){
        //将两个参数添加到map集合中
        map.put("mobile",phone);
        map.put("password",pwd);
        //使用封装进行请求数据,第一个参数为接口域名以后的部分,第二参数为map集合,第三个参数为回调接口
        RetrofitManager.get("user/login", map, new BaseObserver<LoginBean>() {
            @Override
            public void success(LoginBean loginBean) {
                loginCallBack.success(loginBean);
            }

            @Override
            public void failure(int code) {

            }

            @Override
            public void onNextLog(LoginBean bean) {

            }

            @Override
            public void onNextReg(RegBean regBean) {

            }

        });
    }
    //创建model层的回调接口
    public interface loginCallBack{
        void success(LoginBean loginBean);
        void error(Exception e);
    }
}
        登录的view层

    

public interface LoginIview {
    void success(LoginBean loginBean);
    void error(String e);
    String getPhone();
    String getPwd();
}
     登录的presenter层

public class LoginPresenter {
    LoginModel loginModel;
    LoginIview loginIview;

    public LoginPresenter(LoginIview loginIview) {
        this.loginIview = loginIview;
        this.loginModel = new LoginModel();
    }

    public void getDatas(){
        String phone = loginIview.getPhone();
        String pwd = loginIview.getPwd();
        loginModel.getData(phone,pwd,new LoginModel.loginCallBack() {
            @Override
            public void success(LoginBean loginBean) {
                //这里进行了登录判断,是否可以正确跳转
                if(loginBean.getMsg().length()==4){
                    loginIview.success(loginBean);
                }else{
                    loginIview.error(loginBean.getMsg());
                }


            }

            @Override
            public void error(Exception e) {
               // loginIview.error();
            }
        });
    }
}

2,注册

   注册的model层

public class RegModel {
    Map<String,String> map=new HashMap<>();

    public void getData(String phone,String pwd,final RegCallBack regCallBack){

        map.put("mobile",phone);
        map.put("password",pwd);
        //http://120.27.23.105/user/reg
        RetrofitManager.get("user/reg", map, new BaseObserver<RegBean>() {
            @Override
            public void success(RegBean regBean) {
                regCallBack.success(regBean);
            }

            @Override
            public void failure(int code) {

            }

            @Override
            public void onNextLog(LoginBean bean) {

            }

            @Override
            public void onNextReg(RegBean regBean) {

            }

        });
    }

    public interface RegCallBack{
        void success(RegBean regBean);
        void error(Exception e);
    }
}

注册的view层

public interface RegIview {
    void success(RegBean regBean);
    void error(Exception e);
    String getPhone();
    String getPwd();
}
注册的presenter层

   

public class RegPresenter {
    RegModel regModel;
    RegIview regIview;

    public RegPresenter(RegIview regIview) {
        this.regIview = regIview;
        this.regModel = new RegModel();
    }

    public void getDatas(){
        String phone = regIview.getPhone();
        String pwd = regIview.getPwd();
        regModel.getData(phone,pwd,new RegModel.RegCallBack() {
            @Override
            public void success(RegBean regBean) {
                regIview.success(regBean);
            }

            @Override
            public void error(Exception e) {
                regIview.error(e);
            }
        });
    }
}

  五,     Activity

    找控件使用了第三方的butterknife,这是依赖,使用特别简单,可以查到

compile 'com.jakewharton:butterknife:8.8.1'
annotationProcessor 'com.jakewharton:butterknife-compiler:8.8.1'

  

1,登录activity
public class MainActivity extends AppCompatActivity implements LoginIview {
    @BindView(R.id.phone)
    EditText phone;
    @BindView(R.id.password)
    EditText password;
    @BindView(R.id.login)
    Button login;
    @BindView(R.id.reg)
    Button reg;
    @BindView(R.id.activity_main)
    LinearLayout activityMain;
    private LoginPresenter loginPresenter;
   // private String str;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        ButterKnife.bind(this);

        //实例化P
        loginPresenter = new LoginPresenter(this);

        //初始化适配器
    }

    @Override
    public void success(LoginBean loginBean) {
       // str = loginBean.getMsg().toString()+loginBean.getCode().toString();
        startActivity(new Intent(MainActivity.this, LieBiaoActivity.class));
        Toast.makeText(this, loginBean.getMsg(), Toast.LENGTH_SHORT).show();
    }

    @Override
    public void error(String e) {
        Toast.makeText(this, e, Toast.LENGTH_SHORT).show();
    }

    @Override
    public String getPhone() {
        return phone.getText().toString();
    }

    @Override
    public String getPwd() {
        return password.getText().toString();
    }

    @OnClick({R.id.login, R.id.reg})
    public void onViewClicked(View view) {
        switch (view.getId()) {
            case R.id.login:
                loginPresenter.getDatas();
               /* if (str.length()>6){
                    Toast.makeText(this, str, Toast.LENGTH_SHORT).show();
                }*/

                break;
            case R.id.reg:
                startActivity(new Intent(MainActivity.this, RegActivity.class));
                break;
        }
    }
}

   2,注册的activity

public class RegActivity extends AppCompatActivity implements RegIview{

    @BindView(R.id.phone)
    EditText phone;
    @BindView(R.id.password)
    EditText password;
    @BindView(R.id.reg)
    Button reg;
    @BindView(R.id.activity_main)
    LinearLayout activityMain;
    private RegPresenter regPresenter;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_reg);
        ButterKnife.bind(this);
        //实例P
        regPresenter = new RegPresenter(this);


    }

    @OnClick(R.id.reg)
    public void onViewClicked() {
        regPresenter.getDatas();
    }

    @Override
    public void success(RegBean regBean) {
        Toast.makeText(this, regBean.getMsg().toString()+regBean.getCode().toString(), Toast.LENGTH_SHORT).show();
    }

    @Override
    public void error(Exception e) {

    }

    @Override
    public String getPhone() {
        return phone.getText().toString();
    }

    @Override
    public String getPwd() {
        return password.getText().toString();
    }
}


okhttp与mvp结合 将okhttp与mvp框架整合在一起,并使用线程池来设置网络线程个数。 立即下载

相关推荐

AXI Memory Mapped To PCI Express IP 核设计实例

本文详细描述了AXI Memory Mapped To PCI Express(2.9) IP核的应用实例

u011565038的博客 2796

RxJava+okhttp+Retrofit+Mvp 的封装

RxJavaRetrofitOkhttpMvp时下流行的RxJava+Retrofit+Okhttp+Mvp封装的一个demo,简单,易理解,深度解耦,方便迭代,总之就是爽. RxJava+Retrofit+okhttp+mvp,现在流行这一套框架的封装,想着想着就自己封装了一套,并-且我们的项目的里面也这样用,方便以后的功能的迭代开发,产品需求的更改,有什么不足的地方,欢迎issues,如果你

gslovemy的博客 2463

DMR对讲机的基本概念理解

刚刚入手DMR对讲机,尚未成功联通。国内互联网上能找到的资料很少,大多数也都是一些DMR协议介绍之类的玩意,对实际操作没有指导意义。以下全部是这几天在网上研究各种资料得出的个人思考,如有错误请斧正。 相比与模拟通讯系统,DMR将语音信号转换为包的形式进行收发。将DMR对比成TCP/IP系统会更容易理解。 一般DMR对讲机都支持模数双通,说明DMR应该使用了跟FM同样的无线AP组件,只在解码上有区别。对讲机先使用DMR进行数字解码,解码成功则说明是数字信号,不成功则使用模拟方式再次进行解码。可以对等理解为

1万+

Rxjava从使用到原码的解析十: Rxjava实战之配合Retrofit请求完注册接口直接再请求登陆接口

一个注册和登陆接口 public interface LoginApi { @FormUrlEncoded @POST("user/login") Observable<HttpResult<LoginBean>> login(@FieldMap Map<String, Object> params); @FormUrl...

qq_35651451的博客 436

Python多版本共存指南:用CMD命令一键切换3.6和3.8解释器(含pip使用技巧)

本文详细介绍了在Windows CMD环境下实现Python多版本(如3.6和3.8)共存与一键切换的完整方案。通过文件重命名策略、环境变量优化和自定义脚本,开发者可快速切换Python解释器版本,并管理各版本独立的pip依赖库,确保项目环境隔离与兼容性。

weixin_29035405的博客 423

航天仿真必看:如何用SOFA库实现高精度GCRS-ITRS坐标转换?避坑指南

本文深入解析了航天仿真中高精度GCRS-ITRS坐标转换的关键技术,重点介绍了SOFA库在天球系与轨道系转换中的权威应用。通过对比传统方法的误差来源,详细阐述了SOFA库的转换算法优势、工程实现步骤及误差控制策略,为航天器轨道仿真提供毫米级精度的解决方案。

7h6j5k4l3的博客 850

Rxjava+Retrofit实现简单封装登录请求

直接代码: LoginHttp.java /** 封装请求类 */ public class LoginHttp { private String host = “请求地址”; private LoginService loginService; private Retrofit retrofit; private LoginHttp(){ retrofit = new Retrofit.Builder() .baseUrl(host) .addConverterFactory(GsonConverte

weixin_46897652的博客 344

材料力学小白必看:纯弯曲正应力计算全解析(附实例演示)

本文详细解析了材料力学中纯弯曲正应力的计算原理与工程应用,通过实例演示帮助初学者掌握关键公式和计算流程。内容涵盖纯弯曲的基本假设、正应力分布规律、截面特性计算,以及现代工具如Excel、ANSYS和Python在应力分析中的应用,特别适合材料力学小白系统学习。

sea99的博客 1232

Retrofit+OkHttp+RxJava的使用

//封装RetrofitUtil类 public class RetrofitUtil { private static RetrofitUtil instance; private final Retrofit retrofit; public static RetrofitUtil getInstance(){ if(instance==null){ ...

qq_43516208的博客 1018

mpv 源码深度解析:从 MPlayer 遗产到现代媒体播放器架构

做减法优于做加法:不值得维护的功能就移除(DVD 菜单、流缓存等)单线程事件驱动:核心逻辑在单线程中运行,通过 dispatch 队列处理并发分离关注点:demuxer 线程、VO 线程、脚本线程各司其职质量优先:使用 GPU 着色器而非固定功能硬件,默认软件解码(更可靠)可嵌入性:libmpv API 让 mpv 可以作为库嵌入其他应用mpv 是一个用纯 C 实现的、工程质量极高的媒体播放器。它的代码库展示了一个事实:C 语言完全可以通过良好的架构设计来实现复杂的多媒体系统。

世界那么大,我想去看看~【随心更新,看世界去了😄】 85

海康网口相机不能被flexscan3d识别到MVS版本为4.6.1,flex为3.3.24在MVS中能够检测到,但是在flex中只能看到电脑自带相机,如何解决?

🏆本文收录于 《全栈 Bug 调优(实战版)》 专栏。专栏聚焦真实项目中的各类疑难 Bug,从成因剖析 → 排查路径 → 解决方案 → 预防优化全链路拆解,形成一套可复用、可沉淀的实战知识体系。无论你是初入职场的开发者,还是负责复杂项目的资深工程师,都可以在这里构建一套属于自己的「问题诊断与性能调优」方法论,助你稳步进阶、放大技术价值 。

**My Coding Family** 1040

Android OKHttp与Retrofit与RXJava的使用

我们项目当中的每个app都需要用到网络和服务器进行交互,在Android项目开发中使用HTTP协议完成 通信的话,基本上都要用到OkHttp或者Retrofit。

Happy__snake的博客 2214

YOLOv11 改进 - 注意力机制 | 空间增强注意力SEAM(Spatially Enhanced Attention Module)提升遮挡场景检测鲁棒性

本文介绍了分离与增强注意力模块(SEAM)在YOLOv11中的结合应用。SEAM模块旨在增强面部特征学习能力,特别是处理面部遮挡问题。它采用多头注意力机制强调面部区域、抑制背景区域,第一部分使用深度可分离卷积减少参数并学习通道重要性,通过1x1卷积增强通道联系,利用两层全连接网络融合通道信息,经指数归一化后作为注意力权重与原始特征相乘。我们将SEAM集成到YOLOv11的检测头中,并进行相关注册和配置。实验表明,该方法有助于提升模型检测性能。

魔改工程师的博客 1664

Retrofit+RxJava+OkHttp封装类请求接口数据→原生登录,注册,个人信息页+设置用户头像(图片上传或拍照)+SharedPreferences保存信息+Fresco加载图片+Mvp分层

效果图:    效果图描述: 1. 使用RxJava结合Retrofit+OkHTTP封装工具类请求数据,使用MVP分层,进行原生登录,注册,个人信息页; 2. 使用Fresco加载图片,设置用户头像(图片上传或拍照)。 3. 实现如图登录注册模块和个人中心模块,登录成功后跳转到个人中心页面;     第二次使用 SharedPreference

IT666DHW的博客 2071

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

Kotlin项目实战

项目实战的目的是什么? 感受用Kotlin来开发项目的过程 项目实战整个课程的安排 会使用到RxJava,以及其他技术 Retrofit网络模型 请求服务器的模型封装 登录使用网络模型 登录与注册 首页模块 收藏模块 项目进阶改进 ...

yzpbright的博客 724

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

MVP+Retrofit实现的原生登录注册

其实登录注册基本上是一样的,接下来给大家展示一下代码 首先我们需要登录注册的Api //注册 public static final String Reg_Api = "small/user/v1/register"; //登陆 public static final String Login_Api = "small/user/v1/login"; 接着是Bean层,...

qq_43559002的博客 379

Android Retrofit+Rxjava+MVP三大框架集成男人帮APP

前言 相信大家都有听说过这三大框架吧,这是最近很火的框架 Retrofit的详解 主要参考于 Retrofit2.0使用详解 retrofit是基于okhttp的封装工具类,功能十分丰富.我能力还是有限,在这里先说下它的使用吧!简单使用添加Gradle依赖项compile 'com.squareup.retrofit2:retrofit:2.1.0' 创建Api接口 作为一个get请求的url

那时候的坚持不懈的我的博客 3807

带MD5加密的原生登录注册到购物车到订单Demo

一,项目介绍首先看项目流程(接口都写在model类中,不提出来一一写了)二,项目思路分析可以看出框架为MVP,主要思路是:1,MD5加密的登录注册。2,登陆成功后跳转到RecyclerView+网络请求(Okhttp+Retrofit+Rxjava)+Fresco显示图片实现的商品列表。3,点击列表条目跳转到详情页面。4,点击详情页面中的添加购物车,提示加购成功,点击购物车,商家和商品信息显示在购

androidyhr的博客 2589

原生登录注册和个人中心模块 Retrofit+OkHTTP+RxJava+Fresco

接口地址: 登录接口: http://120.27.23.105/user/login 请求参数: mobile 手机号  必填 password 密码 必填   注册接口: http://120.27.23.105/user/reg   请求参数: mobile 手机号 必填 password 密码  必填   个人中心接口: http://120.27.2

xxb52306的博客 1899

android ble mvp,Android开发之MVP模式

前言:Android开发中有很多的设计模式,MVP模式无疑是现在最流行的模式之一。MVP模式有效的降低了项目的复杂性及耦合性,view与model间完全解耦,通过presenter作为中间的连接纽带,降低了view的复杂性及view与model耦合程度,使的项目逻辑更加清晰,方便后期的修改与维护。MVP:Model--View--Presentermodel:用于数据的处理,如请求网络数据等vie...

weixin_29172201的博客 148

RxJava+Retrofit结合使用-网络请求-封装

1.首先导入依赖跟权限: //ButterKnife-依赖:    compile 'com.jakewharton:butterknife:8.5.1'    annotationProcessor 'com.jakewharton:butterknife-compiler:8.5.1'    //fresco依赖:    compile 'com.facebook.fresco:fresco:...

weixin_41555717的博客 436

retrofit+rxjava 登录注册

//entity bean类 public class BaseResponseEntity&lt;T&gt; { public String code;//状态码:0,1 public String msg; public T data; } public class User extends BaseResponseEntity { public Strin...

lian895615的博客 501

TLint核心功能解析:虎扑体育API接口封装与数据交互实战指南

TLint是一款基于虎扑体育新版API开发的Android应用,采用先进的Dagger2+RxJava+Retrofit技术栈,结合Material Design设计语言,为体育爱好者提供完整的移动端社区体验。本文将深入解析TLint的核心架构设计,特别是其API接口封装策略与数据交互实现,帮助开发者理解如何高效构建现代化的Android应用。 ## 🚀 项目架构概览与MVP模式实践 TLi

gitblog_00544的博客 743

RxJava + Retrofit Android工程化实战:线程、背压与生命周期深度解析

在Android开发中,网络请求本质是受限资源下的异步状态流管理问题。Retrofit作为类型安全的REST抽象层,将HTTP语义映射为接口契约;RxJava则提供响应式数据流模型,通过subscribeOn/observeOn实现确定性线程调度,以map、flatMap等操作符完成声明式数据转换。其技术价值在于解耦业务逻辑与协议处理、消除回调地狱、统一错误与生命周期管理。典型应用场景包括快速列表滚动时的请求取消(switchMap)、带进度的文件上传(Streaming+ProgressRequestBo

weixin_33863087的博客 360

登录注册

首先在项目Model的build.gradle里面导入依赖 //butterknife在Studio3.0版本上需使用以下8.8.1版本(下面2行代码都要加) compile 'com.jakewharton:butterknife:8.8.1' annotationProcessor 'com.jakewharton:butterknife-compiler:8.8.1' compile '

QQ_907465912的博客 1342

Android框架知识

RxRetrofit-终极封装-深入浅出&网络请求 背景: 优快云博客发布了一系列的RxJava+Retrofit+OkHttp深入浅出-终极封装是不是很眼熟,是的还是它,不过是不同的配方。之前发出后收到很多朋友的关注,原本只是自己学习后的一些经验总结,但是有同学运用到实战当中,这让我很惶恐,所有后续一直更新了很多次版本,有些…...

weixin_34306676的博客 134
上一篇: MVP模式使用Retrofit+RxJAVA请求数据实现购物车
下一篇: 带MD5加密的原生登录注册到购物车到订单Demo
小胖几
博客等级 码龄9年 7粉丝 27原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值