Android_MVP开发模式登录注册案例

Android之SqliteDatabase(MVP模式)实现用户登录注册功能 Android之SqliteDatabase(MVP模式)实现用户登录注册功能用户登录以及注册功能的普遍使用就不用我说了,任何一款应用软件基本都具有登录和注册功能,今天通过前面的学习,我写了一个小demo,就是使用MVP模式写一个用户登录和注册的功能。有关MVP模式我就不做讲解了,通常来说很多实现的登录或者注册功能都是使用MVC的模式来实现的,今天我将采用MVP模式来实现这个小demo,主要是为了巩 阅读详情

首先MVP 是从经典的MVC架构演变而来

 系统C/S(Client/Server)三层架构模型:

  1)视图层(View):一般采用XML文件对应用的界面进行描述,使用的时候可以直接引入,极为方便,可以的大大缩短开发时间,也可以使用JavaScript+HTML等的方式作为View层,当然这里需要进行Java和JavaScript之间的通信,幸运的是,Android提供了非常方便的通信实现。业务逻辑层(BLL):它的关注点主要集中在业务规则的制定、业务流程的实现等与业务需求有关的系统设计,也即是说它是与系统所应对的领域(Domain)逻辑有关,很多时候,也将业务逻辑层称为领域层。

  2)控制层(Controller):Android的控制层的重任通常落在了众多的Acitvity的肩上,这句话也就暗含了不要在Acitivity中写代码,要通过Activity交割Model业务逻辑层处理。

  3)模型层(Model):对数据库的操作、以及其他和数据有关的的操作都应该在Model里面处理,当然对业务计算等操作也是必须放在的该层的。就是应用程序中二进制的数据。

三层结构架构三层间的交互及作用如下图所示:


在MVP中View并不直接使用Model,它们之间的通信是通过Presenter (MVC中的Controller)来进行的,所有的交互都发生在Presenter内部,而在MVC中View会从直接Model中读取数据而不是通过 Controller。
在MVP里,Presenter完全把Model和View进行了分离,主要的程序逻辑在Presenter里实现。而且,Presenter与具体的View是没有直接关联的,而是通过接口进行交互,从而使得在变更View时候可以保持Presenter的不变,可以多次复用。
在MVP里,应用程序的逻辑主要在Presenter来实现,其中的View是很薄的一层,只应该有简单的Set/Get的方法,用户输入和设置界面显示的内容,除此就不应该有更多的内容,绝不容许直接访问Model。
MVP主要解决就是把逻辑层抽出来成P层,要是遇到需求逻辑上的更改就可以只需要修改P层了或者遇到逻辑上的大改我们可以直接重写一个P也可以,很多开发人员把所有的东西都写在了Activity/Fragment里面这样一来遇到频繁改需求或者逻辑越来越复杂的时候,Activity /Fragment里面就会出现过多的混杂逻辑导致出错,所以MVP模式对于APP来对控制逻辑和UI的解耦来说是一个不错的选择。


开始实例


一:布局

1:登录页面布局

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context="activity.example.com.mvpframework.view.MainActivity">

    <EditText
        android:id="@+id/ed_phone"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:hint="请输入手机号"
        android:layout_above="@+id/ed_pass"
        android:layout_alignParentLeft="true"
        android:layout_alignParentStart="true"
        android:layout_marginBottom="55dp" />

    <EditText
        android:id="@+id/ed_pass"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:hint="请输入密码"
        android:layout_above="@+id/btn_login"
        android:layout_alignParentLeft="true"
        android:layout_alignParentStart="true"
        android:layout_marginBottom="94dp" />

    <Button
        android:id="@+id/btn_login"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="登录"
        android:layout_marginLeft="65dp"
        android:layout_marginStart="65dp"
        android:layout_alignBaseline="@+id/btn_regis"
        android:layout_alignBottom="@+id/btn_regis"
        android:layout_alignParentLeft="true"
        android:layout_alignParentStart="true" />

    <Button
        android:id="@+id/btn_regis"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="注册"
        android:layout_alignParentBottom="true"
        android:layout_alignParentRight="true"
        android:layout_alignParentEnd="true"
        android:layout_marginRight="43dp"
        android:layout_marginEnd="43dp"
        android:layout_marginBottom="130dp" />

