Follow feeds: blogs, news, RSS and more. An effortless way to read and digest content of your choice.
Get Feederzmywly8866.github.io
Get the latest updates from 张明云的博客 directly as they happen.
Last updated almost 5 years ago
about 11 years ago
之前写过一篇博客汉字转拼音开源工具包Jpinyin介绍,介绍过JPinyin的使用,因为它实在是太方便了,在项目一直用它,但是最近在做项目的时候,发现使用了JPinyin的工程,在IDE中编译的APK能正常使用,但是APK被加密后再安装,使用JPinyin时会报汉字转拼音时读取数据失败,下面记录一下问题的解决过程。 加密后导致使用Jpinyin报异常的原因肯定是加密导致了Jpinyin中的某些内容变化导致(解密后数据不再是未加密前的数据了),为了跟踪这个问题,下载JPinyin的源码发现汉字转拼音是使用了三个“数据库”文件,分别是: chinese.db mutil_pinyin.db pinyin.db 起初我以为是数据被加密了,加密APK的时候相当于这些数据被再次加密导致了JPinyin不能正常使用,但是JPinyin中的代码是这样读取这三个文件的,读取文件的类为:PinyinResource.java package com.github.stuxuhai.jpinyin; import java.io.IOException; import java.io.InputStream;...
about 11 years ago
在做手写的过程中,使用双缓冲可以提高手写的效率,具体做法是将笔迹画在Bitmap上,在onDraw方法中显示Bitmap,而不是直接在onDraw方法中用canvas画。在采用这种机制做手写功能时,可以通过如下方式清除Bitmap上的笔迹内容: canvas.drawColor(Color.TRANSPARENT, PorterDuff.Mode.CLEAR);
about 11 years ago
测试应用的启动时间 adb shell am start -W packagename/activity,eg:adb shell am start -W com.tencent.mm/.ui.LauncherUI,显示的结果中,thisTime和totalTime的含义分别为:...
about 11 years ago
### 通过SharedPreferences实现进程间数据共享 之前为了解决应用的内存压力,在同一个应用中使用了多进程,但在程序自测的过程中发现不同进程之间的SharedPreferences数据不能共享,但应用内很多数据都是通过SharedPreferences来保存的,如果改成其它多进程通信的方式改动比较大。通过查看源码发现,在API Level>=11即Android 3.0可以通过Context.MODE_MULTI_PROCESS属性来实现SharedPreferences多进程共享,具体使用方式如下: public class PreferencesUtils { public static String...
about 11 years ago
通过软引用解决Handler内存泄露的问题 下面对软引用使用的方式适用于任何内部类,严格来说是通过软引用解决静态内部类无法调用当前类中的对象和方法的问题,真正解决内存泄露是需要将内部类改成静态内部类。 当在一个类中按照如下方式创建一个Handler内部类时,使用Lint工具检测时会给出“This Handler class should be static or leaks might occur”的警告,原因是Handler内部类可能持有当前类的引用,导致即使该类不再被使用时系统仍无法回收这给类持有的对象,Android中内存泄露很多都是由于持有类中的对象时间太长导致,如果很多地方出现类似的代码会导致应用占用的内存不断上涨,最终导致程序崩溃。...
almost 11 years ago
应用除了有内存占用、内存泄露、内存抖动等看不见的性能问题外,还有很多看得见的性能问题,比如进入界面慢、点击反应慢、页面卡顿等等,这些看得见的体验问题会严重影响用户使用APP心情,但用户的情绪又无法通过异常采集、数据分析来发现,尽早优化APP的性能体验问题非常重要,会在一定程度上提升用户的留存率。 本文结合最近一段时间对项目中APP各界面进入速度的优化,总结一下进入界面慢的优化方案。 先从Activity的生命周期说起 从一个界面FirstActivity跳转到另外一个界面SecondActivity,两个Activity的生命周期流程是这样的: 应用必须在走完FirstActivity的onPause方法后才会跑SecondActivity的onCreate方法,FirstActivity的onStop和onDestory方法不会影响到进入SecondActivity的速度。如果我们要优化从FirstActivity跳转到SecondActivity的速度,需要从FristActivity的onPause和SecondActivity的onCreate、onStart和onResume方法入手。onStart方法通常干的事情比较少,页面之间跳转慢主要是因为在FirstActivity的onPause和SecondActivity的onCreate、onResume方法耗时导致,这个过程需要执行的操作主要有: 保存FirstActivity界面中的一些状态; 加载SecondActivity的布局; 初始化SecondActivity。 针对上面的分析我们可以从如下四个方面入手: 耗时任务异步处理; 布局文件优化; 不可见视图需要时加载;...
almost 11 years ago
最近在项目中遇???一个关于调用AsyncTask的excute方法不能立即执行程序的问题,项目的targetSdkVersion是15,最后分析发现是AsyncTask的运行机制导致,特地总结出来以免后面再犯同样的错误。 通过源码分析AsyncTask的工作原理 AsyncTask官方文档解读 AsyncTask介绍 AsyncTask是一个Android SDK中轻量级的异步任务类,它在线程池中执行后台任务,把执行进度和执行结果返回给主线程,并在主线程更新UI,AsyncTask实质上是对Thread和Handler的封装,通过AsyncTask能够更方便地在执行后台任务的过程中和结束后实现更新UI操作。 AsyncTask的用法 AsyncTask是一个抽象类,它需要被实现后才能正常使用,子类必须要复写doInBackground方法,如果需要在执行完后台任务后更新UI,则需要实现onPostExecute方法,下面是一个AsyncTask使用实例: class DownloadFilesTask extends AsyncTask<URL,...
almost 11 years ago
主工程、依赖包、jar包、android.jar、Android Support Library的关系 一个Android工程通常包括主工程和依赖包,依赖包又有两种形式: 一种是单独的工程:在主工程中的配置文件指明主工程和依赖包的依赖关系之后,就可以在主工程中正常使用依赖包的类和接口了,这种适合于依赖包中有图片资源、so等不方便打包到jar包中的情况,比如Nine Old Androids、PullToRefresh、FancyCoverFlow等; 另一种是jar包:放在主工程的libs文件夹下,这种通常是依赖包中只有代码和可以打包到jar包中的文件,比如Fastjson.jar、Volley.jar、Gson.jar等。 为了程序能够编译通过和在设备中正常运行,主工程除了依赖第三方的工程和jar包之外,还需要依赖安卓系统本身的代码,也就是我们在sdk的每个版本中看到的android.jar,这里面集成了android的所有API,随着android sdk的升级,高版本的sdk中会增加很多新的API,比如ActionBar、Fragment、RecyclerView等,如果在低版本的sdk中需要使用高版本新增的API怎么办?不可能去更新移动设备中的android.jar吧,因为硬件设备集成的sdk版本是固定的,android.jar也是固定的,设备中的一些参数、硬件选型也是根据当前sdk版本来定的,所以最好的方式是将新增的API以依赖包的形式集成到需要使用高版本API的应用程序中。 谷歌早已经考虑到了这个问题,所以推出了一系列脱离于android.jar的依赖包,比如常见的android-support-v4.jar、appcompat-v7等。这些依赖包可以直接集成到应用程序中,依赖包有的是jar包,有的是独立的工程。命名的如下: jar包:...
almost 11 years ago
由于之前的项目太复杂,主要是考虑到JNI在AS上编译不方便,还要考虑到项目进度,最近才从Eclipse转到AS,主要方案是AS中只引用jar包和so,JNI的编译还是在Eclipse中进行。这过程中遇到过很多问题,记录下来方便后续查阅,本文中遇到的所有问题都是在Windows系统下。 assets文件的存放目录在”src/main/”目录下,和java、res文件夹平级; 引用libs文件夹中的so,需要在对应module下的build.gradle文件的android标签下加上如下属性: android { sourceSets { main { jniLibs.srcDirs = ['libs']...
almost 11 years ago
在Android library中不能使用switch-case语句访问资源ID:在Android library中不能使用switch-case语句访问资源ID的原因分析及解决方案 不能在Activity没有完全显示时显示PopupWindow和Dialog:popupwindow - Problems creating a Popup Window in Android...
almost 11 years ago
AS出来一年多了,最近才从Eclipse转到AS,但我并不觉得使用Eclipse有多落后,它们都只是一个工具而已,哪个顺手就用哪个,用得好都能提高生产力,不会合理利用,再好的工具也是惘然。很多使用Eclipse的Android程序员不知道代码重构的快捷键、如何在运行时调试、一个Workspace一大堆工程……,我想即使转到Android Studio也并不见得比Eclipse顺手。 下面将自己在Eclipse转AS过程中遇到的一些问题以及对各个问题的理解列出来,方便后续查阅。 1、问:Eclipse的工程如何导入到AS? 答:我的处理方式是在AS中新建工程,然后将Eclipse中对应工程的文件拷贝过来;当然也可以通过Eclipse将project导成gradle版本的,然后在AS中导入该工程。 2、问:对于Native层的代码,是如何处理的,在AS上如何编译JNI的代码? 答:AS上同样可以开发JNI,只不过配置脚本的过程比较麻烦,各个gradle版本,配置的方式有些不一样;我的处理方式是AS上只做java开发,JNI还是在Eclipse中开发,方便编译和调试; 3、问:在AS上开发会和Eclipse一样,卡吗? 答:会,卡不卡和你整个工作空间的复杂度有关,如果Eclipse的一个工作空间工程比较少,是不会卡的;AS也一样,如果AS的一个工作空间有太多工程,同样会很卡,特别是编译的时候; 4、问:AS存在启动慢的问题吗,有没有Eclipse那种初始化进度一直在0%的状态? 答:目前为止我还没有遇到过,即使一个工作空间有上十个工程。 5、问:AS编译比Eclipse或者ant编译快吗?...
almost 11 years ago
转眼已经工作了近五个年头。五年时间的积累可能不如一些刚工作一两年的小伙伴,但也可能不亚于一些工作年限更长的的前辈们,人与人本就不能相互比较,只要自己每年都在进步就好。对于我来说,在软件行业才算刚入门,今后有更长的路要走,还有很多要学习和沉淀的地方。 一 工作 今年在工作上算是非常踏实的一年,做了很多事情,把自己的一些想法沉淀在工作中,比如APK瘦身、持续集成、搭建属于自己团队的基础框架、Android应用性能优化、转AS等,有一些做得还不错,有些还需要进一步去实践。对应用性能的重点关注,也算是填了去年年终总结所说的重视用户体验的这个坑,性能优化是从技术层面来提升产品的用户体验。做这些事情算是今年最大的收获,因为不再只顾着知识的广度而很少深耕某一方面,只要有这个意识,没做好的事情可以明年继续努力。 闲暇时间逼着自己写了几篇专利,看了很多书,坚持每天看几篇技术文章,但还是玩手机的时间多。 二 机会 今年是不缺乏机会的一年,从年初到年末到处都是机会,猎头提供换工作的机会、出版社提供出书的机会、很多互联网公司提供工作机会、在线教育网站提供讲课、批改作业的机会、外包提供赚钱的机会……。 有些是自己没有抓住,比如外包,能力不够无法独自接手一个项目; 有些是争取过但最终放弃了,比如一些公司的邀请、讲课、写书,主要是感觉目前没有那个精力和实力去做这些事情,羽翼未丰,不能太过于膨胀,先踏实把工作做好再说; 有些只是尝试尝试,特意想受点打击,鞭策自己继续前进; 有些是纯碎扯淡,说是谈什么合作,就是想把你的文章搬到他的网站上去。...