aidl用到的设计模式--Proxy代理模式

AIDL解析(一):AIDL原理解析 AIDL编写 AIDL运行原理 AIDL 阅读详情
[java]  view plain copy 在CODE上查看代码片 派生到我的代码片
  1. aidl用到的是远程代理模式,为客户端隐藏了IPC的细节。让客户端感觉好像拿到了一个服务器端对象的句柄。  
  2.   
  3. -------------------------------  
  4. IGreetService.aidl  
  5. -------------------------------  
  6. <ol class="dp-j" start="1"><li class="alt"><span><span class="keyword">package</span><span> com.scott.aidl;  </span></span></li><li><span><span class="keyword">import</span><span> com.scott.aidl.Person;  </span></span></li><li class="alt"><span>  </span></li><li><span><span class="keyword">interface</span><span> IGreetService {  </span></span></li><li class="alt"><span>    String greet(in Person person);  </span></li><li><span>}     
  7. </span></li></ol>  
这个aidl经过编译之后得到IGreetServcie.java


[java]  view plain copy 在CODE上查看代码片 派生到我的代码片
  1. package com.scott.aidl;    
  2.     
  3. public interface IGreetService extends android.os.IInterface {    
  4.     /** Local-side IPC implementation stub class. */    
  5.     public static abstract class Stub extends android.os.Binder implements com.scott.aidl.IGreetService {    
  6.         private static final java.lang.String DESCRIPTOR = "com.scott.aidl.IGreetService";    
  7.     
  8.         /** Construct the stub at attach it to the interface. */    
  9.         public Stub() {    
  10.             this.attachInterface(this, DESCRIPTOR);    
  11.         }    
  12.     
  13.         /**  
  14.          * Cast an IBinder object into an com.scott.aidl.IGreetService  
  15.          * interface, generating a proxy if needed.  
  16.          */    
  17.         public static com.scott.aidl.IGreetService asInterface(android.os.IBinder obj) {    
  18.             if ((obj == null)) {    
  19.                 return null;    
  20.             }    
  21.             android.os.IInterface iin = (android.os.IInterface) obj.queryLocalInterface(DESCRIPTOR);    
  22.             if (((iin != null) && (iin instanceof com.scott.aidl.IGreetService))) {    
  23.                 return ((com.scott.aidl.IGreetService) iin);    
  24.             }    
  25.             return new com.scott.aidl.IGreetService.Stub.Proxy(obj);    
  26.         }    
  27.     
  28.         public android.os.IBinder asBinder() {    
  29.             return this;    
  30.         }    
  31.     
  32.         @Override    
  33.         public boolean onTransact(int code, android.os.Parcel data, android.os.Parcel reply, int flags)    
  34.                 throws android.os.RemoteException {    
  35.             switch (code) {    
  36.             case INTERFACE_TRANSACTION: {    
  37.                 reply.writeString(DESCRIPTOR);    
  38.                 return true;    
  39.             }    
  40.             case TRANSACTION_greet: {    
  41.                 data.enforceInterface(DESCRIPTOR);    
  42.                 com.scott.aidl.Person _arg0;    
  43.                 if ((0 != data.readInt())) {    
  44.                     _arg0 = com.scott.aidl.Person.CREATOR.createFromParcel(data);    
  45.                 } else {    
  46.                     _arg0 = null;    
  47.                 }    
  48.                 java.lang.String _result = this.greet(_arg0);    
  49.                 reply.writeNoException();    
  50.                 reply.writeString(_result);    
  51.                 return true;    
  52.             }    
  53.             }    
  54.             return super.onTransact(code, data, reply, flags);    
  55.         }    
  56.     
  57.         private static class Proxy implements com.scott.aidl.IGreetService {    
  58.             private android.os.IBinder mRemote;    
  59.     
  60.             Proxy(android.os.IBinder remote) {    
  61.                 mRemote = remote;    
  62.             }    
  63.     
  64.             public android.os.IBinder asBinder() {    
  65.                 return mRemote;    
  66.             }    
  67.     
  68.             public java.lang.String getInterfaceDescriptor() {    
  69.                 return DESCRIPTOR;    
  70.             }    
  71.     
  72.             public java.lang.String greet(com.scott.aidl.Person person) throws android.os.RemoteException {    
  73.                 android.os.Parcel _data = android.os.Parcel.obtain();    
  74.                 android.os.Parcel _reply = android.os.Parcel.obtain();    
  75.                 java.lang.String _result;    
  76.                 try {    
  77.                     _data.writeInterfaceToken(DESCRIPTOR);    
  78.                     if ((person != null)) {    
  79.                         _data.writeInt(1);    
  80.                         person.writeToParcel(_data, 0);    
  81.                     } else {    
  82.                         _data.writeInt(0);    
  83.                     }    
  84.                     mRemote.transact(Stub.TRANSACTION_greet, _data, _reply, 0);    
  85.                     _reply.readException();    
  86.                     _result = _reply.readString();    
  87.                 } finally {    
  88.                     _reply.recycle();    
  89.                     _data.recycle();    
  90.                 }    
  91.                 return _result;    
  92.             }    
  93.         }    
  94.     
  95.         static final int TRANSACTION_greet = (android.os.IBinder.FIRST_CALL_TRANSACTION + 0);    
  96.     }    
  97.     
  98.     public java.lang.String greet(com.scott.aidl.Person person) throws android.os.RemoteException;    
  99. }    