</RelativeLayout>
2:注册页面布局

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context="activity.example.com.mvpframework.view.RegisActivity">

    <EditText
        android:id="@+id/ed_phone"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:hint="请输入手机号"
        android:layout_alignParentTop="true"
        android:layout_alignParentLeft="true"
        android:layout_alignParentStart="true"
        android:layout_marginTop="61dp" />

    <EditText
        android:id="@+id/ed_pass"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:hint="请输入密码"
        android:layout_marginBottom="63dp"
        android:layout_above="@+id/btn_regis"
        android:layout_alignParentLeft="true"
        android:layout_alignParentStart="true" />

    <Button
        android:id="@+id/btn_regis"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="注册"
        android:layout_marginBottom="169dp"
        android:layout_alignParentBottom="true"
        android:layout_alignParentLeft="true"
        android:layout_alignParentStart="true"
        android:layout_marginLeft="130dp"
        android:layout_marginStart="130dp" />

</RelativeLayout>


3:登录成功跳转的页面,在此就不写了


二:定义了两个接口

1:登录、注册 成功或失败的接口

public interface Login {
    void succeed(String data);
    void failed(String message);
}

2:请求网络成功或失败的接口

public interface Http {
    void onSuccess(String data);
    void onFiled(String message);
}

三:M(model)层,提供数据,单例模式

public class HttpUtils {
    private static volatile HttpUtils instance;

    private HttpUtils(){

    }

    public static HttpUtils getInstance(){
        if(instance==null){
            synchronized (HttpUtils.class){
                if(instance==null){
                    instance = new HttpUtils();
                }
            }
        }
        return instance;
    }

    public void get(String url, Map<String, String> map, final Http http) {
        RequestParams params = new RequestParams(url);
        for (Map.Entry<String, String> entry : map.entrySet()) {
            params.addQueryStringParameter(entry.getKey(), entry.getValue());
        }
        x.http().get(params, new Callback.CommonCallback<String>() {
            @Override
            public void onSuccess(String result) {
                http.onSuccess(result);
            }

            @Override
            public void onError(Throwable ex, boolean isOnCallback) {
                http.onFiled(ex.getMessage());
            }

            @Override
            public void onCancelled(CancelledException cex) {

            }

            @Override
            public void onFinished() {

            }
        });
    }
}


四:P(Presenter)层,逻辑处理

public class LoginPresenter {

    private Login login;
    private Context context;

    // 提供初始化IView对象的一个方法

    public LoginPresenter() {

    }
    
    public LoginPresenter(Login login,Context context) {
        this.login = login;
        this.context=context;
    }

    public boolean checkData(String phone,String pass) {
        if(TextUtils.isEmpty(phone)||TextUtils.isEmpty(pass)){
            Toast.makeText(context,"用户名或密码不能为空",Toast.LENGTH_SHORT).show();
            return false;
        }
        //验证是否为手机号的正则表达式
        String regex = "^1[3|4|5|7|8]\\d{9}";
        if(!Pattern.matches(regex,phone)){
            Toast.makeText(context,"手机号格式不正确",Toast.LENGTH_SHORT).show();
            return false;
        }
        if(pass.length()<6){
            Toast.makeText(context,"密码长度需要大于6位",Toast.LENGTH_SHORT).show();
            return false;
        }
        return true;
    }

