封装一个在小项目中使用的volley(通俗简便、方便灵活)

安卓常用网络请求框架XUtils、OkHttp、Volley、Retrofit 1.xutils 此框架庞大而周全,这个框架可以网络请求,同时可以图片加载,又可以数据存储,又可以 View 注解,使用这种框架很方便,这样会使得你整个项目对它依赖性太强,万一以后这个库不维护了,或者中间某个模块出问题了,这个影响非常大,所以在项目开发时,一般会更喜欢选择专注某一领域的框架。 使用案例: RequestParams params = new RequestParams("http:... 阅读详情

Google 2013 I/O大会上发布了Android平台上的网络通信库volley,今天Google 2017 I/O大会正在进行中,封装个小volley做个纪念(主要是以后可以在小项目中直接使用)。

volley的设计目标是非常适合去进行数据量不大,但通信频繁的网络操作,而对于大数据量的网络操作,比如说下载文件等,volley的表现会非常的糟糕,根据项目的实际情况选择使用。

volley整体框架类的继承结构图:

其实封装的已经很好了,非常方便我们使用,无论是请求字符串还是图片都很简单。volley最简单直接的使用分为三步,这里以StringRequest为例演示一下:

private void performStringRequest() {
        /**
         * volley请求的三部曲:
         * 1 . 创建请求
         * 2 . 创建请求队列
         * 3 . 将请求添加到请求队列中
         */
        String url = "https://www.baidu.com/";
        Response.Listener<String> listener = new Response.Listener<String>() {
            @Override
            public void onResponse(String response) {
                // 请求成功的结果处理,请求结果在response中
                Log.d(TAG, "onResponse: " + response);
            }
        };
        Response.ErrorListener errorListener = new Response.ErrorListener() {
            @Override
            public void onErrorResponse(VolleyError error) {
                // 请求发生错误的回调
                Log.d(TAG, "onErrorResponse: " + error.getMessage());
            }
        };

        //get请求:三参数,url , 请求成功监听和错误监听
        StringRequest stringRequest = new StringRequest(url, listener, errorListener);//1 . 创建请求
        RequestQueue queue = Volley.newRequestQueue(getApplicationContext());//2 . 创建请求队列
        queue.add(stringRequest);//3 . 将请求添加到请求队列中
}
上面是StringRequest的get请求,post请求也比较简单,只是创建请求的时候指定请求类型,传递请求体参数即可,其它步骤同get请求:
new StringRequest(Request.Method.POST, url, listener, errorListener) {
            @Override
            protected Map<String, String> getParams() throws AuthFailureError {
                Map<String, String> map = new HashMap<String, String>();
                map.put("params1", "values1");//传的参数1
                map.put("params2", "values2");//传的参数2
                return map;
            }
};//1 . 创建post请求,2,3同get请求(略)
这只是以StringRequest为例简单介绍了volley的使用,其它几个兄弟类的使用方式与其类似,这里就不一一举例了。

每次这么做代码量会比较多,而且每做一次请求就创建一个请求队列RequestQueue明显是不合理的,接下来稍微封装一下,方面日后小项目的使用:
模仿StringRequest封装一个自己的Request请求类,可以直接进行get或者post请求

public class QJRequest<T> extends Request<T> {
    private Class<T> mClass;
    private Gson mGson;
    private Response.Listener<T> mListener;
    private Map<String, String> requestBodyMap;//post 请求 请求体参数集合


    /**
     * POST 请求
     *
     * @param clazz         请求结果要解析成的java bean
     * @param url
     * @param map           请求体参数
     * @param listener
     * @param errorListener
     */
    public QJRequest(Class<T> clazz, String url, Map<String, String> map, Response.Listener listener, Response.ErrorListener errorListener) {
        super(Method.POST, url, errorListener);
        mClass = clazz;
        mListener = listener;//模仿StringRequest的做法
        requestBodyMap = map;
    }

    /**
     * GET 请求
     *
     * @param url           请求的url
     * @param listener      成功的监听
     * @param errorListener 失败的监听
     */
    public QJRequest(Class<T> clazz, String url, Response.Listener listener, Response.ErrorListener errorListener) {
        super(Method.GET, url, errorListener);
        mClass = clazz;
        mListener = listener;//模仿StringRequest的做法
    }

    @Override
    protected Response parseNetworkResponse(NetworkResponse networkResponse) {
        byte[] data = networkResponse.data;//请求成功后得到的byte数组

        // 使用 Gson解析
        try {
            String result = new String(data, "utf-8");//使用utf-8防止乱码问题
            T bean = getGson().fromJson(result, mClass);

            //返回解析后的结果
            //第一个参数是解析后的结果(java bean)
            //第二个参数是缓存的条目信息
            return Response.success(bean, HttpHeaderParser.parseCacheHeaders(networkResponse));

        } catch (IOException e) {
            e.printStackTrace();
            return Response.error(new ParseError(networkResponse));//返回解析错误
        }
    }

    @Override
    protected void deliverResponse(T t) {
        this.mListener.onResponse(t);
    }

    /**
     * @return post 请求的请求体参数
     * @throws AuthFailureError
     */
    @Override
    protected Map<String, String> getParams() throws AuthFailureError {
        return requestBodyMap;
    }

    /**
     * @return 一个简单的单例 Gson对象
     */
    private Gson getGson() {
        if (mGson == null) {
            mGson = new Gson();
        }
        return mGson;
    }

    /**
     * 将请求加入到请求队列中
     * 创建请求对象之后可以直接调用此方法,链式调用方便代码书写
     */
    public void execute() {
        NetworkManager.addRequest(this);
    }
}
请求对象我们有了,还需要一个请求队列,我们把这个请求队列封装在网络管理类中
public class NetworkManager {

    //整个app只保留和维护一个Volley请求队列
    private static RequestQueue mRequestQueue;

    //缓存大小是我们运行内存大小的1/4
    private static final int CACHE_SIZE = (int) (Runtime.getRuntime().freeMemory() / 4);

    //维护一个全局的ImageLoader
    private static ImageLoader mImageLoader;//Helper that handles loading and caching images from remote URLs.

    /**
     * 在application 的onCreate方法中调用此方法
     *
     * @param context getApplicationContext
     */
    public static void init(Context context) {
        mRequestQueue = Volley.newRequestQueue(context);
        mImageLoader = new ImageLoader(mRequestQueue, new MyImageCache(CACHE_SIZE));
    }

    /**
     * 添加请求到请求队列
     */
    public static void addRequest(Request request) {
        mRequestQueue.add(request);
    }

    /**
     * LruCache (Least Recent Use Cache)
     * 
     * 当缓存空间已经满了,就会把最近最少使用的数据清除掉
     *
     * K 存储数据的键值
     * V 存储的数据
     */
    public static class MyImageCache extends LruCache<String, Bitmap> implements ImageLoader.ImageCache {

        /**
         * @param maxSize 缓存的大小
         */
        public MyImageCache(int maxSize) {
            super(maxSize);
        }

        /**
         * @return 返回对应数据缓存的大小, 即图片的大小
         */
        @Override
        protected int sizeOf(String key, Bitmap value) {
            //return value.getByteCount(); api 要求比较高 , 故用下面的 , 实质相同
            return value.getRowBytes() * value.getHeight();
        }

        /**
         * 从缓存里面获取对应url的图片
         *
         * @param url 缓存的key
         */
        @Override
        public Bitmap getBitmap(String url) {
            return get(url);//从lru cache里面获取图片
        }

        /**
         * 把对应url的图片存进缓存
         */
        @Override
        public void putBitmap(String url, Bitmap bitmap) {
            put(url, bitmap);
        }

    }

    /**
     * @return 全局唯一的ImageLoader
     */
    public static ImageLoader getImageLoader() {
        return mImageLoader;
    }

}

在应用的Application中还需要初始化我们的NetWorkManager:

public class QJApplication extends Application {
    @Override
    public void onCreate() {
        super.onCreate();
        NetworkManager.init(getApplicationContext());
    }
}

如此简单封装之后我们的请求就可以这么写了:

private void performGetRequest() {
        String url = "http://192.168.1.9:8080/version.json";//自己测试的url
        Response.Listener<VersionBean> listener = new Response.Listener<VersionBean>() {
            @Override
            public void onResponse(VersionBean o) {
                Log.d(TAG, "onResponse: " + o);
            }
        };
        Response.ErrorListener errorListener = new Response.ErrorListener() {
            @Override
            public void onErrorResponse(VolleyError volleyError) {
                Log.d(TAG, "onErrorResponse: " + volleyError.getMessage());
            }
        };
        new QJRequest(VersionBean.class, url, listener, errorListener).execute();//get请求封装后写法示例
}
传入url和成功错误的回调之后我们最后可以得到的是对应json数据的java bean类,这样就方便很多了,post请求亦是如此
private void performPostRequest() {
        String url = "http://139.199.76.41:8080/vr-app/game/gameRecommends";
        Map<String, String> map = new HashMap<>();
        map.put("item", "2");
        Response.Listener<GameRecommendsBean> listener = new Response.Listener<GameRecommendsBean>() {
            @Override
            public void onResponse(GameRecommendsBean o) {
                Log.d(TAG, "onResponse: " + o);
            }
        };
        Response.ErrorListener errorListener = new Response.ErrorListener() {
            @Override
            public void onErrorResponse(VolleyError volleyError) {
                Log.d(TAG, "onErrorResponse: " + volleyError.getMessage());
            }
        };
        new QJRequest(GameRecommendsBean.class, url, map, listener, errorListener).execute();
}
与get请求相比,post请求只是多了一个请求体参数,需要一个Map集合,创建请求之后调用execute()方法直接发送请求,便于代码的书写
对于图片的请求,volley给我提供了一个用于请求网络图片的ImageView,即NetworkImageView,利用我们的简单封装可以很方便的请求图片

mNetworkImageView.setImageUrl(url, NetworkManager.getImageLoader());//使用NetWorkImageView只需要url即可
简单封装到此结束,谢谢阅读!
封装及使用Demo下载

---------------------------------------------2017/12/22---------------------------------------------

对于上面代码的封装中有几处后来优化的地方做如下说明:

1. 缓存大小的设置(NetworkManager中的init方法)

	CACHE_SIZE = (int) (Runtime.getRuntime().maxMemory() >> 3);
        if (CACHE_SIZE <= 0) {
            CACHE_SIZE = 10240000;//未获取到jvm的大小,则设置为固定值,将近 10M
        }
2. 增加加载网络图片的方法(NetworkManager类中)
	/**
     * 加载网络图片,将网络图片显示到对应的imageview上
     *
     * @param url               网络图片的地址
     * @param imageView         显示网络图片的iamgeview,该imageview是android系统的,不能用 volley中的 NetworkImageView
     * @param defaultImageResId
     * @param errorImageResId
     */
    public static void displayImage(String url, ImageView imageView, int defaultImageResId, int errorImageResId) {
        mImageLoader.get(url, ImageLoader.getImageListener(imageView, defaultImageResId, errorImageResId));
    }
3. 避免Gson对象重复创建(QJRequest类中)
private Gson mGson;//优化前
private static Gson mGson;//优化后
优化之前每次创建QJRequest对象都会创建一个Gson对象,优化是为了共用一个Gson对象

优化后的Volley封装及使用Demo下载

Volley自定义实战Demo项目 本文还有配套的精品资源,点击获取 简介:Volley是一款由Google开发的Android网络库,用于快速高效地处理网络请求。这个“Volley自定义Demo”项目扩展了Volley的源码,以支持JSON格式的GET和POST请求,并添加了网络图片下载的功能。它封装了Volley的核心特性,如快速响应、低延迟和自动GZIP解压,简化了网络请求的流程。此外,它还提供了对co... 阅读详情

相关推荐

Tesseract-Ocr踩坑下载以及进行检验

1 OCR,即Optical Character Recognition:光学字符识别,是指通过扫描字符,然后通过其形状将其翻译成电子文本的过程。下载完成后进行解压找到这两个,然后复制到之前下载Tesseract-Ocr的tessdata文件下。可能会出现报错说chi下载的问题咱们不用管继续ok让它先下载完毕,后续会有下载chi的步骤。四、检验tesseract使用(将以下图片进行下载我这里将以下图片命名为3.png)我这里选的是2024年的版本如果下载不了;4 在安装的时候(找到下载的exe文件,双击)

m0_51428325的博客 1915

一种Android分包策略推荐

分包的重要性在架构一个App时,大家往往都在关注新潮的技术,却忽略了一点,那就是分包。很多人可能没有一套分包的原则,凭感觉甚至随心所欲地创建package或将代码放到任意的package中。虽然最终不会影响App功能,但这个问题其实非常严重。一种不好的分包策略带来的影响将会一直持续在App的开发迭代周期中,主要表现为以下几点: 代码混乱,功能模块界限模糊 不易阅读与维护,尤其对新人来说 功能扩展与重

Battling against our own ignorance 3895

FactoryTool量产神器实战:5分钟搞定多块RK3568板卡并行烧录

本文详细介绍了使用瑞芯微FactoryTool对多块RK3568板卡进行高效并行烧录的实战指南。文章从硬件连接、驱动配置、软件操作到排错技巧,提供了一套完整的量产解决方案,重点阐述了如何利用该工具在5分钟内完成多设备固件烧录,并确保eMMC存储的写入稳定性与效率,大幅提升生产线吞吐量。

b0c1d2的博客 985

Android Studio使用volley前在项目内集成过程

打开AS后单击圈出来的按钮点击圈出来的app单击红色圈出来的Dependencies后,点击绿色圈出来的加号选择第一项Library dependency在弹出对话输入栏中输入volley,选择第4行,单击ok在app-Dependencies界面中出现下面框出来的就是可以了,单击ok

weixin_39584227的博客 868

人大金仓集群部署(主备)

4.2 上传安装包镜像和授权文件到install目录下并授权。1、复制系统脚本到/opt/kingbase目录下(主节点)4.2 修改cluster_install.sh。回车进行下一步,直到出现以下界面,回复Y键回车。三、安装kingbase客户端段(都要安装)install目录作为安装包具体存放目录。4.1 修改install.conf文件。2、复制授权文件到安装目录下(主节点)3、修改ssh参数(节点都要配置)5、安装kingbase客户端。二、基本环境配置(都要配置)6、数据库集群安装(主节点)

edutech_wang的博客 1995

linux和mac安装+配置circos(

一定要下载完这两个包,GD才会work,要不然会报错,且-modules显示也是fail。官网的教程说的很明白,但是很多包都已经过时了需要在网上找。一般来讲,所有包的安装都不会太困难,除了GD。1.是因为官网给的链接下出来的tgz无法解压。2.我的电脑安装后GD照样是fail的。,进入这个地址下一个.tgz。第二点的原因在于,官网的情况。,进入这个地址,按部就班。GD安装困难有以下几点。搞了一天终于配置成功。

xiufan1的博客 549

如何打包一个项目文件

如何打包一个项目文件 最近,在联系Qt编程,上篇说到我想发布一个Qt项目,但是项目运行需要依赖很多DLL文件,这些文件需要一同包含到项目文件夹中。然而,我并不希望将这些dll文件暴露给别人。所以需要一个打包工具,将我这些文件打包成一个可执行文件,将其发布给别人使用。 这里我使用的是Enigma Virtual Box 工具,进行文件打包。下载地址:http://miaowm5.gith

小小的CODEING的专栏 2332

YOLOv11 + TensorRT 在 Jetson 设备上的实时部署

YOLOv11 + TensorRT 在 Jetson 设备上的实时部署

p6666666668的博客 1588

简单封装volley 实现快速调用

首先要依赖volley的库,网上有很多库,基本都可以使用,我选择的是 compile 'com.dubsmash.volley:library:2.0.1' 基本思路:将网络请求封装成一个工具类,需要使用的时候调用,通过接口将返回的数据传递出去 首先先写一个接口吧 public interface Interface_volley_respose { public void o...

又见飞的博客 280

脑机接口(BCI)从原理到开发实战 01|意念控制真的来了?一文看懂脑机接口的技术革命

类型定义典型应用主动式用户主动产生特定思维模式来控制设备运动想象(想象左手/右手移动)反应式用户被动接受外部刺激,系统检测大脑反应P300拼写器、SSVEP(稳态视觉诱发电位)被动式系统监测用户自发脑状态,不要求主动控制疲劳监测、情绪识别、注意力评估本系列后续文章将重点围绕主动式(运动想象)和反应式(P300/SSVEP)展开实战。脑机接口,这个曾经只存在于科幻中的概念,正在政策、资本、技术的三重驱动下,加速从实验室走向产业落地。2026年,注定是脑机接口发展史上浓墨重彩的一年。

小明的博客 1429

通信原理 | 通俗理解 | 因子图、消息传递以及它们之间的关系

在算法迭代过程中,通过反复更新这些消息,直到收敛,最终可以得到每个变量的边缘概率分布或最有可能的整体状态。算法通过因子图中的节点反复交换消息,直到找到最优解或所有消息稳定下来,从而解决了比如聚会日期这样的优化问题。在实际应用中,这种方法可以用来解决更复杂的问题,比如图像识别、语音识别和机器学习中的其他问题。,特别是在处理概率模型和执行概率推断时,因子图提供了一个强大的工具。(比如朋友的空闲时间和地点的可用性),并且你希望尽可能让所有人满意。在真正的因子图和消息传递算法中,这个过程被数学化和形式化。

若北辰 1190

Android最全封装一个在小项目中使用的volley(通俗简便、方便灵活),面试经历分享

35岁中年危机大多是因为被短期的利益牵着走,过早压榨掉了价值,如果能一开始就树立一个正确的长远的职业规划。传入url和成功错误的回调之后我们最后可以得到的是对应json数据的java bean类,这样就方便很多了,post请求亦是如此。//自己测试的url。作者2013年java转到Android开发,在小厂待过,也去过华为,OPPO等大厂待过,18年四月份进了阿里一直到现在。

2401_84520377的博客 396

第4章-07-将WebDriver获取的Cookie传递给Requests

在使用Selenium WebDriver获取了浏览器的Cookies之后,你可以将这些Cookies传递给requests库,以便在后续的HTTP请求中使用这些Cookies。这样做可以让你模拟浏览器会话,使得请求看起来像是从之前使用Selenium WebDriver控制的浏览器发出的。

黑夜开发者的博客 690

2024年Android最新封装一个在小项目中使用的volley(通俗简便、方便灵活),面试官很吊

代码真的是重质不重量,质量高的代码,是当前代码界提倡的,当然写出高质量的代码肯定需要一个相当高的专业素养,这需要在日常的代码书写中逐渐去吸收掌握,谁不是每天都在学习呀,目的还不是为了一个,为实现某个功能写出高质量的代码。所以,长征路还长,大家还是好好地做个务实的程序员吧。最后,小编这里有一系列Android提升学习资料,有兴趣的小伙伴们可以来看下哦~网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。需要这份系统化学习资料的朋友,可以戳这里获取。

2401_84562529的博客 788

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

2024年最全封装一个在小项目中使用的volley(通俗简便、方便灵活)(1),学生会面试题选择题答案

对于很多初中级Android工程师而言,想要提升技能,往往是自己摸索成长,不成体系的学习效果低效漫长且无助。整理的这些架构技术希望对Android开发的朋友们有所参考以及少走弯路,本文的重点是你有没有收获与成长,其余的都不重要,希望读者们能谨记这一点。下面是部分资料截图,诚意满满:特别适合有开发经验的Android程序员们学习。不论遇到什么困难,都不应该成为我们放弃的理由!如果你看到了这里,觉得文章写得不错就给个赞呗?

2301_82244718的博客 1106

深度学习工具包 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 Volley 超实用简易封装

自定义volley封装 简单清晰明了

CrosX的三级包 8706

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

Volley框架的二次封装

z       我们平时开发Android app 不可避免的会使用到网络技术,大多数情况下我们都会以http或者https来请求网络数据,而传统的HttpURLConnection、HttpClient,使用起来稍显繁琐。一些网络开发框架也应运而生,今天所要讲的Volley就是其中的一种。个人比较倾向于这个网络框架,究其原因在于他的灵活性。你可以根据你app的架构,对volley进行相应的二次

源码有毒的专栏 7169

volley框架的使用

volley框架的基本使用使用的原因Android系统中主要提供了两种方式来进行HTTP通信,HttpURLConnection和HttpClient,几乎在任何项目的代码中我们都能看到这两个类的身影,使用率非常高。 不过HttpURLConnection和HttpClient的用法还是稍微有些复杂的,如果不进行适当封装的话,很容易就会写出不少重复代码主要就是进行了以下三步操作: 创建一个Requ

sinat_17314503的博客 1978

Volley简单封装及使用

这是一个volley封装的demo,封装思路来自一个同事,我做了一点简单的修改。网络请求的实现类:public class BaseRequest { public static void StringRequestPost(final Context mContext, final int id, final String url, ...

majima的博客 444

Volley网络请求的简单封装使用

Volley提供了JsonObjectRequest、JsonArrayRequest、StringRequest等Request形式。 JsonObjectRequest:返回JSON对象。 JsonArrayRequest:返回JsonArray。 StringRequest:返回String,这样可以自己处理数据,更加灵活。 这里我就把StringRequest简单进行二次封装,方便

zane_xiao的博客 878

Android中Okhttp,Volley,Retrofit网络框架优缺点及对比

Okhttp: Square 公司开源的 OkHttp 是一个专注于连接效率的 HTTP 客户端。OkHttp 提供了对 HTTP/2 和 SPDY 的支持,并提供了连接池,GZIP 压缩和 HTTP 响应缓存功能。 优点: 支持http请求,https请求、支持同步异步。 支持文件下载、加载图片、基于Http的文件上传。 使用的是HttpURLConnection,不要担心android版本的...

Virgil_K2017的博客 5253

android volley解析与二次封装

实际上,将第三方API打包是个良好的实践手段,当你打包一个第三方API,你就降低了对它的依赖,未来你可以不太痛苦地改用其他代码库,在你测试自己的代码时,打包也有助于模拟第三方调用。打包的好处还在于你不必帮死在某个特定的API设计上。你可以定义自己感觉舒服的API。

Shawn_Dut的专栏 6180

android网络框架的封装——volley

本文主要用代码给出如何对volley进行封装制定出自己的request,实现项目工程中自己的网络请求框架,主要参考的是郭大神的博客http://blog.youkuaiyun.com/guolin_blog/article/details/17612763 首先给出自定义的Request类: public class MyVolleyRequest extends Request { priva

1411
上一篇: 自定义Android Toast
下一篇: Android 屏幕适配之dimens适配
github_2011
博客等级 码龄10年 116粉丝 56原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值