首页 文章 精选 留言 我的

精选列表

搜索[网站开发],共10000篇文章
优秀的个人博客,低调大师

Android GIS开发系列-- 入门季(5) FeatureLayer加载本地shp文件与要素查询

FeatureLayer是要素图层,也是Arcgis的主要图层。用这个图层可以加载本地的shp文件。下面我们看怎样加载shp文件到MapView中。查看ArcGis API可知FeatureLayer的构造方法要传一个FeatureTable,而FeatureTable可用子类ShapefileFeatureTable来实现。代码如下,其中shpPath为shp文件的本地路径。\ privatevoidinitLayer(){ try{ featureLayer=newFeatureLayer(newShapefileFeatureTable( shpPath)); featureLayer.setRenderer(newSimpleRenderer(newSimpleFillSymbol( Color.GREEN))); mapView.addLayer(featureLayer); }catch(Exceptione){ e.printStackTrace(); } } 效果图如下。 这样就可以很简单地加载shp文件了。下面我们来学习一下FeatureLayer的查询。 一、FeatureLayer点击查询主要用到的方法是featureLayer.getFeatureIDs(float x, float y, int tolerance),方法与上一讲GraphicsLayer的查询差不多。可以获取每个要素的属性属性值。 privatevoidhandleSingleTap(floatx,floaty){ long[]featureIds=featureLayer.getFeatureIDs(x,y,8); if(featureIds!=null&&featureIds.length>0){ for(longid:featureIds){ com.esri.core.map.Featurefeature=featureLayer.getFeature(id); Map<String,Object>attrs=feature.getAttributes(); Set<Entry<String,Object>>setEntry=attrs.entrySet(); for(Entry<String,Object>entryItem:setEntry){ Log.e(TAG, entryItem.getKey()+"===="+entryItem.getValue()); } } } } 二、利用FeatureTable查询,这是FeatureLayer特别的地方。比如在一个shp文件中,有多个要素,我们知道有每个要素中有name这个属性,怎样快速查询name为shanghai的要素呢?要用到FeatureTable的queryFeatures(QueryParametersquery,CallbackListener<FeatureResult> callback)方法或者是queryIds(QueryParametersquery,CallbackListener<long[]> callback)这个方法。 privatevoidqueryTable(){ FeatureTablefeatureTable=featureLayer.getFeatureTable(); QueryParametersparameters=newQueryParameters(); //查询条件,有点像数据库中的查询 parameters.setWhere("name='shanghai'");<spanstyle="white-space:pre"></span>Future<long[]>queryIds=featureTable.queryIds(parameters,newCallbackListener<long[]>(){ @Override publicvoidonError(Throwablearg0){ //TODOAuto-generatedmethodstub } @Override publicvoidonCallback(long[]arg0){ //TODOAuto-generatedmethodstub } }); try{ long[]Ids=queryIds.get(); if(Ids!=null&&Ids.length>0){ for(inti=0;i<Ids.length;i++){ Featurefeature=featureLayer.getFeature(Ids[i]); Log.i(TAG,feature.getAttributes().get("name")+""); } } }catch(InterruptedExceptione){ e.printStackTrace(); }catch(ExecutionExceptione){ e.printStackTrace(); } 这样就可以快速查询到某个具体的要素。 Code for all 没有整理与归纳的知识,一文不值!高度概括与梳理的知识,才是自己真正的知识与技能。 永远不要让自己的自由、好奇、充满创造力的想法被现实的框架所束缚,让创造力自由成长吧! 多花时间,关心他(她)人,正如别人所关心你的。理想的腾飞与实现,没有别人的支持与帮助,是万万不能的。 本文转自wenglabs博客园博客,原文链接:http://www.cnblogs.com/arxive/p/7751880.html ,如需转载请自行联系原作者

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

ASP.NET企业开发框架IsLine FrameWork系列之三--七种武器

接上文 IsLine FrameWork Provider介绍 其中IsLine.Data、IsLine.AppLog是我要重点介绍的,不过现在先来简单说说各个Provider的作用。 DataProvider 与其他框架一样,DataProvider为项目提供了与数据库交互的能力,它的优点在这里不再阐述,这里只说一下它与其他框架的数据访问层不同的地方。 DataProvider同时兼容SQL SERVER与ORACLE两种数据库,并开放IDBOperater接口,用户只要实现IDBOperater接口工厂,就可以为DataProvider提供实例,从而实现使用第三种数据库,而无须修改数据库调用关键字。除此之外,DataProvider提供了静态访问与实例访问两种方式,针对不同的ADO.NET容器,用户可以选择不同的方式,而且提供统一的Dispose()方法,用户只需一次调用,即可关闭所有的Reader;而静态调用则不需对其做任何资源释放操作。静态访问与实例化访问是根据面向连接与非连接的工作方式区分的。 DataProvider还为用户提供了RecordProvider,通过它,用户可以方便 操作.config文件、文本文件、xml文件等。 DataProvider附带了数据容器选项:ContainerDefiner.cs,利用这个类的实例,用户可以直接调用各种ADO对象,并且容器对一些较大的数据对象进行缓存、压缩等优化,这些优化在存储时遵循“空间换时间”原则,在传输时遵循 “时间换空间”原则,前台业务性能会得到本质的提升! AppLogProvider AppLogProvider为用户提供了强大的日志记录功能,用户可以为程序中的每个“日志实例”提供单独的配置,每种配置有可以有不同的“Render”,每种Render代表可以使用不同的“Appender”,由Appender决定日志实例的重要等级、记录介质、记录格式、布局等属性。这一切用户可以通过配置完成,不许更改任何代码。换句话说,如果你原来的系统日志全都记录在文本文件中,现在希望将日志记录至SQL或ORACLE数据库,那么你唯一要做的事情就是更改配置,如果你非要把日志输出至电视机,那么你需要实现AppLogProvider派发的IappLogProvider接口即可实现。 如果你用过Log4Net,那么AppLogProvider你一定会很熟悉,只是AppLogProvider提供了更加灵活的配置方式。 ExceptionProcessProvider ExceptionProcessProvider为用户提供异常控制功能,它主要分为异常记录与异常显示两个模块。 异常记录模块是基于AppLogProvider的,用户可以通过传递Exception实例达到记录异常的目的;同时ExceptionProcessProvider支持用户自定义异常模型,这个模型可以与整个软件模型一起建立,通过实体异常模型(须继承自Exception)处理事件,并实现ExceptionProcessProvider派发的接口,从而实现异常记录的功能。异常显示模块是指异常发生时,对用户展示的通知信息,这些通知的形式在ExceptionProcessProvider被分为10种,用户仅通过配置就可以实现在这10种Style之间切换。 HttpContentProvider HttpContentProvider为用户提供了Cookie、Session、Cache的访问方法,用户通过配置文件,就可以控制这些状态量的属性,例如Cookie作用域、滑动时间,Cache的依赖方式(仅SQL SERVER)等。用户通过这些方法,可以方便建立、查询、删除、更新这些状态量。 IsLineFrameWork IsLineFrameWork是整体IsLine架构的核心,在架构被加载之前,IsLine.dll会对整个架构进行配置,完成定制任务。 SecurityProvider SecurityProvider为用户提供了加密与解密、强加密与解密的方法。这些加密措施为加密配置文件中的密码提供依据。 TaskQueueProvider TaskQueueProvider是一个服务队列,用户可以用它来注册已有的服务,TaskQueueProvider将根据服务节点元素,返回实例供用户使用,从而搭建企业应用的“场”模型。(什么是企业应用场?请参考企业应用系统(场)构建方案(上)和企业应用系统(场)构建方案(下)两篇文章) 图3.3 项目组成示意图 这里重点说明一下DataProvider和AppLogProvider,因为本论文中大量的应用到这两个Provider。 本文转自Aicken(李鸣)博客园博客,原文链接:http://www.cnblogs.com/isline/archive/2009/12/18/1626862.html,如需转载请自行联系原作者

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

iOS开发那些事-iOS应用本地化-资源文件本地化

资源文件包括:图片文件、音频文件以及前文提到的Localizable.strings等文件,它们的特点是都是随着应用一起打包发布。但就本地化而言无论是图片文件还是音频文件都必须实现的步骤都是类似的,因此我们重点介绍图片文件的本地化。 资源文件的本地化,也是需要准备好几个本地化版本的文件。图片需要本地化,就是要创建几个版本的本地化文件。例如,我们要实现一个游戏的控制画面,画面中有控制关闭或者打开背景音乐的按钮和音效按钮,它们是图片按钮,上面的文字是图片上的文字,因此需要图片的本地化的。 首先,英文版图片也要添加到工程中,在故事板MainStoryboard.storyboard文件中正常添加两个UIImageView选择对应的图片。然后为故事板添加本地化支持,这个过程请参考上一节内容。下面对图片进行本地化,选择背景按钮图片music_background.png文件,打开文件显示检查器,点击Localization中的“Make localized”按钮,在弹的对话框中选择英文,这样music_background.png文件就被移动到en.lproj目录下面了。 添加简体中文版还需要在文件显示检查器,点击Localization中勾选“Chinese”选项才可以,当勾选完成时候又复制music_background.png文件到zh-Hans.lproj目录下面了。 这样我们就可以运行一下看看效果了,但是有的时候在IB打开的故事板设计画面,往往出现中文版本和英文版本混乱情况,这是由于故事板加载的问题,其实没有什么问题,我们也可以重新打开工程。 本文转自 tony关东升 51CTO博客,原文链接:http://blog.51cto.com/tonyguan/1228680,如需转载请自行联系原作者

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

Android应用开发提高系列(2)——《Practical Java 中文版》读书笔记(下)

正文 注意:条目和用语可能与书籍有所出入,但尽量保持原样加一些自己的理解。 一、性能 1. 先把焦点放在设计、数据结构和算法身上 备注:良好的设计、明智的选择数据结构和算法可能比高效代码更重要。 2. 不要依赖编译器优化技术 3. 理解运行时(runtime)代码优化 备注:JIT将bytecode于运行时转换为本地二进制码,从而提高性能。因此编译后代码被执行次数越多,本机代码生成代价就很合算。 4. 连接字符串使用StringBuffer要比String快,尤其是大量字符串拼接 5. 将对象创建成本降至最小 备注:复用既有对象,不要创建非必要的对象,只在需要的时候才创建它们。 6. 将同步化(synchronization)降至最低 备注:如果synchronized函数抛出异常,则在异常离开函数之前,锁会自动释放。如果整个函数都需要被同步化,为了产生体积较小且执行速度较快的代码,请优先使用函数修饰符,而不是在函数内使用synchronized代码块。 7. 尽可能使用stack变量 备注:如果在函数中频繁访问成员变量、静态变量,可以用本地(local)变量替代,最后操作完后再赋值给成员/静态变量。 8. 尽可能的使用static、final和private函数 备注:此类函数可以在编译期间被静态决议(statically resolved),而不需要动态议决(dynamic resolved)。(子类无法覆写) 9. 类的成员变量、静态变量都有缺省值,务须重复初始化 备注:记住,本地变量没有缺省值(例如函数内定义的变量)。 10. 尽可能的使用基本数据类型 备注:如int、short、char、boolean,使得代码更快更小。 11. 不要使用枚举器(Enumeration)和迭代器(Iterator)来遍历Vector 备注:使用for循环+get() 12. 使用System.arraycopy()来复制数组 备注:使用System.arraycopy()代替for循环,可以产生更快的代码。如: public voidcopyArray( int[]src, int[]dest){ intsize=src.length; System.arraycopy(src,0,dest,0,size); } System.arraycopy()是以native method实现的,可以直接、高效的移动原始数组到目标数组,因此它执行速度更快。 13. 优先使用数组,然后才考虑Vector和ArrayList,理由: a). Vector的get()是同步的 b). ArrayList基本上就是一个非线程同步的Vector,比Vector要快 c). ArrayList和Vector添加元素或移除元素都需要重新整理数组。 备注:不要仅仅因为手上有个数不定的数据需要存储,就毫无选择的使用Vector或ArrayList。可以考虑创建一个足够大的数组,通常这样可能会浪费内存,但性能上的收益可能超过内存方面的代价。 14. 手工优化代码 a). 剔除空白函数和无用代码 b). 削减强度 备注:以更高效的操作替换成本昂贵的操作。一个常见的优化手法是使用复式复制操作符(如+=、-=)。 c). 合并常量 备注:将变量声明为final,使得操作在编译器就进行。 d). 删减相同的子表达式 备注:可用一个临时变量代替重复的表达式。 e). 展开循环 备注:如循环次数少且已知循环次数,可展开去掉循环结构,直接访问数组元素。缺点是会产生更多代码。 f). 简化代数 备注:使用数学技巧来简化表达式。(例如从1+..+100的问题) g). 搬移循环内的不变式 备注:循环内不变化的表达式可用移至循环外,不必重复计算表达式。 15. 编译为本机代码 备注:将程序的某部分编译为本机二进制代码,然后通过JNI访问。 二、多线程 1. 对于实例(instance)函数,同步机制锁定的是对象,而不是函数和代码块。 备注:函数或代码块被声明为synchronized并非意味它在同一时刻只能有一个线程执行(同一对象不同线程调用会阻塞)。Java语言不允许将构造函数声明为synchronized。 2. 同步实例函数和同步静态函数争取的是不同的locks。 备注:两者均非多线程安全,可以使用实例变量进行同步控制,如(byte[] lock = new byte[0]),比其他任何对象都经济。 3. 对于synchronized函数中可被修改的数据,应使之成为private,并根据需要提供访问函数。如果访问函数返回的是可变对象,那么可以先克隆该对象。 4. 避免无谓的同步控制 备注:过度的同步控制可能导致代码死锁或执行缓慢。再次提醒,当一个函数声明为synchronized,所获得的lock是隶属于调用此函数的那个对象。 5. 访问共享变量时请使用synchronized或volatile 备注:如果并发性很重要,而且不需要更新很多变量,则可以考虑使用volatile。一旦变量被声明为volatile,在每次访问它们时,它们就与主内存进行一致化。如果使用synchronized,只在取得lock和释放lock时候才一致化。 6. 在单一操作(single operation)中锁定所有用到的对象 备注:如果某个同步函数调用了某个非同步实例函数来修改对象,它是线程安全的。使用同步控制时,一定要对关键字synchronized所作所为牢记在心。它锁定的是对象而非函数或代码。 7. 以固定而全局性的顺序取得多个locks(机制)以避免死锁。P/181~P/185 备注:嵌入[锁定顺序]需要额外的一些工作、内存和执行时间。 8. 优先使用notifyAll()而非notify() 备注:notify()和notifyAll()用以唤醒处以等待状态的线程,waite()则让线程进入等待状态。notify()仅仅唤醒一个线程。 9. 针对wait()和notifyAll()使用旋转锁(spin locks) 备注:旋转锁模式(spin-lock pattern)简洁、廉价,而且能确保等待着某个条件变量的代码能循规蹈矩。 10. 使用wait()和notifyAll()替代轮询(polling loops) 备注:调用wait()时会释放同步对象锁,暂停(虚悬,suspend)此线程。被暂停的线程不会占用CPU时间,直到被唤醒。如: public voidrun() { intdata; while( true){ synchronized(pipe){ while((data=pipe.getDate())==0){ try{ pipe.waite(); } catch(InterruptedExceptione){} } } // ProcessData } } 11. 不要对已锁定对象的对象引用重新赋值。 12. 不要调用stop()和suspend() 备注:stop()中止一个线程时,会释放线程持有的所有locks,有搅乱内部数据的风险;suspend()暂时悬挂起一个线程,但不会释放持有的locks,可能带来死锁的风险。两种都会引发不可预测的行为和不正确的行为。 当线程的run()结束时,线程就中止了运行。可以用轮询+变量来控制,如下代码: private volatile booleanstop; public voidstopThread() { stop= true; } public voidrun() { while(!stop){ // ProcessData } } 注意:这里使用了关键字volatile,由于Java允许线程在其 私有专用内存 中保留主内存变量的副本(可以优化),线程1对线程2调用了stopThread(),但线程2可能不会及时察觉到stop主内存变量已变化,导致不能及时中止线程。 三、类与接口 1. 实现一个final类(immutable class 不可变类)时,请遵循下列规则: a). 声明所有数据为private b). 只提供取值函数(getter),不提供赋值函数(setter) c). 在构造函数中设置有实例数据 d). 如果函数返回、接受引用final对象,请克隆这个对象。 e). 区别浅层拷贝和深层拷贝应用场景。如拷贝Vector需要使用深层拷贝。 2. 实现clone()时记得调用super.clone() 备注:不管是浅层拷贝还是深层拷贝都需要调用super.clone()。 3. 别只依赖finalize()清理内存以外的资源 备注:finalize()函数只有在垃圾回收器释放对象占用的空间之前才会被调用,回收时可能并非所有符合回收条件的对象都被回收,也无法保证是否被调用、何时调用。实现finalize()方法时记得调用super.finalize()。 4. 在构造函数内应避免调用非final函数,以免被覆写而改变初衷。 结束 书是从朋友那边借过来的,拿到手也有一段时间,磨磨唧唧好多天才看了几十页,而余下部分从上篇文章到这篇文章也不过才3-5天。发现以这种方式来看书也不错,一方面能加快速度,一方面由于要写文章更加认真细读,还能提炼把书读薄记录分享出来,实在是很适合我这样的 :) 本文转自over140 51CTO博客,原文链接:http://blog.51cto.com/over140/844924,如需转载请自行联系原作者

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

iOS开发--使用lipo命令制作模拟器与真机通用静态库

通常在项目中使用静态库的时候都会有两个版本,一个用于模拟器,一个用于真机,因为Mac和iPhone的CPU不同,才造成了这种情况。 为了模拟器与真机之间切换调试的方便,制作通用版本非常有必要。 现在有两个版本的静态库libSQLite_i386.a(模拟器)与libSQLite_arm.a(真机)。 1、打开终端,进入到这两个文件所在的目录; 2、执行:lipo -create libSQLite_i386.a libSQLite_arm.a -output libSQLite.a,这时文件就会多出libSQLite.a,这个文件即为通用静态库。 我们可以lipo -infolibSQLite.a命令,查看是否是通用的。 可以发现libSQLite.a的大小为libSQLite_i386.a与libSQLite_arm.a之和,建议发布的时候将静态库替换成真机版。 欢迎加群互相学习,共同进步。QQ群:iOS: 58099570 | Android: 572064792 | Nodejs:329118122 做人要厚道,转载请注明出处! 本文转自张昺华-sky博客园博客,原文链接:http://www.cnblogs.com/sunshine-anycall/p/3439974.html ,如需转载请自行联系原作者

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

Android UI开发第二十二篇——android 瀑布流图片实现

自pinterest使用了瀑布流展示图片后,有很多应用开始使用瀑布流的方式,像蘑菇街,美丽说。这里的瀑布流实现使用了开源代码。 layout: <?xml version="1.0" encoding="utf-8"?> <com.dodowaterfall.LazyScrollView xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="fill_parent" android:layout_height="fill_parent" android:id="@+id/waterfall_scroll" android:scrollbars="vertical" > <LinearLayout android:id="@+id/waterfall_container" android:layout_width="fill_parent" android:layout_height="fill_parent" android:background="@android:color/white" > </LinearLayout> </com.dodowaterfall.LazyScrollView> 整个瀑布流用的是ScrollView的子类LazyScrollView。这个LazyScrollView中设置了一个监听器接口,用来监听ScrollView执行的不同阶段。接口如下: public interface OnScrollListener { void onBottom(); void onTop(); void onScroll(); void onAutoScroll(int l, int t, int oldl, int oldt); } 对于每一幅图,都用一个ImageView的子类FlowView来表示。 为了不阻塞UI线程,图片加载和图片更新都分别用不同的线程来做。这两个线程都在FlowView中。FlowView提供了加载和更新的接口给Activity调用。 瀑布流实例的主Activity是MainActivity,常量都保存在Constants类中,方便维护。 瀑布流最重要的是图片的内存回收机制,防止发生内存溢出的情况(OOM)。 参考: https://github.com/dodola/android_waterfall http://developer.android.com/training/displaying-bitmaps/process-bitmap.html 本文转自xyz_lmn51CTO博客,原文链接:http://blog.51cto.com/xyzlmn/1230768,如需转载请自行联系原作者

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

【Android游戏开发之十】(优化处理)详细剖析Android Traceview 效率检视工具

什么是TraceView?先看下百度出来的解释吧: Traceview是android平台配备一个很好的性能分析的工具。它可以通过图形化的方式让我们了解我们要跟踪的程序的性能,并且能具体到method。 关于Traceview的使用 首先,必须在程序当中加入代码,以便生成trace文件,有了这个trace文件才可以将其转化为图形。 要添加的代码如下: Java代码 // start tracing to "/sdcard/yourActivityTrace.trace" Debug.startMethodTracing("yourActivityTrace"); // ... // stop tracing Debug.stopMethodTracing(); // start tracing to "/sdcard/yourActivityTrace.trace" Debug.startMethodTracing("yourActivityTrace"); // ... // stop tracing Debug.stopMethodTracing(); Google Dev Guide当中说可以在activity的onCreate()中添加Debug.startMethodTracing(), 而在onDestroy()中添加Debug.stopMethodTracing(),但是在实际的测试时发现这种方式其实并不好用,因为通常情况下我们的activity的onDestroy()是由系统决定何时调用的,因此可能等了很长时间都不会得到这个trace文件。因此决定在onStop()中来调用Debug.stopMethodTracing()。这样当我们切换到其它activity或者点击home键的时候onStop()就会被调用,我们也就可以得到完整的trace file。 在运行程序之前,首先要保证我们的AVD是一个带有SD card的AVD,这样才能使trace文件保存到/sdcard/...当中。运行后可以任意做一些操作,然后点击home键。这是通过DDMS file explore就可以看到/sdcard/目录下有一个trace文件,现在把这个文件copy到电脑上指定的目录,假设是C:/tracefile 目录下。 可以通过命令行来执行traceview,进入tools目录后,执行 traceview C:/tracefile/yourActivityTrace.trace 之后就可以看到图形了,接下来就是按照Google Dev Guide中的解释去分析图形就OK了。 下面来看如何实现以及需要注意的地方: 实现的步骤分为三步:1.必须先在我们的模拟器中创建sdCard ;2.将我们的调试代码嵌入工程;3.利用TraceView来观察和分析代码情况; 1.对于创建模拟器的sdCard这里写出两种方式: 第一种:我们在eclipse中创建avd的时候的时候 在选择api下面有个 Sd Card 的选项,第一项填入创建sdcard的大小即可。 第二种:cmd 命令! 打开cmd 并且cd 到android sdk tool 路径下;(或者在环境变量Path中将sdk tool路径配置上,然后重新打开cmd) 使用mksdcard -l mycard 1024M F:/mysdcard.img创建了一个1G的sdcard; 使用emulator -avd my_android -sdcard F:/mysdcard.img激活sdcard! 最后在eclipse Preferences-->Android-->Launch加入-sdcardF:/mysdcard.img (此步骤就是在第一种创建方式中添加sdcard的支持) 备注1: 如果sdcard分配的空间太小,则程序追踪文件就一直记录到sd储蓄卡容量慢为止,所以调试前,要为程序生成一个适当的SD存储卡也较为重要,因为程序运行时间越长,这个追踪文件也就越大。 备注2; (如果第二种创建方式中的第二部激活出现 emulator: ERROR: the user data image is used by another emulator. aborting,请关闭模拟器,或者进入目录:/Documents and Settings / 用户 / .android /的AVD / *设备* / (比如我的目录是:C:/Documents and Settings/Administrator/.android/avd/android2.0.avd)然后删去以.lock结尾的文件夹就行(我简单解释下为什么要删除这些文件呢,其实.lock是加锁,如果程序崩溃等原因导致无法清除这些以.lock结尾的文件夹,就会出现这个问题,也就是这个avd的锁没有被释放,导致avd manager以为这个avd正在使用当中。)) 2.将我们的调试代码嵌入工程 正如我们百度到的说明一样,在程序运行的开端加上 Debug.startMethodTracing("yourActivityTrace"); 然后在onPause()中调用Debug.stopMethodTracing(); 为什么要将结束写在onPause()中而不写在onStop(),那么如果你去看api的话,你会看到,Api中介绍onPause()会在你返回和点击home按键后触发,而onStop()一般是由系统来触发,当该程序处于后台的时候,而且当内存紧张的时候,可能会调用,但是可能永远不会调用到! 备注:要记住当把调试代码加入项目中以后不要立即运行项目,而是必须在AndroidMainfest.xml中定义一条"写入SD卡的权限"那么添加权限的代码如下: <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"></uses-permission> 因为咱们的调试代码会在SD卡中生成一个追踪文件,也就是往SD卡中写入了数据,所以需要声明一条权限。这里必须注意哦! <?xmlversion="1.0"encoding="utf-8"?> <manifestxmlns:android="http://schemas.android.com/apk/res/android" package="com.himi" android:versionCode="1" android:versionName="1.0"> <applicationandroid:icon="@drawable/icon"android:label="@string/app_name"> <activityandroid:name=".MainActivity" android:label="@string/app_name"> <intent-filter> <actionandroid:name="android.intent.action.MAIN"/> <categoryandroid:name="android.intent.category.LAUNCHER"/> </intent-filter> </activity> </application> <uses-permissionandroid:name="android.permission.WRITE_EXTERNAL_STORAGE"></uses-permission> <uses-sdkandroid:minSdkVersion="4"/> </manifest> 3.运行项目并且退出项目从而得到的追踪文件,利用TraceView来进行分析代码运行状况: 打当正常运行了项目并且点击返回或者home按键就会在 sdcard中生成一个.trace的文件。sdcard 目录 在eclipse下,点击: windows-show view-other-android-File explorer 右上角的两个箭头,第一个表示从模拟器sdcard导出文件,第二个表示从PC上导入文件到sdcard中、“—”代表删除 ..... 然后我们通过cmd来运行生成的追踪文件traceview C:/name追踪文件所在的路径放在C盘,放在C盘以外别的盘的话我这里是无法正常打开traceview的不知道什么原因。 name 表示生成的.trace文件,cmd的时候不需要输入“.trace”后缀 ;然后会出现TraceView的分析窗口; 【cmd 命令! 打开cmd 并且cd 到android sdk tools 路径下;(或者在环境变量Path中将sdk tool路径配置上,然后重新打开cmd)】 注意1:如果出现一下图片这种内存溢出的问题; 解决方法:到SDK 下的tools 下 找到 traceview.bat 文件,鼠标右键-编辑(或者记事本打开),最后一行替换成这样: call java -Xms128m -Xmx512m -Djava.ext.dirs=%javaextdirs% -jar %jarpath% %* 注意2:如果出现路径不对的问题: 例如:我的 himi.trace 放在了C盘,那么我的cmd命令是: traceview c:/himi 然后回车! 但是这里要小心,因为 /h 这样可能被认为是转义字符!!!为了避免可以尽可能不要使用h,n,r,t,等等成为名字的头字母,当然还有一种就可以完全避免这种问题,例如还是我的C盘 himi.trace 文件,可以写cmd命令的时候写成: traceview c://himi 嘿嘿~要注意细节。 下面是运行起来的TranceView: 最右上角表示运行程序总共用了多少时间,从traceview画面中我们看到有各种颜色,每种颜色代表不同的函数和步骤,那么同一颜色的区域越大,就代表这个步骤运行时间越长,或者看到下面的统计表,明显可以看出除了序列 0 1 是系统函数外,2. 3.函数 占用的时间比较长,那么序列4是个自定义的函数名为 “hot”这个占用了几乎与主线程 主draw的时间一样了,那么肯定有问题。当然其实这个方法是我故意写的,就是为了来演示traceview。这个hot函数的代码如下: /** * @author Himi * @param canvas */ public void hot(Canvas canvas) { for (inti=1; i<100; i++) { Bitmapbmp=BitmapFactory.decodeResource(getResources(), R.drawable.icon); canvas.drawBitmap(bmp, i += 2, i += 2, paint); } } 很明显我在故意消耗内存和时间。 那么,在traceview的右半部统计字段中: Exclusive: 同级函数本身运行的时间 Inclusive 就是说除统计函数本身运行的时间外再加上调用子函数所运行的时间 Name:列出的是所有的调用项,前面的数字是编号,展开可以看到有的有Parent 和Children子项,就是指被调用和调用。 Incl: inclusive时间占总时间的白分比 Excl: 执行占总时间的白分比。 Calls+Recur Calls/Total: 调用和重复调用的次数 Time/Call: 总的时间。(ms) 所以traceview是个非常好的程序监视工具,可以帮助找出程序运行缓慢时的函数,让我们的代码不断完善和改进! 本文转自 xiaominghimi 51CTO博客,原文链接:http://blog.51cto.com/xiaominghimi/606325,如需转载请自行联系原作者

资源下载

更多资源
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应用均可从中受益。

Rocky Linux

Rocky Linux

Rocky Linux(中文名:洛基)是由Gregory Kurtzer于2020年12月发起的企业级Linux发行版,作为CentOS稳定版停止维护后与RHEL(Red Hat Enterprise Linux)完全兼容的开源替代方案,由社区拥有并管理,支持x86_64、aarch64等架构。其通过重新编译RHEL源代码提供长期稳定性,采用模块化包装和SELinux安全架构,默认包含GNOME桌面环境及XFS文件系统,支持十年生命周期更新。

WebStorm

WebStorm

WebStorm 是jetbrains公司旗下一款JavaScript 开发工具。目前已经被广大中国JS开发者誉为“Web前端开发神器”、“最强大的HTML5编辑器”、“最智能的JavaScript IDE”等。与IntelliJ IDEA同源,继承了IntelliJ IDEA强大的JS部分的功能。

用户登录
用户注册