    public void login(String url,String username, String password) {
        Map<String, String> map = new HashMap<>();
        map.put("mobile", username);
        map.put("password", password);
        HttpUtils.getInstance().get(url, map,
                new Http() {
                    @Override
                    public void onSuccess(String data) {
                        //解析
                        Gson gson = new Gson();
                        DataBean dataBean = gson.fromJson(data, DataBean.class);
                        //获取code值,返回0为成功,1为失败
                        if(dataBean.getCode().trim().equals("0")){
                            login.succeed(data);
                            Toast.makeText(context,dataBean.getMsg(),Toast.LENGTH_SHORT).show();
                        }else{
                            Toast.makeText(context,dataBean.getMsg(),Toast.LENGTH_SHORT).show();
                        }
                    }
                    @Override
                    public void onFiled(String message) {
                        login.failed(message);
                    }
                });
    }

    //防止内存泄漏
    public void detatch(){
        if (login != null) {
            login = null;
        }
    }
}

五:V(View)层,展示页面,不做逻辑处理

1:MainActivity登录页面

public class MainActivity extends AppCompatActivity implements Login,View.OnClickListener{

    private EditText ed_phone;
    private EditText ed_pass;
    private Button btn_login;
    private Button btn_regis;
    private LoginPresenter presenter1;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        initView();
    }

    private void initView() {
        //获取id
        ed_phone = (EditText)findViewById(R.id.ed_phone);
        ed_pass = (EditText)findViewById(R.id.ed_pass);
        btn_login = (Button)findViewById(R.id.btn_login);
        btn_regis = (Button)findViewById(R.id.btn_regis);
        //点击监听
        btn_login.setOnClickListener(this);
        btn_regis.setOnClickListener(this);
    }

    @Override
    public void onClick(View view) {
        switch (view.getId()){
            case R.id.btn_login:
                String user = ed_phone.getText().toString().trim();
                String pass = ed_pass.getText().toString().trim();
                //实例化p层
                presenter1 = new LoginPresenter(this,MainActivity.this);
                //效验输入的值是否符合格式
                boolean b = presenter1.checkData(user, pass);
                if(b){
                    presenter1.login("http://120.27.23.105/user/login",user,pass);
                }
                break;

            case R.id.btn_regis:
                //跳到注册页面
                startActivity(new Intent(MainActivity.this,RegisActivity.class));
                break;
        }
    }

    @Override
    public void succeed(String data) {
            //登录成功跳到另一个页面
            startActivity(new Intent(MainActivity.this,ShopActivity.class));
    }

    @Override
    public void failed(String message) {
        //正常情况不会执行,只有请求网络失败的时候才会执行,这里的失败是指网页打不开的失败
        Toast.makeText(MainActivity.this,"网络异常,登录失败",Toast.LENGTH_SHORT).show();
    }

    //防止内存泄漏
    @Override
    protected void onDestroy() {
        super.onDestroy();
        if (presenter1 != null) {
            presenter1.detatch();
        }
    }

}
2:注册页面

public class RegisActivity extends AppCompatActivity implements Login,View.OnClickListener{

    private EditText ed_phone;
    private EditText ed_pass;
    private Button btn_regis;
    private LoginPresenter presenter1;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_regis);
        ed_phone = (EditText)findViewById(R.id.ed_phone);
        ed_pass = (EditText)findViewById(R.id.ed_pass);
        btn_regis = (Button)findViewById(R.id.btn_regis);
        btn_regis.setOnClickListener(this);
    }

    @Override
    public void onClick(View view) {
        String user = ed_phone.getText().toString().trim();
        String pass = ed_pass.getText().toString().trim();
        presenter1 = new LoginPresenter(this,RegisActivity.this);
        boolean b = presenter1.checkData(user, pass);
       if(b){
            presenter1.login("http://120.27.23.105/user/reg",user,pass);
        }
    }

    @Override
    public void succeed(String data) {
            finish();
    }

    @Override
    public void failed(String message) {
        //正常情况不会执行,只有请求网络失败的时候才会执行,这里的失败是指网页打不开的失败
        Toast.makeText(RegisActivity.this,"网络异常,注册失败",Toast.LENGTH_SHORT).show();
    }

    //防止内存泄漏
    @Override
    protected void onDestroy() {
        super.onDestroy();
        if (presenter1 != null) {
            presenter1.detatch();
        }
    }
}











