首页 文章 精选 留言 我的

精选列表

搜索[笔记工具],共10000篇文章
优秀的个人博客,低调大师

Android学习笔记--Activity和intent

MicrosoftInternetExplorer402DocumentNotSpecified7.8Normal0 多个Activity之间的关系 跳转关键startActivity(Intentintent) 在onClickListener监听器的onClick方法中 内部类继承OnClickListener Intentintent=newIntent(); intent.putExtra(key,value);//设置传参数据 intent.setClass(this,class);//设置跳转参数 Activity.this.startActivity(intent); 事件绑定 myButton=(Button)findViewById(R.id.myButton); myButton.setOnClickListener(new内部类名());//注册成功 Intent对象的获取 Intentintent=getIntent(); Stringvalue=intent.getStringExtra(key); TextView=(TextView)findViewById(R.id.myTextView); TextView.setText(value); 2.Intent的基本作用 Intent对象包含了一组信息相当于一个请求 1.Componentname(欲启动Activity的名称等等) 2.Action(另一个Activity的动作) 3.Data(传递的数据) 4.Category 5.Exreas(额外的键值对信息) 6.Flags 启动另一个Activity 例Urlurl=Url.parse("smsto://08000000123"); Intentintent=newIntent(Intent.ACTION_SENDTO,url); intent.putExtra("sms_body","TheSMStext"); startActivity(intent); 本文转自My_King1 51CTO博客,原文链接:http://blog.51cto.com/apprentice/1360578,如需转载请自行联系原作者

优秀的个人博客,低调大师

Android学习笔记--XML文件解析