这里面一共定义了三个class.

首先看第一个Interface的申明:

public interface IGreetService extends android.os.IInterface { 
这个Interface继承了 android.os.IInterface

[java]  view plain copy 在CODE上查看代码片 派生到我的代码片
  1. 1 /* 
  2.  2  * Copyright (C) 2006 The Android Open Source Project 
  3.  3  * 
  4.  4  * Licensed under the Apache License, Version 2.0 (the "License"); 
  5.  5  * you may not use this file except in compliance with the License. 
  6.  6  * You may obtain a copy of the License at 
  7.  7  * 
  8.  8  *      http://www.apache.org/licenses/LICENSE-2.0 
  9.  9  * 
  10. 10  * Unless required by applicable law or agreed to in writing, software 
  11. 11  * distributed under the License is distributed on an "AS IS" BASIS, 
  12. 12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 
  13. 13  * See the License for the specific language governing permissions and 
  14. 14  * limitations under the License.                                                                                                                                                                                
  15. 15  */  
  16. 16   
  17. 17 package android.os;  
  18. 18   
  19. 19 /** 
  20. 20  * Base class for Binder interfaces.  When defining a new interface, 
  21. 21  * you must derive it from IInterface. 
  22. 22  */  
  23. 23 public interface IInterface  
  24. 24 {  
  25. 25     /** 
  26. 26      * Retrieve the Binder object associated with this interface. 
  27. 27      * You must use this instead of a plain cast, so that proxy objects 
  28. 28      * can return the correct result. 
  29. 29      */  
  30. 30     public IBinder asBinder();  
  31. 31 }  

就是一个类型转换,注释里面说是要用这个函数的转换而不是强制类型转换,从而让代理对象可以返回一个正确的值。那就看一下代理对象是如何实现这个函数的。


于是第二个类出现了

private static class Proxy implements com.scott.aidl.IGreetService {


这个类实现了上述接口,并且是一个私有的静态内部类。他实现IInterface中的asBinder方法如下:

[java]  view plain copy 在CODE上查看代码片 派生到我的代码片
  1. public android.os.IBinder asBinder() {    
  2.      return mRemote;    
  3.  }    

mRemote是从哪儿来的?

[java]  view plain copy 在CODE上查看代码片 派生到我的代码片
  1. private android.os.IBinder mRemote;    
  2.   
  3. Proxy(android.os.IBinder remote) {    
  4.     mRemote = remote;    
  5. }    

原理是从构造函数传过来的。那代理对象是在哪里构造的?

[java]  view plain copy 在CODE上查看代码片 派生到我的代码片
  1. public static com.scott.aidl.IGreetService asInterface(android.os.IBinder obj) {    
  2.     if ((obj == null)) {    
  3.         return null;    
  4.     }    
  5.     android.os.IInterface iin = (android.os.IInterface) obj.queryLocalInterface(DESCRIPTOR);    
  6.     if (((iin != null) && (iin instanceof com.scott.aidl.IGreetService))) {    
  7.         return ((com.scott.aidl.IGreetService) iin);    
  8.     }    
  9.     return new com.scott.aidl.IGreetService.Stub.Proxy(obj);    
  10. }    

这是在另外一个内部类里面的,这个类的声明如下:

public static abstract class Stub extends android.os.Binder implements com.scott.aidl.IGreetService {

这个类继承了Binder,并且实现了之前的那个人service,跟上面那个类一样的。之前那个类是私有的,这个是共有的而且还是抽象的。

刚好这里面有个函数asInterface。这说明Binder需要把自己转化成一个Interface给别人用。而Interface需要把自己转化为Binder给别人用。真是一对好机油啊。

因为客户端需要的是一个Interface的句柄,所以这里提供了这个函数。客户端是这样调用的

IGreetService remoteService = IGreetService.Stub.asInterface(binder); 这个binder是系统回调 service的 onConnection的时候传过来的。

这段代码大概意思就是说如果service是一个本地对象就可以直接拿到service对象的句柄,否则我们就通过remote proxy的方式拿到一个代理对象。由这个代理对象在背后

默默的为我们工作,默默的处理进程间通讯的问题。



这里面比较绕的是内部类跟外部类的关系比较复杂。不止是内外的关系,内部类又继承了外部类,而且继承的层次还不只一层,有两层嵌套。而且还巧妙的运用了proxy的

设计模式。有趣的是这段代码是自动生成的,我们只需要定义Aidl文件,编译器会自动帮我们生成这段代码。值得看一下!后面再看一下IBinder Binder, Service ServiceConnection 这些相关的接口和类吧。


转载:http://blog.youkuaiyun.com/safsasasa/article/details/18085871

基于YOLO的印章检测及文字识别 针对印章自动化检测与文字识别需求,提出了一种融合改进YOLO模型与OCR技术的端到端解决方案,旨在解决复杂背景干扰、印章残缺变形及环形文字排列等难题 阅读详情

相关推荐

内存优化--LOGBACK导致内存告警

一.故事背景 由于开辟新市场需要,开发了新的项部署在海外平台,其中最消耗内存的功能是消费kafka消息(最开始预计一天有1千万的量),部署完之后运行一段时间发现出现内存告警问题。 二.分析问题 出现内存告警,(新项目是低配置机器 2C4G * 2台)第一个念头是去查看堆空间设置的情况,看到jvm启动命令中堆空间都是直接指定大小,说明问题不是出在堆空间 -Xmx3g -Xms3g 先不管这些,去查看总的内存使用情况,发现总的内存空间使用将近有92% = 3.68G,那么这多出来使用的0.6

qq_33199919的博客 6051

使用AIDL+动态代理+运行时注解+反射 反手撸一套Android跨进程通信框架

由于应用中存在多个进程,比如一个主进程,一个消息推送进程及一个应用守护进程,这使得进程间通信的开发提上日程,而为了提高开发效率,需要提炼出一套跨进程通信的基础框架,以本篇博客记录其编写过程

Mango先生的博客 6127

工业级隔离CAN FD收发器ISO1042设计实战:从原理到EMC防护

在工业自动化与伺服驱动系统中,CAN总线是实现设备间可靠通信的关键技术。其核心原理是通过差分信号传输和仲裁机制,在复杂电磁环境中实现多节点实时数据交换。这项技术的核心价值在于为高噪声、高干扰的工业现场提供了稳定、确定性的通信基础,是构建分布式控制系统不可或缺的环节。其典型应用场景包括新能源汽车电池管理、工业机器人伺服控制以及光伏逆变器集群通信等。本文将聚焦于如何通过高性能隔离CAN FD收发器(如TI的ISO1042)来应对地电位差、浪涌和高压串扰等现场挑战,深入解析其集成的电气隔离、±70V总线故障保护和

weixin_26834815的博客 384

AIDL通信过程中设置死亡代理

在进行进程间通信的过程中,如果服务端进程由于某种原因异常终止,我们的远程调用就会失败,影响我们的功能,那么怎么样能够知道服务端进程是否终止了呢,一种方法就是给Binder设置死亡代理。除设置死亡代理,Binder对象还有两个方法可以判断服务器进行是否存在或存活,返回均为boolean类型。后面通过判断mBookManager是否为null即可知道服务端进程是否死亡。如果服务端进程死亡了,会回调到binderDied()函数。方法是在onServiceConnected()函数中,另外定义死亡代理对象。

chuyouyinghe的专栏 304

别急着让AI画板!聊聊Cadence Allegro X AI和OrCAD X在实际PCB项目中的真实体验

本文分享了Cadence Allegro X AI与OrCAD X在PCB设计中的实际应用体验,探讨了AI辅助Layout的效率提升与潜在陷阱。通过高速ADC采集板案例,详细对比了AI与传统方法在电源平面分割、低速信号布线等任务中的表现,并总结了人机协作的最佳实践,为工程师提供实用参考。

weixin_30836759的博客 2197

矿石生成(1)

这个提供了标准化的矿石放置配置模板简化了常见和稀有矿石的配置过程遵循了Minecraft原版的世界生成模式提高了代码的可读性和可维护性通过使用这个类,模组开发者可以更轻松地配置矿石的生成规则,而不需要每次都手动编写完整的放置修饰符列表。这种设计模式在原版Minecraft和其他大型模组中也很常见,是一种良好的编程实践。// 导入语句...// 字段和方法...包声明表明这个类位于luckymod模组的WorldGen包中,专门处理世界生成相关配置。导入语句。

qq_24992377的博客 136

AIDL 自动生成java代码——从分析内部类Stub、Proxy入手

前言 使用AIDL接口可以使得我们在调用其他进程的对象的方法,像调用自己进程本地对象的方法一样简单。本文将从AIDL接口文件自动生成的java文件来分析调用过程,虽然分析可能不够底层,但一定能对理解AIDL起到帮助。 代码 AIDL文件如下(IListener的接口文件不重要,这里它是个空接口都可以) package com.java.prac; import com.java.prac.ILis...

anlian523的博客 3303

uni-app - 将 base64 图片编码转为 Blob 本地文件路径(把base64类型的图片,转换成blob二进制文件流)适用于 uni-app / vue.js / JavaScript

uni-app/vue.js/JavaScript将base64转Blob,uniappapp端如何将图片的base64编码转换成File对象或Blob,uni-app/vue.js/JavaScript中拿到base64转blob对象,uniapp图片base64格式转blob格式方法,uniapp上传图片压缩转base64码与base64转图片路径,Base64/Blob/File图片文件转换,url、base64、blob相互转换方法,读取本地文件为Base64并转成B

🏆 前端领域优质创作者 1万+

AIDL中的Proxy,Stub以及其关系

在上篇文章中,了解了ITest.java与Proxy,Stub三者的层次关系。 public interface ITest extends android.os.IInterface { //Stub是一个Binder,也是一个ITest public static abstract class Stub extends android.os.Binder implements com.ex...

helloworld 1617

【Zabbix实战之部署篇】Docker部署Zabbix+grafana监控平台

【Zabbix实战之部署篇】docker部署Zabbix+grafana监控平台

jks212454的博客 2577

KEPServerEX 6 之 EX 6.11.718.0 发布说明

KEPServerEX 6.11.718.0 发布说明

-雲飛兄-博客 2880

Android常见设计模式——代理模式(Proxy Pattern)(二)

文章目录1. 前言2. 远程代理(Remote Proxy)3. 后记 1. 前言 在上篇Android常见设计模式——代理模式(Proxy Pattern)中基本上知道了什么是代理模式,以及对应的应该如何写代理模式的代码,了解了在Retrofit中没有被代理者的代理模式。在这篇中将继续围绕代理模式进行展开。在《Android源码设计模式》一书中提到:静态代理和动态代理是从编码的角度来区分代理模式的方式,同时也可以从其使用范围来区分不同类型的代理模式: 远程代理(Remote Proxy):为某个对象在不

梦否 1284

SimpleITK使用——1. 进行Resample/Resize操作

文章目录1. 变换到一个新的spacing1.1 使用Resample()的方法1.1.1 完整代码1.1.2 转换前后图像1.2 使用ResampleImageFilter()的方法2. 已知原图和变换后目标图像的大小2.1 代码2.2 转换后图像3. 相关内容说明3.0 体素和spacing3.1 Resample() 函数说明3.2 itk::simple::ResampleImageFilter函数说明 1. 变换到一个新的spacing 1.1 使用Resample()的方法 1.1.1

啷个哩个啷 8079

Android常用设计模式-代理模式

代理模式是Java中常用的设计模式之一,主要用于为其他对象提供一种代理以控制对这个对象的访问。

maoning20080808的专栏 747

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

深度学习工具包 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 跨进程通信-(七)AIDL中的代理模式之创建AIDL实例

前言 前面的一系列的 Android 跨进程通信-(一)Binder概念引入 Android 跨进程通信-(二)Binder机制之ServiceManager Android 跨进程通信-(三)Binder机制之Client Android 跨进程通信-(四)Binder机制之Server Android 跨进程通信-(五)Binder机制之一次拷贝的原理 Android 跨进程通信-(六)几句话描述Binder机制 都是从源码的角度来了解了Binder机制的一些概念性的东西,Binder驱

nihaomabmt的专栏 921

IMSL CNL 7.0.0 (x86-64)Crack

IMSL CNL 7.0.0 (x86-64)Crack intel的算法库破解文件,这是C++版本的破解文件

Android设计模式之代理模式与使用场景

在Android开发中,代理模式是一种常用的结构型设计模式,它允许通过代理对象控制对另一个对象(即目标对象)的访问。下面详细介绍代理模式及其在Android中的典型应用场景。通过合理使用代理模式,可以提高代码的可维护性和可扩展性,同时遵循单一职责原则。:通过代理对象间接访问目标对象,代理可以增强或控制对目标对象的访问。

分享技术和日常 1086

最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版

Part-E1-SDIO-Specification-Ver4.00-Final-120220.pdf:最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版,包括SDIO 接口的外设,SDIO 接口官方协议等。

Android Car&Source 01 -- 进程间通讯基本概念IPC,Binder,proxy,stub,AIDL,oneway

目录 1.IPC 2.Binder 3.Stub,Proxy 4.AIDL 5.oneway 最后.学习博客如下: 1.IPC IPC:Inter-Process Communication,指进程间通信或者跨进程通信,即两个进程之间进行数据交换的过程。 某一应用程序(App)时,android系统里的Zygote服务孵化(Fork)一个新的进程(progress)给它,然后将它(App)加载到这个新诞生的进程里。一个进程是一个独立的执行空间,不会被正在其他进程里的程序锁侵犯。 Andr

来个芒果1007 969

23种设计模式-Proxy模式

代理模式是对象的结构模式。代理模式给某一个对象提供一个代理对象,并由代理对象控制对原对象的引用。抽象对象角色:声明了目标对象和代理对象的共同接口,这样一来在任何可以使用目标对象的地方都可以使用代理对象。目标对象角色:定义了代理对象所代表的目标对象。代理对象角色:代理对象内部含有目标对象的引用,从而可以在任何时候操作目标对象;代理对象提供一个与目标对象相同的接口,以便可以在任何时候替代目标对象。代理对象通常在客户端调用传递给目标对象之前或之后,执行某个操作,而不是单纯地将调用传递给目标对象。

陈立的博客 773

【Android 核心复习】深入浅出 AIDL:从基本使用到 Binder 内核原理

本文系统介绍了Android AIDL跨进程通信机制。首先解释了AIDL作为基于Binder的IPC工具,采用代理模式实现。详细说明了开发步骤:定义接口、自动生成代码、服务端实现和客户端调用。重点剖析了底层原理,包括Binder的三段式通信流程和内核的mmap优化机制。针对面试场景,提供了死亡代理、定向标签等高频问题的解答方案,并给出线程安全、oneway异步调用等进阶建议。文章强调理解AIDL不仅有助于面试,更能提升实际开发中的IPC代码质量。

2301_79871637的博客 682

人人都会设计模式:代理模式--Proxy

PS:转载请注明出处作者: TigerChain地址: http://www.jianshu.com/p/1b3b6b003032本文出自 TigerChain 简书 人人都会设计模式 教程简介 1、阅读对象 本篇教程适合新手阅读,老手直接略过 2、教程难度 初级,本人水平有限,文章内容难免会出现问题,如果有问题欢迎指出,谢谢 正文...

weixin_34366546的博客 279

Android设计模式源码解析之Proxy模式

Android设计模式源码解析之Proxy模式 本文为 Android 设计模式源码解析 中 Proxy模式 分析 Android系统版本: 5.0 分析者:singwhatiwanna,分析状态:完成,校对者:Mr.Simple,校对状态:已校对 Binder中的代理模式在说Binder中的代理模式之前,我们需要先看看代理模式的简单实现,这一部分内容采用了《JAVA与模

singwhatiwanna 1万+

05、人人都会设计模式:代理模式--Proxy

本文是人人都会设计模式第五篇--代理模式,本文交你如何使用代理模式追 MM ,以简单明了方式以生活中的例子让你轻松愉悦的掌握代理模式,不要走接着往下看...

TigerChain 的码之路 950

代理模式及对startActivity的Hook应用

简而言之,就是让代理类和目标类(被代理类)实现同一个接口,并让代理类持有一个目标类的对象,这样对代理类的访问,可以转移到目标类的访问中去。我们可以在不修改目标类的情况下,在代理类中实现一些功能的增强,从而间接的增强了目标类的功能。UML图如下:@Override// 完成一些事情@Override远程代理(AIDL)

jxq1994的博客 1135

Head First设计模式读书笔记十 第十一章 代理模式

之前的总结链接 https://blog.youkuaiyun.com/u011109881/article/details/59191308 代理模式本身的框架结构并不难理解,但是在实际应用中,我们往往被实际应用的复杂外表所欺骗,而看不到代理模式的本质。比如HEAD First书中的RMI远程代理的例子,或者是Android中跨进程的AIDL的例子。我们往往会困惑于远程代理是如何实现的,Android里面是...

积跬步 至千里 613

人人都会设计模式---代理模式--Proxy

教程大纲 版权声明:本文为博主原创文章,未经博主允许不得转载 PS:转载请注明出处作者: TigerChain地址: www.jianshu.com/p/1b3b6b003…本文出自 TigerChain 简书 人人都会设计模式 教程简介 1、阅读对象本篇教程适合新手阅读,老手直接略过 2、教程难度初级,本人水平有限,文章内容难免会出现问题,如果有问题欢迎指出,谢谢 正文 一、什...

weixin_33923762的博客 530

Android代理模式中的那些代码

题记 为什么突然会想到整理下代理模式?emm…因为最近头脑风暴了下自己的知识体系,还是对自己代码架构上的东西不够满意。最近梳理的很多知识体系中,反复都提到了代理模式。 比如Hook这个玩意真的是令我又爱又恨,其中对动态代理的渗透,让我对这个代码的设计欲罢不能。给篇参考链接:Android插件化原理解析——Hook机制之动态代理。 再比如Binder通信,Android 中的AIDL对代理模式的使用也是精彩绝伦。 1. 为什么叫代理模式 官方解释:一个类代表另一个类的功能。这种类型的设计模式属于结构型模式

黑马小杰的博客 527
上一篇: 一些重要的算法
下一篇: Binder框架在Framework层的C++中的使用
panfengsoftware
博客等级 码龄20年 38粉丝 34原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值