android登录和注册实例代码 android登陆实例完整代码,采用SQLite数据库,实现登录注册和页面的跳转,尤其适合刚接触android开发的新手,值得参考 立即下载

相关推荐

Android 用户注册登陆详细实例

比较详细实用的安卓登陆注册实例,可用于初学者学习也可以用于有基础的册友参考

android开发登录过程实现的,Android MVP模式简单介绍:以一个登陆流程为例

老的项目用的MVC的模式,最近完成了全部重构成MVP模式的工作,虽然比较麻烦,好处是代码逻辑更加清楚、简洁,流程更加清晰,对于后续版本迭代维护都挺方便。对于一些想要学习MVP模式的同学来讲,百度搜出来的好多都没法直接转化为项目里可以直接用的东西,所以这里正好拿出自己项目里已经用了的,你们可以直接用到自己的项目里。当然,不可能把所有项目代码在这里放出来,所以就拿登陆的流程出来,这个比较合适也比较常用...

weixin_33272515的博客 260

车载测试面试题总结

首先确认是什么问题,如果是测试软件的问题就先确定自己的测试方法有没有问题,如果没有问题,那就是测试软件的问题,这时候就需要提bug 进行跟踪,(比如BCM测试的时候,先明确测试的输入,对输入)进行需求分析,然后设计测试用例,进行用例评审,评审完执行测试用例形成最终的版本,台架分为:hil(黑尔)台架,单个控制器的台架、整车台架、车身台架、动力系统台架等,主要验证其功能,或者实车无法满足的测试环境。这个人不可能一直,点击几千次或者多少次几个小时连续点击,人不可能一直在点。因为要模拟一下这个稳定性,

woaxiaoqing的博客 7813

Android —MVP架构—登录页面示例

目的:使View层跟Model层解耦合,在Android开发中减少Activity的负担,因为Activity只需要负责View层。 缺点:因为Presenter跟View是通过接口交互的,所以容易造成接口地狱问题,就是要创建非常多的接口。

lxjlxj2333的博客 1045

信息系统项目管理师(高项)重点!

学习高项自己做的笔记

PanJWei的博客 3300

mos管结电容等效模型_MOS管的防冲击防反接电路

MOS管的反接和抑制冲击一:原理分析MOS管由于生产工艺等因素,会产生相应的寄生电容,体二极管等。Mos管的寄生电容如图1所示,可以看到其具有三个寄生电容:G和S的电容Cgs;G和D的电容:Cgd,也称为反向传输电容、米勒电容、Crss;D和S的电容Cds。D和S之间的体二极管D1.图 1:MOS管等效模型寄生电容的数值可以从元器件的datasheet中得到,如图2,图3:Ciss(输入电容)=C...

weixin_29179583的博客 1856

Android MVP框架学习笔记,demo模拟一个注册登录过程

最近学习MVVM想到之前看过的MVP框架,虽然已经过时了,但是还是觉得有可以借鉴的地方,所以又拿出来复习了一下,用一个小小的demo来练练手。 模拟一个注册登录过程,首先理一下代码逻辑: 1、注册登录的过程当中,P需要做什么? V向P发起请求,P向M请求数据,M发起网络请求并在请求完成后通过接口将数据回调给P,P持有V的引用,完成数据请求玩的操作。 2、M需要做什么? M负责发起网络请求以及数据的...

weixin_43964691的博客 354

华为交换机链路聚合对接思科交换机链路聚合故障

2台华为交换机采用堆叠方式与思科交换机之间使用链路聚合,华为交换机与cisco交换机链路捆绑接口频繁UP/DOWN,业务中断。

网络工程师日常的博客 2116

android服务 与 UI通信,UserDemo: Android 服务端与客户端网络通信的简单用户注册登录,并采用MVP模式编写...