MicrosoftInternetExplorer402DocumentNotSpecified7.8Normal0 1.什么是SAX SimpleAPIforXML,既是指一种接口,也是指一个软件包 作为接口,SAX是事件驱动型XML解析的一个标准接口 2.SAX基本原理 SAX的哦给你工作原理简单地说就是对文档进行顺序扫描,当扫描到文档(document)开始与结束,元素(element)开始与结束等地方时通知事件处理函数,由事件处理函数做相应动作,然后继续同样的扫描,直至文档结束. 大多数SAX实现都会产生一下类型的事件 { 在文档的开始和结束时出发文档处理事件 在文档内每一XML元素接受解析的前后触发元素事件 任何元数据通常都由氮素的事件交付 在处理文档的DTD或Schema时产生DTD或Schema事件 产生错误事件用来通知主机应用程序解析错误 } 3.SAX常用接口 ContentHandler接口 ContentHandler是java类包中一个特殊的SAX接口,位于org.xml.sax包中.该接口封装了一些对事件处理的方法,当XML解析器开始解析XML输入文档时,它会遇到某些特殊的事件,比如文档的开头和结束,元素的开头和结束,以及元素中的字符数据等事件.当遇到这些事件时,XML解析器会调用ContentHandler接口中相应的方法来响应该事件 ContnetHandler接口的方法有以下几种 { VoidstartDocument(); VoidendDocument(); VoidstartElement(Stringuri,StringlocalName,stringqName,Attributesatts) VoidendElement(Stringuri,StringlocalName,StringqName) Voidcharacters(char[]ch,intstart,intlength) } 4.SAX解析 解析文档过程 例:<doc> <para>HelloWorld!</para> </doc> 在解析文档的过程中会产生如下一系列事件 Startdocument { Startelement:doc A:创建事件处理程序 Startelement:para Characters:HelloWorld! B:创建SAX解析器 Endelement:para Endelement:doc C:将事件处理程序分配给解析器 D:对文档进行解析,将每个事件发送给处理程序 Enddocument } 解析样例: 1.声明控件对象(略) 2.获得控件对象(略) 3.绑定事件(略) 4.创建监听器对象 PublicvoidonClick(Viewv){ HttpDownloaderhd=newHttpDownloader(); StringresultStr=hd.download("XMLURL"); System.out.priintln(resultStr); Try { //创建一个SAXParseFactory SAXParserFactoryfactory=SAXParserFactory.newInstance(); XMLReaderreader=factory.newSAXParser().getXMLReader(); //为XMLReader设置内容处理器MyContentHandler reader.setContentHandler(newMyContenHandler()); //开始解析文件字符串构造成reader之后构造成inputSource Reader.parse(newInputSource(newStringReader(resultStr))); }catch(Execptione){ e.printStackTrace(); } } XML文件写法: <wordkers> <workerid="AQ01"> <name>mark</name> <sex>male</sex> <status>manager</status> <address>NewYork</address> <salary>$4000</salary> <workerid="AQ02"> <name>lily</name> <sex>female</sex> <status>assists</status> <address>H</address> <salary>$2000</salary> <workerid="AQ03"> <name>tom</name> <sex>male</sex> <status>manager</status> <address>F</address> <salary>$5000</salary> </wordkers> MyContenHandler的写法例: PublicclassMyContenHandlerExtendsDefaultHandler{//此处体现了适配器模式 StringName,Sex,Status,Address,Salary StringtagName; //开始document PublicvoidstartDocument()throwsSAXExecption{ System.out.println("-------begin--------"); } //结束document PublicvoidendDocument()throwsSAXExecption{ System.out.println("-------end--------"); } //开始节点对象 PublicvoidstartElement(StringnamespaceURI,StringlocalName,StringqName,Attributesattr)throwsSAXExecption{ tagName=localName; If(localName.equals("worker")){ //获取标签的全部属性 For(inti=0;i<attr.getLength();i++){ System.out.println(attr.getLocalName(i)+"="+attr.getValue(i)) } } } //结束节点对象 PublicvoidendElement(StringnamespaceURI,StringlocalName,StringqName)throwsSAXExecption{ //在一个标签解析完之后,打印所有标签的信息 If(localNmae.equals("worder")){ This.printout(); } } //读取文本对象 Publicvoidcharacters(char[]ch,intstart,intlength)throwsSAXExecption{ If(tagNmae.equals("name")) Hisname=newString(ch,start,length); Elseif(tagNmae.equals("sex")) Sex=newString(ch,start,length); Elseif(tagNmae.equals("status")) Status=newString(ch,start,length); Elseif(tagNmae.equals("address")) Address=newString(ch,start,length); Elseif(tagNmae.equals("salary")) Salary=newString(ch,start,length); } //打印读出的信息 Publicvoidprintout(){ System.out.println("name--->"+Name); System.out.println("name--->"+Sex); System.out.println("name--->"+Status); System.out.println("name--->"+Address); System.out.println("name--->"+Salary); } } 本文转自My_King1 51CTO博客,原文链接:http://blog.51cto.com/apprentice/1360566,如需转载请自行联系原作者

优秀的个人博客,低调大师

Android内核剖析读书笔记

第16章 程序包管理 PackageManagerService類 PmS 目錄 16.1 包管理概述 16.2 packages.xml文件格式 16.3 包管理服務的啟動過程 16.4 應用程序的安裝和卸載 16.5 intent匹配框架 16.1 包管理概述 1.包管理服務的程序結構 分別為應用程序層,PmS服務層,及數據文件層 應用程序層 DontextImpl.ApplicationPackageManager Pms服務層 /data/system/packages.xml 所有应用程序与包管理相关信息 /system/etc/permisions/xxx.xml 加载系统feature,并为核心系统进程分配默认权限 PackageManagerService DefaultContainerService : 把安裝程序複製到程序目錄中。 Installer: 實際上是一個Socket客戶端。 程序文件層 /system/app 系统自带应用程序路径 /data/app 第三方应用程序层 /data/dalvik-cache/dex文件输出路径 /system/framework/*.apk;*.jar framework中的程序 /data/secure 加密文件 /data/drm/ drm用户专有目录 /data/app-private/drm用户专有目录 /data/data/ 普通程序数据 16.2 packages.xml文件格式 保存在 /data/system目錄下,裏面有很多標籤,如last-platform-version, permission-trees等。 16.3 包管理服務的啟動過程 包管理服務的啟動過程實際上市讀取XML文件中的信息,并把這些信息存放到相關的類成員變量中。 1.創建PmS。Settings對象 2.mSettings.addShareduserLP() 添加四個共享id。 3.創建一個Installer對象,該對象將輔助程序的安裝。 4.給幾個數據文件賦值。如mAppDataDir,mSecureAppDataDir,mDrmAppPrivateInstallDir。 5.調用readPermission函數。 6.調用沒Setting對象的readLP函數,讀取應用程序和包管理相關信息。 7.對java系統中的庫進行dex提取。 8為三個程序目錄創建一個FileObserver。FileObserver对象内部会检测目录中的添加、删除事件。這三個目錄是 /system/frameworks: 该目录保存了framework內核相關程序 /system/app:系统程序 /verdor/app:第三方程序,一般指厂商开发的自定义程序。 9 调用scanDirLI()掃描(解析程序中的Androidmanifest.xml)以上三個目錄中的所有程序文件,并將掃描結果放到PmS中的mPackages變量中。 10 刪除已經不存在程序對應的數據記錄。 11 清除沒有安裝成功的數據記錄。 12 為一下兩個第三方程序目錄添加FileObserver,并調用scanDirLI()解析目錄下所有的應用程序。 這連個目錄如下。 /data/app: 普通應用程序目錄。 /data/app-private: 該目錄沒錢并沒有被使用。 13 刪除/data/app目錄下以vmdl開頭及以.tmp结尾的文件。 14 如果系統版本升級,調用updatePermissionLP() 重新為應用程序賦予權限。 15 調用writeLP() 將mPackages中的數據重新寫入packages.xml文件中。 以上就是Pms啟動的主體功能。 16.4 應用程序的安裝和卸載 安裝和卸載應用程序都由PmS完成。安裝程序的過程包括在程序目錄下創建以包命名的程序文件、創建程序數據目錄,以及把程序相關的信息保存到相關的配置文件packages.xml文件中,卸載過程則是相反的操作。 16.5 intent匹配框架 intent匹配主要解決應用程序中沒有明確指定Component名稱的情況。 本文转自Work Hard Work Smart博客园博客,原文链接:http://www.cnblogs.com/linlf03/p/3370227.html,如需转载请自行联系原作者

优秀的个人博客,低调大师

AppStore ipa (苹果内购)笔记

文章目录[点击展开](?)[+] 内购示意图 准备条件 itunes store设置 注意事项 创建带价格的商品 沙箱测试 添加可购买商品 提交Apple审核 购买模式 文献资料 内购示意图 准备条件 苹果的开发者证书,已经为应用启用App内购,并在Xcode更新配置文件 itunes store设置 itunes中创建App及其它设置 参考:iOS应用程序内购/内付费(一) http://blog.csdn.net/shenjie12345678/article/details/40978977 注意事项 创建带价格的商品 1、一定要同意协议、银行、税务的协议,才能创建有价格的商品,且协议的状态一定要是已经生效 ,一般一两小时内就可以生效 参考:iOS App提交指南-协议、税务和银行业务 沙箱测试 2、启用沙箱测试,添加沙箱帐号[PS貌似只能通过添加一个新的Apple ID] 添加可购买商品 3、前面的协议同意之后才能创建有价格的商品,比如之前我一直只能创建免费商品 提交Apple审核 说明:不用等待苹果审核完成,也可以进行内购测试,但需要完成前面的1,2,3步。 购买模式 单机购买模式和服务器验证类型 文献资料 iOS内购实现及测试Check List 详解iOS应用程序内使用IAP/StoreKit付费、沙盒(SandBox)测试、创建测试账号流程!【2012-12-11日更新获取"产品付费数量等于0的问题"】 https://developer.apple.com/library/ios/navigation/ 本文转自赵青青博客园博客,原文链接:http://www.cnblogs.com/zhaoqingqing/p/4589200.html,如需转载请自行联系原作者

优秀的个人博客,低调大师

Cocoa编程学习笔记之MVC

Cocoa 使用了一种修改版本的MVC模式来处理GUI的显示。MVC模式(自1979年以来)已经出现很长时间了,它皆在分离显示用户界面所需的大量任务,并处理用户交互。正如名称所蕴含的,MVC具有三个主要部分,Model(模型)、View(视图)和Controller(控制器): 模型——模型是特定于领域的数据表现形式。比如说,我们正在创建一个任务列表应用程序。你可能会有一个Task对象的集合,书写为List。 你或许把这些数据保存在数据库、XML文件,或者甚至从Web Service中得到,不过MVC不那么关心它们是在何处/如何来持久保存的(乃至它们是什么)。相反,它特别专注于如何显示这些数据,并处理与用户交互的,好的模型类不包括任何有关用户界面的内容,可以在多个应用程序中使用。视图——视图代表了数据如何实际地显示出来。在我们这个假设的任务应用程序中,会在一个网页(以HTML的方式)中来显示这些任务,也会在一个WPF页面中(以XAML的方式)来显示,或者在一个iPhone应用程序中显示为UITableView 。如果用户点击某个任务,要删除之,那么视图通常会触发一个事件,或对Controller(控制器)进行一个回调,好的视图类是通用类,可以在多个应用中使用。控制器——控制器是模型和视图间的粘合剂,负责控制整个应用的流程。控制器的目的就是获取模型中的数据,告知视图来显示。控制器还侦听着视图的事件,在用户选中一个任务来删除的时候,控制着任务从模型中删除。通过分离显示数据、持久化数据和处理用户交互的职责,MVC模式有助于创建易于理解的代码。而且,它促进了视图和模型的解耦,以便模型能被重用。例如,在你的应用程序中,有两个界面,基于Web的和WPF的,那么你可以在两者中都使用同样的模型定义代码。 因而,在很多MVC框架中不管具体的工作方式如何,基本原理都大致如此的。然而,在Cocoa(及Cocoa Touch)中,还是或多或少有所不同,苹果用MVC来代表Views(视图)、View Controller(视图控制器)和Models(模型);但是在不同的控件中,它们却不是完全一致的,实现的方式也不太一样。 在Objective-C/Cocoa的世界里,我们建立的controller通常是指应用程序(Application)的委托(Delegate),或者可以简单称做app delegate。当你在Objective-C里面建立一个app delegate的时候,这个delegate可以做为你所有model和view的controller,或者你也可以为不同的model和view分别创建controller。 本文来自云栖社区合作伙伴“doNET跨平台”,了解相关信息可以关注“opendotnet”微信公众号

优秀的个人博客,低调大师

成为阿里云大使的笔记

阿里云云大使的官方视频介绍见下https://yq.aliyun.com/webinar/play/255?utm_content=m_25169 今天成为一名阿里云大使,坐标云南。阿里云的博客很有意思,分为markdown和富文本2种形式,富文本形式和普通的博客编辑差不多,而markdown形式一个显著特色是,左边在写的时候,右边实时能预览----这种感觉像不像DW里的设计模式?(作为一名预备设计师,我挺喜欢这种左代码右图像的感觉) 云大使的主页https://promotion.aliyun.com/ntms/yunparter/zhaomu.html成为云大使的2个条件:1.阿里云消费超过100 支付宝实名认证 签约时会往你的邮箱发一个验证码,记住是邮箱不是手机,别等手机了。签约成功后,云大使的管理在账户管理里,点击头像再选云大使管理即可。 云大使可以发的幸运券共19种,分别是有优惠哦!不过暂时还没有准备好推广,我的推广方式很独特,敬请期待!

优秀的个人博客,低调大师

Android Bitmap和Canvas学习笔记

位图是我们开发中最常用的资源,毕竟一个漂亮的界面对用户是最有吸引力的。 1. 从资源中获取位图 可以使用BitmapDrawable或者BitmapFactory来获取资源中的位图。 当然,首先需要获取资源: Resources res=getResources(); 使用BitmapDrawable获取位图 使用BitmapDrawable (InputStream is)构造一个BitmapDrawable; 使用BitmapDrawable类的getBitmap()获取得到位图; // 读取InputStream并得到位图 InputStream is=res.openRawResource(R.drawable.pic180); BitmapDrawable bmpDraw=new BitmapDrawable(is); Bitmap bmp=bmpDraw.getBitmap(); 或者采用下面的方式: BitmapDrawable bmpDraw=(BitmapDrawable)res.getDrawable(R.drawable.pic180); Bitmap bmp=bmpDraw.getBitmap(); 使用BitmapFactory获取位图 (Creates Bitmap objects from various sources, including files, streams, and byte-arrays.) 使用BitmapFactory类decodeStream(InputStream is)解码位图资源,获取位图。 Bitmap bmp=BitmapFactory.decodeResource(res, R.drawable.pic180); BitmapFactory的所有函数都是static,这个辅助类可以通过资源ID、路径、文件、数据流等方式来获取位图。 以上方法在编程的时候可以自由选择,在Android SDK中说明可以支持的图片格式如下:png (preferred), jpg (acceptable), gif (discouraged),和bmp(Android SDK Support Media Format)。 2. 获取位图的信息 要获取位图信息,比如位图大小、像素、density、透明度、颜色格式等,获取得到Bitmap就迎刃而解了,这些信息在Bitmap的手册中,这里只是辅助说明以下2点: 在Bitmap中对RGB颜色格式使用Bitmap.Config定义,仅包括ALPHA_8、ARGB_4444、ARGB_8888、RGB_565,缺少了一些其他的,比如说RGB_555,在开发中可能需要注意这个小问题; Bitmap还提供了compress()接口来压缩图片,不过AndroidSAK只支持PNG、JPG格式的压缩;其他格式的需要Android开发人员自己补充了。 3. 显示位图 显示位图可以使用核心类Canvas,通过Canvas类的drawBirmap()显示位图,或者借助于BitmapDrawable来将Bitmap绘制到Canvas。当然,也可以通过BitmapDrawable将位图显示到View中。 转换为BitmapDrawable对象显示位图 // 获取位图 Bitmap bmp=BitmapFactory.decodeResource(res, R.drawable.pic180); // 转换为BitmapDrawable对象 BitmapDrawable bmpDraw=newBitmapDrawable(bmp); // 显示位图 ImageView iv2 = (ImageView)findViewById(R.id.ImageView02); iv2.setImageDrawable(bmpDraw); 使用Canvas类显示位图 这儿采用一个继承自View的子类Panel,在子类的OnDraw中显示 public class MainActivity extends Activity { /** Called when the activity is first created. */ @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(new Panel(this)); } class Panel extends View{ public Panel(Context context) { super(context); } public void onDraw(Canvas canvas){ Bitmap bmp = BitmapFactory.decodeResource(getResources(), R.drawable.pic180); canvas.drawColor(Color.BLACK); canvas.drawBitmap(bmp, 10, 10, null); } } } 4. 位图缩放 (1)将一个位图按照需求重画一遍,画后的位图就是我们需要的了,与位图的显示几乎一样:drawBitmap(Bitmapbitmap,Rectsrc,Rectdst,Paintpaint)。 (2)在原有位图的基础上,缩放原位图,创建一个新的位图:CreateBitmap(Bitmap source, int x, int y, int width, int height, Matrix m, boolean filter) (3)借助Canvas的scale(float sx, float sy) (Preconcat the current matrix with the specified scale.),不过要注意此时整个画布都缩放了。 (4)借助Matrix: Bitmap bmp = BitmapFactory.decodeResource(getResources(), R.drawable.pic180); Matrix matrix=new Matrix(); matrix.postScale(0.2f, 0.2f); Bitmap dstbmp=Bitmap.createBitmap(bmp,0,0,bmp.getWidth(), bmp.getHeight(),matrix,true); canvas.drawColor(Color.BLACK); canvas.drawBitmap(dstbmp, 10, 10, null); 5. 位图旋转 同样,位图的旋转也可以借助Matrix或者Canvas来实现。 Bitmap bmp = BitmapFactory.decodeResource(getResources(), R.drawable.pic180); Matrix matrix=new Matrix(); matrix.postScale(0.8f, 0.8f); matrix.postRotate(45); Bitmap dstbmp=Bitmap.createBitmap(bmp,0,0,bmp.getWidth(), bmp.getHeight(),matrix,true); canvas.drawColor(Color.BLACK); canvas.drawBitmap(dstbmp, 10, 10, null); 旋转效果: 6.图片水印的生成方法 生成水印的过程。其实分为三个环节:第一,载入原始图片;第二,载入水印图片;第三,保存新的图片。 /** * create thebitmapfrom a byte array * * @param src thebitmapobject you want proecss * @param watermark the water mark above the src * @return return abitmapobject ,if paramter's length is 0,return null */ privateBitmap createBitmap( Bitmap src, Bitmap watermark ) { String tag ="createBitmap"; Log.d( tag,"create a newbitmap"); if( src ==null) { returnnull; } intw = src.getWidth(); inth = src.getHeight(); intww = watermark.getWidth(); intwh = watermark.getHeight(); //create the new blankbitmap Bitmap newb = Bitmap.createBitmap( w, h, Config.ARGB_8888 );//创建一个新的和SRC长度宽度一样的位图 Canvas cv =newCanvas( newb ); //draw src into cv.drawBitmap( src,0,0,null);//在 0,0坐标开始画入src //draw watermark into cv.drawBitmap( watermark, w - ww +5, h - wh +5,null);//在src的右下角画入水印 //save all clip cv.save( Canvas.ALL_SAVE_FLAG );//保存 //store cv.restore();//存储 returnnewb; } 7.Canvas的save和restore onDraw方法会传入一个Canvas对象,它是你用来绘制控件视觉界面的画布。 在onDraw方法里,我们经常会看到调用save和restore方法,它们到底是干什么用的呢? save:用来保存Canvas的状态。save之后,可以调用Canvas的平移、放缩、旋转、错切、裁剪等操作。 restore:用来恢复Canvas之前保存的状态。防止save后对Canvas执行的操作对后续的绘制有影响。 save和restore要配对使用(restore可以比save少,但不能多),如果restore调用次数比save多,会引发Error。save和restore之间,往往夹杂的是对Canvas的特殊操作。 例如:我们先想在画布上绘制一个右向的三角箭头,当然,我们可以直接绘制,另外,我们也可以先把画布旋转90°,画一个向上的箭头,然后再旋转回来(这种旋转操作对于画圆周上的标记非常有用)。然后,我们想在右下角有个20像素的圆,那么,onDraw中的核心代码是: int px = getMeasuredWidth(); int py = getMeasuredWidth(); // Draw background canvas.drawRect(0, 0, px, py, backgroundPaint); canvas.save(); canvas.rotate(90, px/2, py/2); // Draw up arrow canvas.drawLine(px / 2, 0, 0, py / 2, linePaint); canvas.drawLine(px / 2, 0, px, py / 2, linePaint); canvas.drawLine(px / 2, 0, px / 2, py, linePaint); canvas.restore(); // Draw circle canvas.drawCircle(px - 10, py - 10, 10, linePaint); 效果如图1所示: 如果我们不调用save和restore会是什么样子呢?如图2所示: 从这两个图中,我们就能看到圆圈位置的明显差异。不进行Canvas的save和restore操作的话,所有的图像都是在画布旋转90°后的画布上绘制的。当执行完onDraw方法,系统自动将画布恢复回来。save和restore操作执行的时机不同,就能造成绘制的图形不同。 本文转自feisky博客园博客,原文链接:http://www.cnblogs.com/feisky/archive/2010/01/10/1643460.html,如需转载请自行联系原作者

优秀的个人博客,低调大师

Android 动画使用的笔记整理

//=================【frame animation 帧动画】=============================== Frame动画是一系列图片按照一定的顺序展示的过程,和放电影的机制很相似,我们称为逐帧动画。 Frame动画可以被定义在XML文件中,也可以完全编码实现。(animation-list,标签内容没有提示,就手动添加) 《studio 中 需要在drawable里边创建 frame动画的文件。animation-list》 实现方法两种: 1)xml中的实现方法 在/res下的anim或drawable目录中(/res/[anim |drawable]/filename.xml), 文件名可以作为资源ID在代码中引用; 1、[xml文件的语法] <?xml version="1.0" encoding="utf-8"?> <animation-list xmlns:android="http://schemas.android.com/apk/res/android" android:oneshot=["true" | "false"] > <item android:drawable="@[package:]drawable/drawable_resource_name" android:duration="integer" /> </animation-list> <item>元素代表一帧动画,android:drawable指定此帧动画所对应的图片资源,android:druation代表此帧持续的时间,整数,单位为毫秒。 Android:onshot如果定义为true的话,此动画只会执行一次,如果为false则一直循环。 2、图片放于drawable目录 ImageView image = (ImageView) findViewById(R.id.frame_image); image.setBackgroundResource(R.anim.frame); //将动画资源文件设置为ImageView的背景 //or xml.布局中,android:background="@anim/mywifi_animation" / //获取ImageView背景,此时已被编译成AnimationDrawable AnimationDrawable anim = (AnimationDrawable) image.getBackground(); anim.start(); //开始动画 在onCreate中调用AnimationDrawable的start方法时,窗口Window对象还没有完全初始化, AnimationDrawable不能完全追加到窗口Window对象中,那么该怎么办呢? 我们需要把这段代码放在onWindowFocusChanged方法中,当Activity展示给用户时,onWindowFocusChanged方法就会被调用,我们正是在这个时候实现我们的动画效果。 当然,onWindowFocusChanged是在onCreate之后被调用的,如图: public void stopFrame(View view) { if (anim.isRunning()) { //如果正在运行,就停止 anim.stop(); } } 2)Java代码实现的帧动画 public void runFrame(View view) { //完全编码实现的动画效果 AnimationDrawable anim = new AnimationDrawable(); for (int i = 1; i <= 4; i++) { //根据资源名称和目录获取R.java中对应的资源ID int id = getResources().getIdentifier("f" + i, "drawable", getPackageName()); //根据资源ID获取到Drawable对象 Drawable drawable = getResources().getDrawable(id); //将此帧添加到AnimationDrawable中 anim.addFrame(drawable, 300); } anim.setOneShot(false); //重复的次数 image.setBackgroundDrawable(anim); //将动画设置为ImageView背景 anim.start(); //开始动画 } //===========【Tween Animation:(补间动画)】================= 补间动画就是我们只需指定开始、结束的“关键帧“,而变化中的其他帧由系统来计算,不必自己一帧帧的去定义。 四种子类:AlphaAnimation(透明度动画)、ScaleAnimation(缩放动画)、TranslateAnimation(位移动画)、RotateAnimation(旋转度动画)。 /* 1.动画时间 duration 2.是否循环 3.开始位置坐标 4. 动画属性 ,由快到慢 etc */ AnimationSet animationSet = new AnimationSet(true); AlphaAnimation:淡入淡出动画 // 动画1:透明度变化: 1.0 fully opaque 完全不透明;0.0 fully transparent 完全透明 AlphaAnimation alphaAnimation = new AlphaAnimation(1, 0); alphaAnimation.setDuration(2000);// 持续时间 animationSet.addAnimation(alphaAnimation); imageView.startAnimation(animationSet); TranslateAnimation:位移动画 // 平移动画设置 TranslateAnimation translateAnimation = new TranslateAnimation(0, 150, 0, 0); // new TranslateAnimation( // Animation.RELATIVE_TO_SELF, 10f, Animation.RELATIVE_TO_SELF, 50.0f, // Animation.RELATIVE_TO_SELF, 10f, Animation.RELATIVE_TO_SELF, 50.0f); translateAnimation.setDuration(2000); translateAnimation.setInterpolator(new AccelerateInterpolator()); /** * TranslateAnimation * @setFillAfter的设置如果为true,则动画执行完之后效果定格在执行完之后的状态 * @setFillBefore的设置如果为true,则动画执行完之后效果定格在执行完之前的状态 * @setStartOffset设置的是一个long类型的值,是指动画延迟多少毫秒之后执行 * @setRepeatCount定义的是动画重复几次执行 */ translateAnimation.setRepeatCount(3); translateAnimation.setStartOffset(2000); animationSet.setFillAfter(false); animationSet.setFillBefore(true); animationSet.addAnimation(translateAnimation); imageView.startAnimation(animationSet); ScaleAnimation:缩放动画 // 前四个参数,x、y方向上从什么倍数缩放到什么倍数,后面四个参数是相对在什么位 // 置进行缩放。跟平移差不多一个意思 ScaleAnimation scaleAnimation = new ScaleAnimation(1, 0.1f, 1, 0.1f, Animation.RELATIVE_TO_SELF, 0.5f, Animation.RELATIVE_TO_SELF, 0.5f); scaleAnimation.setDuration(2000); animationSet.addAnimation(scaleAnimation); imageView.startAnimation(scaleAnimation); RotateAnimation:旋转动画 // 后面的四个参数定义的是旋转的圆心位置 RotateAnimation rotateAnimation = new RotateAnimation(0, -359, Animation.RELATIVE_TO_SELF, 0.5f, Animation.RELATIVE_TO_SELF, 0.5f); rotateAnimation.setDuration(2000); rotateAnimation.setInterpolator(new LinearInterpolator());//恒定变化 rotateAnimation.setRepeatCount(-1); animationSet.addAnimation(rotateAnimation); imageView.startAnimation(animationSet); 以上是java的实现: //--------------------------------------------------------------- 以下是xml的实现补间动画的方法tween //res/anim 文件夹建立 *.xml动画的文件, 格式如下 <set xmlns:android="http://schemas.android.com/apk/res/android" android:fillAfter="false" android:fillBefore="true"> <alpha android:duration="2000" android:fromAlpha="1.0" android:toAlpha="0" /> <!-- 透明度控制动画效果 alpha 浮点型值: fromAlpha 属性为动画起始时透明度 toAlpha 属性为动画结束时透明度 说明: 0.0表示完全透明 1.0表示完全不透明 以上值取0.0-1.0之间的float数据类型的数字 长整型值: duration 属性为动画持续时间 说明: 时间以毫秒为单位 --> <translate android:duration="1000" android:fromXDelta="-50%p" android:toXDelta="0" /> <!-- translate 位置转移动画效果 整型值: fromXDelta 属性为动画起始时 X坐标上的位置 toXDelta 属性为动画结束时 X坐标上的位置 fromYDelta 属性为动画起始时 Y坐标上的位置 toYDelta 属性为动画结束时 Y坐标上的位置 注意: 不管是100%还是100%p,都应该是以控件所在的位置为起始点开始 没有指定fromXType toXType fromYType toYType 时候,默认是以自己为相对参照物 android:toXDelta="100%",表示自身的100%,也就是从View自己的位置开始。 android:toXDelta="80%p",表示父层View的80%,是以它父层View为参照的。 长整型值: duration 属性为动画持续时间 说明: 时间以毫秒为单位 --> <rotate android:duration="3000" android:fromDegrees="0" android:interpolator="@android:anim/accelerate_decelerate_interpolator" android:pivotX="50%" android:pivotY="50%" android:toDegrees="+1080" /> <!-- rotate 旋转动画效果 浮点数型值: fromDegrees 属性为动画起始时物件的角度 toDegrees 属性为动画结束时物件旋转的角度 可以大于360度 说明: 当角度为负数――表示逆时针旋转 当角度为正数――表示顺时针旋转 (负数from――to正数:顺时针旋转) (负数from――to负数:逆时针旋转) (正数from――to正数:顺时针旋转) (正数from――to负数:逆时针旋转) pivotX 属性为动画相对于物件的X坐标的开始位置 pivotY 属性为动画相对于物件的Y坐标的开始位置 说明: 都是以物件所在的位置起始点 以上两个属性值 从0%-100%中取值 50%:物件的X或Y方向坐标上物件长度的一半的距离 50%p为物件在X或Y方向坐标上屏幕的一半的距离 长整型值: duration 属性为动画持续时间 说明: 时间以毫秒为单位 --> <scale android:duration="5000" android:fromXScale="0.0" android:fromYScale="0.0" android:interpolator="@android:anim/accelerate_decelerate_interpolator" android:pivotX="50%" android:pivotY="50%" android:toXScale="4.0" android:toYScale="4.0" /> <!-- 尺寸伸缩动画效果 scale android:fillAfter="true" 动画停留在最后一帧。只在<set />里面在有作用 属性:interpolator 指定一个动画的插入器 使用android.res.anim中的资源时候发现有三种动画插入器 accelerate_decelerate_interpolator 加速-减速 动画插入器 accelerate_interpolator 加速-动画插入器 decelerate_interpolator 减速- 动画插入器 其他的属于特定的动画效果 浮点型值: fromXScale 属性为动画起始时 X坐标上的伸缩尺寸 toXScale 属性为动画结束时 X坐标上的伸缩尺寸 fromYScale 属性为动画起始时Y坐标上的伸缩尺寸 toYScale 属性为动画结束时Y坐标上的伸缩尺寸 说明: 以上四种属性值 0.0表示收缩到没有 1.0表示正常无伸缩 值小于1.0表示收缩 值大于1.0表示放大 pivotX 属性为动画相对于物件的X坐标的开始位置 pivotY 属性为动画相对于物件的Y坐标的开始位置 说明: 都是以物件所在的位置起始点 以上两个属性值 从0%-100%中取值 50%:物件的X或Y方向坐标上物件长度的一半的距离 50%p为物件在X或Y方向坐标上屏幕的一半的距离 长整型值: duration 属性为动画持续时间 说明: 时间以毫秒为单位 布尔型值: fillBefore是指动画结束时画面停留在第一帧, fillAfter是指动画结束是画面停留在最后一帧。 最关键的问题是,这2个参数不能在</alpha>,</scale>,</translate>,</rotate>中设置,这是没有用的,必须 在动画xml文件的</set>节点中设置 fillAfter 属性 当设置为true ,该动画转化在动画结束后被应用 startOffset, 动画多次执行的间隔时间,如果只执行一次,执行前会暂停这段时间, 单位毫秒 duration,一次动画效果消耗的时间,单位毫秒, 值越小动画速度越快 repeatCount,动画重复的计数,动画将会执行该值+1次 repeatMode,动画重复的模式,reverse为反向,当第偶次执行时,动画方向会相反。 restart为重新执行,方向不变 --> </set> //载入xml动画 //Animation animation = AnimationUtils.loadAnimation(ActivityMain.this, R.anim.name); AnimationSet set = (AnimationSet) AnimationUtils.loadAnimation(this, R.anim.tweentest); // 载入XML文件成Animation对象 view.startAnimation(animation); //动画的监听方法 int i = 0; for (Animation a : set.getAnimations()) { Log.e(TAG, " a = " + i++); if (i == 1) a.setAnimationListener(new AnimationListener() { @Override public void onAnimationStart(Animation animation) { Log.e(TAG, " start "); } @Override public void onAnimationRepeat(Animation animation) { Log.e(TAG, " repeat "); } @Override public void onAnimationEnd(Animation animation) { Log.e(TAG, " end "); } }); } Activity 入场动画 Intent intent = new Intent(Activity01.this,Activity02.class); startActivity(intent); //1.启动的Activity02的动画;2.当前退出的Activity01的动画 overridePendingTransition(R.anim.myint,R.anim.alpha); //===========【Property Animation:(属性动画)】================= Android 3.0中才引进 :直接更改我们对象的属性 (1)ValueAnimator:包含Property Animation动画的所有核心功能,如动画时间,开始、结束属性值,相应时间属性值计算方法等。应用ValueAnimator有两个步骤 1计算属性值。 2根据属性值执行相应的动作,如改变对象的某一属性。 我们的主是第二步,需要实现ValueAnimator.onUpdateListener接口,这个接口只有一个函数onAnimationUpdate(),将要改变View对象属性的事情在该接口中do。 animation.addUpdateListener(new AnimatorUpdateListener() { @Override public void onAnimationUpdate(ValueAnimator animation) { //do your work } }); (2)ObjectAnimator:继承自ValueAnimator,要指定一个对象及该对象的一个属性,当属性值计算完成时自动设置为该对象的相应属性,即完成了Property Animation的全部两步操作。实际应用中一般都会用ObjectAnimator来改变某一对象的某一属性,但用ObjectAnimator有一定的限制,要想使用ObjectAnimator,应该满足以下条件: 1.对象应该有一个setter函数:set(驼峰命名法) 2如下面的例子,像ofFloat之类的工场方法,第一个参数为对象名,第二个为属性名,后面的参数为可变参数,如果values…参数只设置了一个值的话,那么会假定为目的值,属性值的变化范围为当前值到目的值,为了获得当前值,该对象要有相应属性的getter方法:get 3如果有getter方法,其应返回值类型应与相应的setter方法的参数类型一致。 ObjectAnimator oa=ObjectAnimator.ofFloat(tv, alpha, 0f, 1f); oa.setDuration(3000); oa.start(); 如果不满足上面的条件,我们只能乖乖的使用ValueAnimator来创建动画。 (3)Animator.AnimatorListener:可以为Animator设置动画监听,需要重写下面四个方法。 onAnimationStart() onAnimationEnd() onAnimationRepeat() onAnimationCancel() 三种动画的优缺点: (1)Frame Animation(帧动画)主要用于播放一帧帧准备好的图片,类似GIF图片,优点是使用简单方便、缺点是需要事先准备好每一帧图片; (2)Tween Animation(补间动画)仅需定义开始与结束的关键帧,而变化的中间帧由系统补上,优点是不用准备每一帧,缺点是只改变了对象绘制,而没有改变View本身属性。因此如果改变了按钮的位置,还是需要点击原来按钮所在位置才有效。 (3)Property Animation(属性动画)是3.0后推出的动画,优点是使用简单、降低实现的复杂度、直接更改对象的属性、几乎可适用于任何对象而仅非View类,缺点是需要3.0以上的API支持,限制较大!但是目前国外有个开源库,可以提供低版本支持! 三种动画的demo下载地址: Frame动画简单的应用演示 http://download.csdn.net/detail/flyingsir_zw/9541211 Activity入场动画合集 积 分:1437上传资源:44下载资源:98总 排 名:第9346名上传权限:100MB

优秀的个人博客,低调大师

Machine Learning学习笔记(1)Introduction

1、机器学习可以做什么? 搜索引擎、垃圾邮件过滤、人脸识别等等,不仅用于人工智能领域,生物、医疗、机械等很多领域都有应用。 2、机器学习的定义 A computer program is said to learn from experience E with respect to some task T and some performance measure P,if its performance on T,as measured by P,improves with experience E.—-Tom Mitchell 3、监督学习(Supervised Learning) 举个例子:房价预测中,我们可以根据不同的模型预测房价。监督学习又叫回归问题,应该说回归属于监督的一种,意指要预测一个连续值的输出,比如房价预测、肿瘤预测。 4、无监督学习(Unsupervised Learning) 在监督学习的数据集中,比如肿瘤预测,我们可以知道数据集的肿瘤是良性的或者是恶性的,然而在无监督学习的数据集中是没有这种标签的,无监督学习可以把数据集自动分成两种不同的数据簇,所以叫做簇类算法。无监督学习应用很广,比如搜索引擎把同一类的信息归纳到一个组、计算机集群、市场细分、社交网络分析、天文数据分析。 5、鸡尾酒宴会问题 宴会上很多人,都在聊天,声音此起彼伏,所以存在这样一种可能:同一时间两个人同时在说话,我们放两个麦克风在房间里。 麦克风1距离人物1近一点,麦克风2距离人物2近一点,但是麦克风都可以搜到两个人声音的重叠,这是在计算机语音识别领域的一个问题,当前语音识别技术已经可以以较高精度识别一个人所讲的话,但是当说话的人数为两人或者多人时,语音识别率就会极大的降低,这一难题被称为鸡尾酒会问题。 6、学习准备 安装并熟悉Octave编程环境。

优秀的个人博客,低调大师

Hadoop学习笔记(三):Hive简介

定义 Hive是一个构建在Hadoop上的数据仓库框架。可以将结构化的数据文件映射为一张数据库表,并提供完整的sql查询功能,可以将sql语句转换为MapReduce任务进行运行。 其优点是学习成本低,可以通过类SQL语句快速实现简单的MapReduce统计,不必开发专门的MapReduce应用,十分适合数据仓库的统计分析。(来自百度百科~~) metastore metastore是Hive元数据的集中存放地,metastore包括两部分:服务和后台数据的存储。默认情况下,元数据存储在Derby数据库实例中。由于是本地数据库且不支持并发访问,故多作为练手使用。还一种使用其他数据库的方式称为“Local metastore”,支持并发访问,但metestore服务仍然和hive服务运行在同一个进程中,故称之为本地metastore。还有第三种方式:“Remote metastore”,metastore无武器和hive服务运行在不同的进程内,可以提供更好的可管理性和安全性。(怎么配Local metastore和Remte metastore先不搞了,先拿默认方式练手为主~) 和传统数据库的比较 最本质的一点,hive依赖于hdfs和MapReduce! 在传统数据库里,表的模式是在数据加载时强制确定的(写时模式,schema on write),而hive对数据的验证却在查询时进行(读时模式,schema on read);读时模式有利于数据加载,基本上就是纯粹的复制粘贴,且更加灵活,可以以各种不同模式来分析数据。写时模式有利于提升查询性能,因为可以建索引,压缩数据等。 hive不支持更新,事务和索引。(暂时不支持吧,将来谁也说不准~)hive是用来以MR的方式操作HDFS数据的,在这种环境下,全表扫描(full-table scan)是常态操作,而表更新则是通过吧数据变换后放入新表实现。事务方面hive并没有对表的并发访问做什么处理,需要应用程序端自己在应用层实现。(比如类似spring事务) HiveQL 不完全支持SQL-92标准,支持数值型,布尔型,字符串类型等原子类型;数组,映射,结构等复杂类型。 TINYINT,SMALLINT,INT,BUGINT分别对应于java中的byte,short,int,long。 FLOAT,DOUBLE直接对应float,double(废话~) STRING对应于string,而没有其他数据库中的 varchar,varchar2,char等类型。hive的STRING类似于其他数据库中的VARCHAR,但是不能声明最长字符数,理论上STRING最长为2G。 数据类型转换: 任何类型都可以隐式转换为一个范围更广的类型,所有整数类型,float,string(这个有点奇怪)都可以隐式转换为double,tinyint,smallint,int都可以隐式转换为float,double最大,不能隐式转换为任何类型。 可以使用cast执行显式转换,如果转换失败则返回空值null。 复杂类型: Hive有3中复杂类型:ARRAY,MAP和STRUCT;ARRAY,MAP和java中的类似;struct是一种记录类型,封装了一个命名的字段集合。复杂数据类型允许任意层次的嵌套。 操作: “||” 不是字符串连接操作符,而是 “或”操作符,concat函数用来作为连接操作 表: Hive表格逻辑上由存储的数据和描述表格中数据形式的相关元数据组成。数据存放在hdfs中,元数据(metastore)存放在关系数据库中。 Hive中的表分为托管表(managed table)和外部表(external table)两种。托管表是默认情况,托管表会将数据移入Hive的仓库目录(warehouse directory);外部表则直接到外部目录访问数据。 相应的,如果是托管表,LOAD操作将会复制数据到仓库目录,DROP操作将会删除表数据和表的元数据,而外部表则需要在CREATE操作时指定外部数据路径,在DROP操作时,只删除元数据而不碰外部数据。外部表使用EXTERNAL关键字创建。 普遍的用法是把存放在hdfs中的初始数据集用作外部表使,用Hive转换后的数据存入托管表;反过来——外部表可以用作将托管表中的数据导出到HDFS以供其他应用程序使用。 分区和桶 分区的好处是对于同一分区内的数据进行查询的时候将会非常高效,比如按年份分区,查某一年的数据只需要到这个分区中检索就行了。分区是在创建表的时候用 PARTITIONED BY 子句定义的。 CREATE TABLE LOGS(ts BEGINT,line STRING) PARTITIONED BY (dt STRING,country STRING); 在LOAD数据的时候则需要指定分区值: LOAD DATA LOCAL INPUT 'input/hive/partitions/file1' INTO TABLE logs PARTITION (dt='2001-1-1',country='GB'); 在文件系统中,分区只是表目录下嵌套的子目录。如按分区检索数据其实就是按文件系统目录检索数据了。 SHOW PARTITIONS logs; 命令会返回当前表中所有分区信息。PARTITIONED BY 子句中的列是表中正式的列,称为分区列。但是数据文件并不包含这些列,因为在目录中包含了。可以像普通列一样使用分区列(partition column)。 select ts,dt,line from logs where country='GB' 桶可以获得更高的查询处理效率;桶可以使取样操作更高效。使用CLUSTERED BY 子句来制定划分桶所用的列和要划分的桶的个数。 create table bucketed_records(year int,temperature STRING,quality STRING,station STRING) clustered by (year) sorted by (year ASC) into 4 buckets; insert overwrite table bucketed_records select * from records; 桶对应于MR的输出文件分区:一个作业产生的桶(输出文件)和reduce任务个数相同。由于我本地只有一个伪分布环境,只能一个reduce,所以只得到一个桶,一个桶~ 桶文件中包含在这个桶中的记录信息,划分桶的规则是:Hive对值进行哈希并将结果除以桶的个数取余数,这样任何一个桶里都会有一个随机的用户集合。 TABLESAMPLE 子句对表进行取样,这个子句会将查询限定在表的一部分桶内,而不是使用整个表: select * from bucketed_records tablesample(bucket 1 out of 4 on year); 存储格式 Hive从两个维度对表的存储进行管理:“行格式”(row format)和“文件格式”(file format)。行格式指行和一行中的字段如何存储,行格式由SerDe定义(Serializer-Deserializer) 默认格式为分割的文本,每行存储一个数据行。 二进制存储格式:顺序文件和RCFile Hadoop的顺序文件格式是一种针对顺序和记录的通用二进制格式。在Hive中,可以在CREATE TABLE 中通过声明STORED AS SEQUENCEFILE来使用顺序文件。使用顺序文件一个主要的优点是支持可分割的压缩(splittable)。顺序文件时面相行的,这意味着同一行中的字段作为一个顺序文件记录存储在一起。 RCFile按列记录文件,RCFile把表分成行分片(row split),在每一个分片中先存所有行的第一列,再存第二列,以此类推。通过声明STRED AS RCFILE来使用RCFile存储格式。 面向行的存储格式对于那些只访问表中一小部分行的查询比较有效;面相列的存储格式适合同事处理一列中很多列的情况。 导入数据 CREATE TABLE ... AS SELECT INSERT OVERWRITE TABLE LOAD DATA 三种格式,load data 和 insert overwrite table 上面都有示例了,ctas练手一个吧,还有插入partition的示例,多表插入 create table test_records(year int,temperature STRING,quality STRING,station STRING) as select * from records; insert overwrite table target partition (dt='xxx') select col1,col2 from source; insert overwrite table target partition (dt) select col1,col2,dt from source; from souce insert overwrite table table1 select col1,col2 insert voerwrite table tablw2 select col3,col4 ...; CTAS操作是原子的,如果SELECT查询由于某种原因失败,是不会创建新表的。表的操作 该语句可以将更新元数据并且将表目录移动到新名称所对应的目录下: alter table source rename to target; 添加一个新列: alter table target add columns (col3 string); drop表就跟其他sql一致了, 如果是外部表,则只删除元数据,外部数据不会受到影响。查询数据 排序和聚集: Hive的Order By子句对数据进行排序,但是Order By是通过只用一个Reducer来做到这一点的。对于大规模的数据集,效率非常低下。 在很多情况下,并不需要结果是全局排序。此时,可以使用Hive的非标准的扩展SORT BY。 SORT BY:为每个reducer产生一个排序文件; DISTRIBUTE BY X:确保X列相同的数据在同一个reduce分区中; select year,temperature from records distribute by year sort by temperature desc; 内连接: Hive 不支持 where sales.id=things.id 这样的连接操作! select * from sales.*,things.* from sales join things on (sales.id = things.id); 三种外连接:(左外,右外,全外) select * from sales.*.things.* from sales left outer jion things on (sales.id=things.id); select * from sales.*.things.* from sales right outer jion things on (sales.id=things.id); select * from sales.*.things.* from sales full outer jion things on (sales.id=things.id); 半连接: Hive不支持IN操作,但是可以使用left semi join 达到相同的效果:(sales表不能再select 后面出现,感觉类似exist了) select * from things left semi join sales on (sales.id=things.id); 指定map连接: 如果有一个连接表小到足以放入内存,Hive就可以把较小的表放入每个mapper的内存来执行连接操作。在Hive中需要使用注释来指定map连接: select /*+ MAPJOIN(things) */ sales.*,things.* from sales join things on (sales.id=things.id); 子查询: Hive只支持子查询出现在From子句中 select col1,col2 from (select * from records where ... ) a 视图:貌似和其他数据库中视图没啥区别,只是保存元数据,而不执行查询,不物化数据。 使用外部脚本: 使用Hadoop Streaming,TRANSFORM,MAP,REDUCE子句可以在Hive中调用外部脚本 ADD FILE /test.py; SELECT TRANSFORM(COL1,COL2,COL3) FROM TABLE USING 'test.py' AS COL1,COL2; --TRANSFORM(COL1,COL2,COL3) 表示查询本身将把col1,col2,col3作为以制表符分割的行的形式流式传递给脚本test.py FROM ( FROM table MAP col1,col2,col3 USING 'testmap.py' AS col1,col2) map_output REDUCE col1,col2 USING 'testreduce.py' AS col1,col2; 用户自定义函数(user-defined function,UDF) Hive有三种UDF:普通UDF,用户定义聚集函数UDAF,用户定义表生成函数UDTF。 UDF用户操作单个数据行,产生一个数据行作为输出,就像普通函数返回一个返回值; UDAF接受多个输入数据行,产生一个输出数据行,聚集函数好像都如此; UDTF作用于单个数据行,产生多个数据行(一个表)作为输出。 (不想写了~ 这几个鸟函数决定使用到了再来研究了!!!)OVER

优秀的个人博客,低调大师

云计算读书笔记(三)

Amazon云计算AWS 亚马逊的云是业界比较领先的云,主要包括弹性计算云EC2,简单存储服务S3,简单数据库服务Simple DB,简单队列服务SQS,弹性MapReduce服务,内容推送服务CloudFront,电子商务服务DevPay和FPS等。 基础存储架构:Dynamo Dynamo以简单的键值存储,不支持复杂的查询 架构的主要技术 1,数据均衡分布的问题 1)一致性哈希算法 (1)平衡性 (2)单调性 (3)分散性 (4)负载 2)采用的改进算法,引入虚拟结点的概念 3)数据备份 2,数据冲突问题 主要考虑三个因素:可靠性,可用性和一致性 3,容错机制 1)临时故障容错机制 2)永久性故障处理机制 4,成员资格及错误检测 弹性计算云EC2 是Amazon云计算环境的基本平台 主要特性: 1)灵活性 2)低成本 3)安全性 4)易用性 5)容错性 EC2的关键技术: 1)弹性块存储 2)地理区域和可用区域 3)EC2的通信机制 4)弹性负载均衡 5)监控服务 6)自动缩放 7)服务管理控制台 简单存储服务S3 s3是amazon推出的简单存储服务 s3是架构在Dynamo之上的 s3存储涉及的几个基本概念: 1)对象 是基本的存储单元,主要由两部分组成:数据和元数据 2)键 键是对象的唯一标识符 3)桶 桶是一个用来存储对象的容器 4)基本操作 基本操作包括:Get,Put,List,Delete和Head 简单队列服务SQS SQS是Amazon为了解决其云平台之间不同组件的通信而专门设计开发的。 SQS由三个基本部分组成:系统组件,队列和消息 简单数据库服务 Simple DB主要用于存储结构化的数据,并为这些数据提供基本的查找,删除等数据库功能 重要概念: 1)用户账户 2)域 3)条目 4)属性 5)值 关系数据库服务RDS RDS是一种云中的MySQL数据库系统,它采用集群的方式将MySQL移植到云中 内容推送服务CloudFront CloudFront实际上就是一个基于Amazon云计算平台实现的内容分发网络。通过Amazon部署在世界各地的边缘节点,用户可以快速,高效的由CloudFront提供服务的网站进行访问 云内容推送: 1,对象 2,源服务器 3,分发 4,别名指向 5,边缘节点位置 6,有效期 其它Amazon云计算服务 1)快速应用部署Elatic Beanstalk和服务模板CloudFormation 2)云中的DNS服务Router53 3)虚拟私有云VPC 4)简单通知服务SNS和简单邮件服务SES 5)弹性MapReduce服务 6)电子商务服务DevPay,FPS和Simple Pay 7)Amazon执行网络服务 8)土耳其机器人