#UserDemoAndroid 服务端与客户端网络通信的简单用户注册登录(MVP模式)Android 多线程1. Handler:和 UI 线程间传递消息.Handler 异步实现时,涉及到 Handler, Looper, Message,Thread四个对象。实现异步的流程是主线程启动 Thread(子线程),thread(子线程)运行并生成 Message,Looper(消息队列)获取 M...

weixin_33516557的博客 238

YOLO11改进|注意力机制篇|引入ELA注意力机制

YOLO11添加ELA注意力机制

A1983Z的博客 3647

CARAFE轻量级上采样算子详解:从原理到YOLOv5/YOLOv8实战魔改全攻略

摘要: 本文探讨了CARAFE(内容感知特征重组)上采样算子在YOLOv5/YOLOv8目标检测模型中的应用。传统上采样方法(如最近邻插值)易丢失细节信息,而CARAFE通过内容自适应机制和大感受野特性,动态生成上采样核,显著提升小目标检测性能。文章详细解析了CARAFE的算法原理(核生成与特征重组两步),并提供了在YOLOv5/YOLOv8中集成的代码实现与配置修改方案。实验表明,引入CARAFE后模型mAP提升约0.6%,且保持轻量级优势。此外,文中还总结了训练调优技巧、部署优化方案及常见问题解决方法,

FJN110的博客 917

Android安卓实战项目---登陆注册页面(源码在文末)

【代码】Android开发实战——登录注册页面。附源码

m0_63324772的博客 1万+

PCL RANSAC拟合空间圆【2026最新版】

RANSAC三维点云空间3D圆拟合。博客长期更新,本文最新更新时间为:2026年4月13日。代码在PCL1.15.0中测试通过

点云侠的博客 7454

自己对MVP+Retrofit2+RxJava的理解

MVP+Retrofit2+RxJava

baidu_28842815的博客 1170

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

假人有限元模型

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

Android-Kotlin+MVP 实现登录注册功能

如题,采用MVP的框架模式,使用Kotlin编写实现了基础的登录和注册功能,包括一些回调的响应,效果图如下: 首先看下使用MVP的项目部分结构: PS:如果还不了解MVP模式的同学可以看这篇或者自行搜索:https://blog.youkuaiyun.com/chunqiuwei/article/details/80460108 个人感觉MVP模式的好处很多,一点就是在抽离接口的时候能够合理的梳...

SSBBY的博客 4038

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

MVP注册 登录

public class Api { public static final String HOST = "https://www.zhaoapi.cn/" public static final String LOGIN = "user/login"; public static final String REGIST = "user/reg"; } MyApppu

9960607的博客 1万+

深度学习工具包 DeepLearningToolbox