资源下载

更多资源
Mario

Mario

马里奥是站在游戏界顶峰的超人气多面角色。马里奥靠吃蘑菇成长,特征是大鼻子、头戴帽子、身穿背带裤,还留着胡子。与他的双胞胎兄弟路易基一起,长年担任任天堂的招牌角色。

腾讯云软件源

腾讯云软件源

为解决软件依赖安装时官方源访问速度慢的问题,腾讯云为一些软件搭建了缓存服务。您可以通过使用腾讯云软件源站来提升依赖包的安装速度。为了方便用户自由搭建服务架构,目前腾讯云软件源站支持公网访问和内网访问。

Nacos

Nacos

Nacos /nɑ:kəʊs/ 是 Dynamic Naming and Configuration Service 的首字母简称,一个易于构建 AI Agent 应用的动态服务发现、配置管理和AI智能体管理平台。Nacos 致力于帮助您发现、配置和管理微服务及AI智能体应用。Nacos 提供了一组简单易用的特性集,帮助您快速实现动态服务发现、服务配置、服务元数据、流量管理。Nacos 帮助您更敏捷和容易地构建、交付和管理微服务平台。

Spring

Spring

Spring框架(Spring Framework)是由Rod Johnson于2002年提出的开源Java企业级应用框架,旨在通过使用JavaBean替代传统EJB实现方式降低企业级编程开发的复杂性。该框架基于简单性、可测试性和松耦合性设计理念,提供核心容器、应用上下文、数据访问集成等模块,支持整合Hibernate、Struts等第三方框架,其适用范围不仅限于服务器端开发,绝大多数Java应用均可从中受益。

用户登录
用户注册