深度学习工具包Deprecation notice.-----This toolbox is outdated and no longer maintained.There are much better tools available for deep learning than this toolbox, e.g. [Theano](http://deeplearning.net/software/theano/), [torch](http://torch.ch/) or [tensorflow](http://www.tensorflow.org/)I would suggest you use one of the tools mentioned above rather than use this toolbox.Best, Rasmus.DeepLearnToolbox================A Matlab toolbox for Deep Learning.Deep Learning is a new subfield of machine learning that focuses on learning deep hierarchical models of data.It is inspired by the human brain's apparent deep (layered, hierarchical) architecture.A good overview of the theory of Deep Learning theory is[Learning Deep Architectures for AI](http://www.iro.umontreal.ca/~bengioy/papers/ftml_book.pdf)For a more informal introduction, see the following videos by Geoffrey Hinton and Andrew Ng.* [The Next Generation of Neural Networks](http://www.youtube.com/watch?v=AyzOUbkUf3M) (Hinton, 2007)* [Recent Developments in Deep Learning](http://www.youtube.com/watch?v=VdIURAu1-aU) (Hinton, 2010)* [Unsupervised Feature Learning and Deep Learning](http://www.youtube.com/watch?v=ZmNOAtZIgIk) (Ng, 2011)If you use this toolbox in your research please cite [Prediction as a candidate for learning deep hierarchical models of data](http://www2.imm.dtu.dk/pubdb/views/publication_details.php?id=6284)```@MASTERSTHESIS\{IMM2012-06284, author = "R. B. Palm", title = "Prediction as a candidate for learning deep hierarchical models of data", year = "2012",}```Contact: rasmusbergpalm at gmail dot comDirectories included in the toolbox-----------------------------------`NN/` - A library for Feedforward Backpropagation Neural Networks`CNN/` - A library for Convolutional Neural Networks`DBN/` - A library for Deep Belief Networks`SAE/` - A library for Stacked Auto-Encoders`CAE/` - A library for Convolutional Auto-Encoders`util/` - Utility functions used by the libraries`data/` - Data used by the examples`tests/` - unit tests to verify toolbox is workingFor references on each library check REFS.mdSetup-----1. Download.2. addpath(genpath('DeepLearnToolbox'));Example: Deep Belief Network---------------------```matlabfunction test_example_DBNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit RBM and visualize its weightsrand('state',0)dbn.sizes = [100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);figure; visualize(dbn.rbm{1}.W'); % Visualize the RBM weights%% ex2 train a 100-100 hidden unit DBN and use its weights to initialize a NNrand('state',0)%train dbndbn.sizes = [100 100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);%unfold dbn to nnnn = dbnunfoldtonn(dbn, 10);nn.activation_function = 'sigm';%train nnopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.10, 'Too big error');```Example: Stacked Auto-Encoders---------------------```matlabfunction test_example_SAEload mnist_uint8;train_x = double(train_x)/255;test_x = double(test_x)/255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit SDAE and use it to initialize a FFNN% Setup and train a stacked denoising autoencoder (SDAE)rand('state',0)sae = saesetup([784 100]);sae.ae{1}.activation_function = 'sigm';sae.ae{1}.learningRate = 1;sae.ae{1}.inputZeroMaskedFraction = 0.5;opts.numepochs = 1;opts.batchsize = 100;sae = saetrain(sae, train_x, opts);visualize(sae.ae{1}.W{1}(:,2:end)')% Use the SDAE to initialize a FFNNnn = nnsetup([784 100 10]);nn.activation_function = 'sigm';nn.learningRate = 1;nn.W{1} = sae.ae{1}.W{1};% Train the FFNNopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.16, 'Too big error');```Example: Convolutional Neural Nets---------------------```matlabfunction test_example_CNNload mnist_uint8;train_x = double(reshape(train_x',28,28,60000))/255;test_x = double(reshape(test_x',28,28,10000))/255;train_y = double(train_y');test_y = double(test_y');%% ex1 Train a 6c-2s-12c-2s Convolutional neural network %will run 1 epoch in about 200 second and get around 11% error. %With 100 epochs you'll get around 1.2% errorrand('state',0)cnn.layers = { struct('type', 'i') %input layer struct('type', 'c', 'outputmaps', 6, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %sub sampling layer struct('type', 'c', 'outputmaps', 12, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %subsampling layer};cnn = cnnsetup(cnn, train_x, train_y);opts.alpha = 1;opts.batchsize = 50;opts.numepochs = 1;cnn = cnntrain(cnn, train_x, train_y, opts);[er, bad] = cnntest(cnn, test_x, test_y);%plot mean squared errorfigure; plot(cnn.rL);assert(er<0.12, 'Too big error');```Example: Neural Networks---------------------```matlabfunction test_example_NNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);% normalize[train_x, mu, sigma] = zscore(train_x);test_x = normalize(test_x, mu, sigma);%% ex1 vanilla neural netrand('state',0)nn = nnsetup([784 100 10]);opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samples[nn, L] = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.08, 'Too big error');%% ex2 neural net with L2 weight decayrand('state',0)nn = nnsetup([784 100 10]);nn.weightPenaltyL2 = 1e-4; % L2 weight decayopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex3 neural net with dropoutrand('state',0)nn = nnsetup([784 100 10]);nn.dropoutFraction = 0.5; % Dropout fraction opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex4 neural net with sigmoid activation functionrand('state',0)nn = nnsetup([784 100 10]);nn.activation_function = 'sigm'; % Sigmoid activation functionnn.learningRate = 1; % Sigm require a lower learning rateopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex5 plotting functionalityrand('state',0)nn = nnsetup([784 20 10]);opts.numepochs = 5; % Number of full sweeps through datann.output = 'softmax'; % use softmax outputopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex6 neural net with sigmoid activation and plotting of validation and training error% split training data into training and validation datavx = train_x(1:10000,:);tx = train_x(10001:end,:);vy = train_y(1:10000,:);ty = train_y(10001:end,:);rand('state',0)nn = nnsetup([784 20 10]); nn.output = 'softmax'; % use softmax outputopts.numepochs = 5; % Number of full sweeps through dataopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, tx, ty, opts, vx, vy); % nntrain takes validation set as last two arguments (optionally)[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');```[![Bitdeli Badge](https://d2weczhvl823v0.cloudfront.net/rasmusbergpalm/deeplearntoolbox/trend.png)](https://bitdeli.com/free "Bitdeli Badge")

Android使用mvp架构编写一个简单的登录注册功能的实现

/

weixin_51586111的博客 1710

Android MVP登录注册

这是接口类 这个是登录注册所需的接口类 public class LoginUtils implements IMView.IModel { private final OkHttpClient okHttpClient; //单例 public LoginUtils(){ okHttpClient = new OkHttpClient.Builder() .r...

weixin_44285793的博客 424

Android MVP框架实现登录案例

Android MVP框架实现登录案例 一、Model package com.czhappy.mvpdemo.model; /** * author: chenzheng * created on: 2019/5/16 11:06 * description: */ public class User { ...

陈正的博客 537

Android MVP实现登录.注册

需求很简单,使用接口和MVP架构模式实现登录和注册的操作 无奈啊,我也是对MVP又喜又爱,真是爱恨交加,为了偷懒,就把这个单一的功能单独拿出来吧!!关于MVP的具体学习,可以去鸿洋的博客里去具体学习,因为鸿洋的博客内容质量还是非常高的,也是我很佩服的大神! MVP鸿洋讲解链接 鸿洋浅谈MVP好了,开始我的CV大法吧OKHttpClient工具类package com.example.mvpokh

现状很好 1834

mvp的登录和注册

main布局 xml version="1.0" encoding="utf-8"?> LinearLayout android:orientation="vertical" xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/

你的孤独,虽败犹荣的博客 401

MVP登录注册、跳转

这是一个用MVP模式写的登录注册,包括手机号、密码验证,登陆成功后跳转到商品列表页面。先看一下效果: 正如我们看到的一样,在登陆界面点击注册会跳转到注册页面,注册成功后会跳转到登录界面,登录成功后会跳转到商品列表界面。在登录注册的过程中手机号和密码使用正则表达式进行了验证,使用OKhttp请求的网络,RecyclerView展示的数据,Springview执行上拉刷新和下拉加载。下面

huangaolu的博客 1063

MVP登录注册

1.MainActivity public class MainActivity extends AppCompatActivity implements LoginView { private EditText ed_pwd, ed_num; private Button regist, login; private LoginPresenter presenter; ...

weixin_44308983的博客 211

Android MVP架构模式

详解Android如何实现MVP架构

保温杯拖把风扇的博客 5129

MVP注册登录

MVP注册登录 //布局登录 内有图片可忽略 &lt;?xml version="1.0" encoding="utf-8"?&gt; &lt;EditText android:id="@+id/et_name" android:layout_width=“300dp” android:layout_marginTop=“70dp” android:layout_gravity=“center”...

王鑫林的博客 171
上一篇: Android_单例模式
下一篇: Android_OkHttp介绍与使用
绅V科技
博客等级 码龄9年 61粉丝 81原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值