Android多点触控在本质上需要LCD驱动和程序本身设计上支持,目前市面上HTC、Motorola和Samsung等知名厂商只要使用电容屏触控原理的手机均可以支持多点触控Multitouch技术,对于网页缩放、手势操作上有更好的用户体验。 在Android平台上事件均使用了MotionEvent对象方式处理,比如开始触控时会触发ACTION_DOWN而移动操作时为ACTION_MOVE最终放开手指时触发ACTION_UP事件。当然还有用户无规则的操作可能触发ACTION_CANCEL这个动作。 首先Android开发网提醒大家多点触控需要LCD驱动和应用软件两个支持才能实现,所以部分比较老的,比如Android 2.1以前或在北美上市的手机可能无法支持多点触控在固件上,由于Apple专利原因在欧洲和亚太地区的Android 2.1以后的新款机型固件均已经在屏幕驱动中支持,同时模拟器也无法实现多点触控的测试。 下面Android123一起用Android 2.0或以上SDK中的方法来实现如何通过应用层支持多点触控操作,对于常规的控件触控操作在内部为View的setOnTouchListener()接口实现的onTouchEvent()方法来处理。对于onTouchEvent方法的参数MotionEvent我们可以详细处理来实现对多点触控的了解,比如 event.getAction() //获取触控动作比如ACTION_DOWN event.getPointerCount(); //获取触控点的数量,比如2则可能是两个手指同时按压屏幕 event.getPointerId(nID); //对于每个触控的点的细节,我们可以通过一个循环执行getPointerId方法获取索引 event.getX(nID); //获取第nID个触控点的x位置 event.getY(nID); //获取第nID个点触控的y位置 event.getPressure(nID); //LCD可以感应出用户的手指压力,当然具体的级别由驱动和物理硬件决定的 event.getDownTime() //按下开始时间 event.getEventTime() // 事件结束时间 event.getEventTime()-event.getDownTime()); //总共按下时花费时间 有关Android多点触控的更详细技术由于目前兼容性和固件问题android123将会在以后的内容中详细讨论,这里给大家起到抛砖引玉的作用。
图160S
android.os.Debug调试工具使用方法 Android开发技术
在Android软件开发中最终的性能测试和调试显得至观重要,今天Android123和大家一起讨论下Google送给我们的android.os.Debug类,使用起来比较简单,我们先导入 import android.os.Debug这个包。 在需要开始跟踪的地方加入 Debug.startMethodTracing(“/sdcard/cwj”); 最终在停止调试的地方加入 Debug.stopMethodTracing(); 最终在sdcard上生成的cwj文件我们可以用sdk\tools中的traceview来查看运行的结果。
Android Drawable叠加处理方法 Android开发技术
大家可能知道Bitmap的叠加处理在Android平台中可以通过Canvas一层一层的画就行了,而Drawable中如何处理呢? 除了使用BitmapDrawable的getBitmap方法将Drawable转换为Bitmap外,今天Android123给大家说下好用简单的LayerDrawable类,LayerDrawable顾名思义就是层图形对象。下面直接用一个简单的代码表示: Bitmap bm = BitmapFactory.decodeResource(getResources(),R.drawable.cwj); Drawable[] array = new Drawable[3]; array[0] = new PaintDrawable(Color.BLACK); //黑色 array[1] = new PaintDrawable(Color.WHITE); //白色 array[2] = new BitmapDrawable(bm); //位图资源 LayerDrawable ld = new LayerDrawable(array); //参数为上面的Drawable数组 ld.setLayerInset(1, 1, 1, 1, 1); //第一个参数1代表数组的第二个元素,为白色 ld.setLayerInset(2, 2, 2, 2, 2); //第一个参数2代表数组的第三个元素,为位图资源 mImageView.setImageDrawable(ld); 上面的方法中LayerDrawable是关键,Android开发网提示setLayerInset方法原型为public void setLayerInset (int index, int […]
AsyncTask对比Thread加Handler Android开发技术
很多网友可能发现Android平台很多应用使用的都是AsyncTask,而并非Thread和Handler去更新UI,这里Android123给大家说下他们到底有什么区别,我们平时应该使用哪种解决方案。从Android 1.5开始系统将AsyncTask引入到android.os包中,过去在很早1.1和1.0 SDK时其实官方将其命名为UserTask,其内部是JDK 1.5开始新增的concurrent库,做过J2EE的网友可能明白并发库效率和强大性,比Java原始的Thread更灵活和强大,但对于轻量级的使用更为占用系统资源。Thread是Java早期为实现多线程而设计的,比较简单不支持concurrent中很多特性在同步和线程池类中需要自己去实现很多的东西,对于分布式应用来说更需要自己写调度代码,而为了Android UI的刷新Google引入了Handler和Looper机制,它们均基于消息实现,有事可能消息队列阻塞或其他原因无法准确的使用。 Android开发网推荐大家使用AsyncTask代替Thread+Handler的方式,不仅调用上更为简单,经过实测更可靠一些,Google在Browser中大量使用了异步任务作为处理耗时的I/O操作,比如下载文件、读写数据库等等,它们在本质上都离不开消息,但是AsyncTask相比Thread加Handler更为可靠,更易于维护,但AsyncTask缺点也是有的比如一旦线程开启即dobackground方法执行后无法给线程发送消息,仅能通过预先设置好的标记来控制逻辑,当然可以通过线程的挂起等待标志位的改变来通讯,对于某些应用Thread和Handler以及Looper可能更灵活。
Android多人项目开发指导 Android开发技术
很多新的公司招聘了多个开发人员一起完成自己的Android项目开发,这里Android123就分工和开发模式以及部分实现细节给大家说下大概的多人开发分配。 1. 很多公司可能需要一个CAO架构出项目的各个细节用UML图表示,参照传统的开发模式可能类似于一些人写公共代码,比如I/O、相关的文件系统、数据库、网络通讯,部分完成UI相关的控件子类化和一部分的核心功能实现,这里更类似于MVC来实现所有的细节。 2. 目前就常规的中小型项目而言,使用SVN管理项目更清晰明了,公司已经假设好SVN服务器来管理整个项目的代码。 3. 模块的分工,这里我们给大家一些典型的方法,比如package名上使用类似 provider、util、data、view、model,由不同的人负责完成。 4. 项目的性能测试,对于Android开发要比iPhone麻烦的多,由于设备的性能、分辨率和固件的差异,可能导致软件运行的异常,这里我们推荐大家使用官方原版固件进行测试,第三方的固件存在很多类似“优化”这样的情况,可能对于软件的调试产生了很多的问题,同时手机尽量干净,后台不要运行太多任务,观察内存和CPU的执行,这里参考android.os.Debug和traceview的使用方法。 5. 异常处理,很多情况软件可能遇到Force Close的尴尬情况,FC和ANR的出现大大降低了用户体验,这里我们可能通过对代码更多的try和catch来防止OOM或Thread同步导致的问题。 6. 发布测试,对于软件发布时还要考虑用户体验度,删除不必要的permission,不要让用户感觉一个手电筒软件就有发送短信和拨打电话以及访问联系人的权限出现,同时尽量不要包含广告客户端,广告客户端可能是导致用户泄露隐私,影响系统运行效率,占用GPRS或3G上网流量等问题,对于靠广告作为盈利模式的软件可以目前考虑放弃或者说不适合竞争。 对于常规的中小型项目而言,遵循以上6点可以应付90%的问题,当然还有10%可能是长期的维护,分析用户的反馈和评论以及细节的调整问题,总而言之要考虑用户的感受,做软件要迎合不同年龄和人群,比如很多软件对于MM或非IT类人士可能不理解如何使用的,可以考虑推迟等等。
Android缩略图类源代码 Android开发技术
Android 2.2开始新增的缩略图类ThumbnailUtils的主要方法是静态的,对于Android 2.2或API Level8以下的工程可以直接使用,本类相对于我们常规的缩略图类考虑更周全,除了尺寸比例优化外,针对OOM的内存管理方面有更周全的处理方式,完整代码如下,使用方法和介绍请查看 ThumbnailUtils – Android2.2新增类 一文 public class ThumbnailUtils { private static final String TAG = "ThumbnailUtils"; /* Maximum pixels size for created bitmap. */ private static final int MAX_NUM_PIXELS_THUMBNAIL = 512 * 384; private static final int MAX_NUM_PIXELS_MICRO_THUMBNAIL = 128 * 128; private static final int UNCONSTRAINED = -1; /* […]
WordPress 技巧:使用内存缓存提高 Postviews 效率
使用 WP-Postview 插件进行日志浏览数统计的时候,会有个问题,就是每个页面会多出三个 SQL 查询。这样每次浏览日志都会多出三次查询,对数据库其实是一次蛮大的负担,有没有办法解决这个问题呢?如果你和我一样网站启用了 Memcached 这类内存缓存组件的话,我们可以把日志的流量缓存到内存中,每次增加10次浏览才写入数据库中去。 <?php /* Plugin Name: WPJAM Memcached PostView Plugin URI: http://blog.wpjam.com/m/memcached-postviews/ Description: 使用内存缓存提高 WP-Postviews 效率 Version: 0.1 Author: Denis Author URI: http://blog.wpjam.com/ */ add_action('init','wpjam_postviews'); function wpjam_postviews(){ if(function_exists('the_views')){ //已经安装了 postview 插件 global $wp_object_cache; if(isset($wp_object_cache->mc) && $wp_object_cache->mc){ //已经安装了 memcached 插件 add_filter('update_post_metadata','wpjam_postviews_update_post_metadata',10,5); function wpjam_postviews_update_post_metadata($check, $object_id, $meta_key, $meta_value, $prev_value ){ if($meta_key == 'views'){ […]
WordPress 技巧:删除 wp_head 中无关紧要的代码
WordPress 通过 wp_head() 在页面的头部输出了很多东西,但是这些标签很多是没用的,虽然这些代码也没有什么副作用,但是个人更喜欢保持一个简洁的 header。 所以这篇日志将教你如何移除 header 中的下面几个标签,你可以根据自己的需求选择移除: Really Simple Discovery (RSD) link Windows Live Writer link WordPress generator 信息 和日志相关的 Link Really Simple Discovery 输出代码如下: <link rel="EditURI" type="application/rsd+xml" title="RSD" href="http://example.com/xmlrpc.php?rsd" /> 这是 XML-RPC 客户端发现机制需要用到的,如果你不知道这个是什么意思,或者没有集成类似 Flickr 这类服务到你的站点,那么你可以安全的移除它: remove_action('wp_head', 'rsd_link'); Windows Live Writer 输出代码如下: <link rel="wlwmanifest" type="application/wlwmanifest+xml" href="http://example.com/wp-includes/wlwmanifest.xml" /> 如果你没有使用 Windows Live Writer 来写日志,那就移除它吧: remove_action('wp_head', 'wlwmanifest_link'); […]
WordPress 技巧:在 RSS Feed 中输出文章版权信息
有很多垃圾站点等,通过你博客的 RSS Feed 来抓去你的文章显示在他们的网站上。但是我们又不能轻易的 禁用 WordPress 的 RSS Feed 功能,毕竟还是有很多用户去用 RSS 订阅你的博客。 如此,我们可以自动在 RSS Feed 输出文章的时候,自动在后面加上一些版权信息、原文作者、原文地址等等信息,也可以是一些其他自定义的信息(你懂)。很简单的几句代码就可以实现这个功能: function wpjam_add_feed_content($content) { if(is_feed()) { $content .= '<p>本文版权所有 '.bloginfo('name').' 转载请务必保留版权信息。</p>'; } return $content; } add_filter('the_excerpt_rss', 'add_feed_content'); add_filter('the_content', 'add_feed_content'); 作为演示,我只输出了一句很简单的话,使用 bloginfo 函数输出你博客的网站名称,你可以按照自己的需求修改这里要输出的内容。 标签:WordPress 技巧

WordPress 推出 10 周年纪念T恤
真快,WordPress 已经快有10年了,我从06年开始用,也差不多7年了。为了纪念即将到来的 WordPress 十周年庆典活动,WordPress 专门制作了一个特殊的十周年纪念T恤,将以成本价销售,每件 10 美元加运费,直到 5月27日的纪念日,4月29日开始发货。 购买地址:http://hellomerch.com/collections/wordpress/products/wordpress-10th-anniversary-t-shirt Binaryoung 正在组织团购,有兴趣的同学,请猛击这里:http://bbs.wpjam.com/topic/159/ 购买地址:http://hellomerch.com/collections/wordpress/products/wordpress-10th-anniversary-t-shirt
intent调用代码总结二 Android开发技术
很多网友在看完inent调用代码总结后再次贡献出很多实用的方法,这里Android123总结出剩余的一些,当然熟悉Intent机制的网友可能发现无非就是对Action和Category和Type加上附加的类型,程序通过UriMatch或Intent-filter进行判断来处理,原理比较简单这里Android开发网给出一些新的,代码如下: 进入联系人界面 Intent intent = new Intent();intent.setAction(Intent.ACTION_VIEW);intent.setData(People.CONTENT_URI);startActivity(intent); 查看某个联系人,当然这里是ACTION_VIEW,如果为选择并返回action改为ACTION_PICK,当然处理intent时返回需要用到startActivityforResult Uri personUri = ContentUris.withAppendedId(People.CONTENT_URI, ID);//最后的ID参数为联系人Provider中的数据库BaseID,即哪一行 Intent intent = new Intent(); intent.setAction(Intent.ACTION_VIEW); intent.setData(personUri);startActivity(intent); 选择一个图片 Intent intent = new Intent(Intent.ACTION_GET_CONTENT); intent.addCategory(Intent.CATEGORY_OPENABLE); intent.setType("image/*");startActivityForResult(intent, 0); 调用Android设备的照相机,并设置拍照后存放位置 Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE); intent.putExtra(MediaStore.EXTRA_OUTPUT, Uri.fromFile(new File(Environment.getExternalStorageDirectory().getAbsolutePath()+"/cwj", android123 + ".jpg"))); //存放位置为sdcard卡上cwj文件夹,文件名为android123.jpg格式startActivityForResult(intent, 0); 搜索指定package name在market上,比如搜索com.android123.cwj的写法如下 Uri uri = Uri.parse("market://search?q=pname:com.android123.cwj"); Intent intent = new Intent(Intent.ACTION_VIEW, uri); startActivity(intent);
反射在Android开发中的利弊 Android开发技术
由于Android 2.2的推出,很多新的API加入导致很多项目移植需要考虑使用Java的反射机制Reflection来动态调用,动态调用的好处就是不需要使用引用文件,直接通过JDK中声明好的方法直接调用,本身原理基于JVM的,从Java 1.5开始支持,原理上就是根据类名而不实例化对象的情况下,获得对象的方法或属性而直接调用。 Android开发时反射能帮助我们多少? 1. 有些网友可能发现Android的SDK比较封闭,很多敏感的方法常规的用户无法编译,我们如果翻看了代码直接在反射中声明动态调用即可。比如很多internal或I开头的AIDL接口均可以通过反射轻松调用。 2. 反射对于Android123来说更重要的是考虑到应用的兼容性,我们目前主要兼容从Android 1.5到2.2的项目,API Level从3到8可以方便的扩充,调用前我们预留一个标志位声明该API的最低以及最高的API Level为多少可以调用。 3. 对于调试Java的反射是功臣了,在Logcat中我们可以看到出错的地方肯定有类似java.lang.reflect.XXX的字样,这种自检机制可以帮助我们方便的调试Android应用程序。 反射的缺点有哪些? 1. 因为是动态执行的,效率自然没有预编译时引用现有的库效率高,就像平时我们Win32开发时,可以不用h文件,直接通过GetProcAddress一样去动态获取方法的地址。当然效率要根据复杂程度而决定,一般稍微复杂的处理性能损失可能超过20%,对于一些复杂的涉及Java自动类型转换判断,执行时间可能是直接引用的上千倍,所以最终我们调试时必须考虑性能问题。 2. 因为反射是动态的,所以需要处理很多异常,不然Dalvik崩溃出Force Close的概率会大很多,很简单的一个反射就需要至少3个异常捕获,本身try-catch效率就不是很高,自然进一步影响运行效率,对于Android开发我们必须考虑这些问题。 3. 反射因为导致代码臃肿,自然稍微复杂的几个方法实用反射将会导致代码可读性和维护性降低,如果很抽象的调用Android开发网强烈不推荐这种方法。 最后要说的是Reflection并不是Java的专利,微软的.Net也同样支持,同时更多的动态语言如Ruby等均支持这一特性。
Android内存管理-SoftReference的使用 Android开发技术
很多时候我们需要考虑Android平台上的内存管理问题,Dalvik VM给每个进程都分配了一定量的可用堆内存,当我们处理一些耗费资源的操作时可能会产生OOM错误(OutOfMemoryError)这样的异常,Android123观察了下国内的类似Market客户端设计,基本上都没有采用很好的内存管理机制和缓存处理。 如果细心的网友可能发现Android Market客户端载入时,每个列表项的图标是异步刷新显示的,但当我们快速的往下滚动到一定数量比如50个,再往回滚动时可能我们看到了部分App的图标又重新开始加载,当然这一过程可能是从SQLite数据库中缓存的,但是在内存中已经通过类似SoftReference的方式管理内存。 在Java中内存管理,引用分为四大类,强引用HardReference、弱引用WeakReference、软引用SoftReference和虚引用PhantomReference。它们的区别也很明显,HardReference对象是即使虚拟机内存吃紧抛出OOM也不会导致这一引用的对象被回收,而WeakReference等更适合于一些数量不多,但体积稍微庞大的对象,在这四个引用中,它是最容易被垃圾回收的,而我们对于显示类似Android Market中每个应用的App Icon时可以考虑使用SoftReference来解决内存不至于快速回收,同时当内存短缺面临Java VM崩溃抛出OOM前时,软引用将会强制回收内存,最后的虚引用一般没有实际意义,仅仅观察GC的活动状态,对于测试比较实用同时必须和ReferenceQueue一起使用。 对于一组数据,我们可以通过HashMap的方式来添加一组SoftReference对象来临时保留一些数据,同时对于需要反复通过网络获取的不经常改变的内容,可以通过本地的文件系统或数据库来存储缓存,希望给国内做App Store这样的客户端一些改进建议。
Android控件TextProgressBar进度条上显文字 Android开发技术
Android系统的进度条控件默认的设计的不是很周全,比如没有包含文字的显示,那么如何在Android进度条控件上显示文字呢? 来自Google内部的代码来了解下,主要使用的addView这样的方法通过覆盖一层Chronometer秒表控件来实现,整个代码如下 public class TextProgressBar extends RelativeLayout implements OnChronometerTickListener { public static final String TAG = "TextProgressBar"; static final int CHRONOMETER_ID = android.R.id.text1; static final int PROGRESSBAR_ID = android.R.id.progress; Chronometer mChronometer = null; ProgressBar mProgressBar = null; long mDurationBase = -1; int mDuration = -1; boolean mChronometerFollow = […]
Android平板开发注意事项 Android开发技术
很多时候,我们可能需要考虑Android平板开发时需要注意问题,随着Galaxy Tab、Dell streak等产品的出现,未来Android平板可能将比iPad更具价格优势,至少品牌和定位将会更丰富。Android123今天就来和大家一起谈谈平板gPad相关的开发技术和注意事项。 目前Android 2.2 Froyo对平板的支持度不是很好,目前Google正在着手处理3.0中针对平板电脑的支持,未来将于2011年初有多款平板电脑上市,我们平时处理界面时尽量使用不依赖设备的,比如常规的图片使用dip这样的单位,文字使用sp,而对于px这样的应该尽量少用。对于简单的素材尽可能的大一些,但对于缩小时不能有严重的失真,这点Google Android似乎没有Symbian先进,没有使用svg这样的矢量方法解决,但是给我们提供的9patch方法来拉伸一些简单图形还是很有效的。 对于布局来说尽量使用相对布局和线性布局,平板的分辨率可能使用1024×576等等的非常规分辨率,处理背景图片时要格外注意,对于控件自绘来说计算好相对位置是十分关键的,我们可以在创建Android AVD的同时设置好类似平板的分辨率,看看应用的运行效果。 平板很多低端的可能没有GSM模块,无法拨打电话或GPRS等数据链接,我们应用在调用某些API时要做到异常处理,比如IMSI的获取。我们无需坐等Android 3.0或3.5的自然支持,经过简单的兼容性设计处理可以很好的让你的应用兼容更大的设备显示。

微信机器人高级版新增自定义回复功能
现在微信机器人高级版支持自定义回复了: 目前支持文本和图文两种自定义回复,如果是文本回复,直接输入要回复的文本即可,如果是图文回复,请输入构成图文回复的单篇或者多篇日志,用英文逗号区分开,如:123,234,345,并且同个回复还可以支持多个关键字。 下载:微信机器人 WordPress 插件。 购买:微信机器人高级版。 标签:WordPress 插件 微信
微信机器人 WordPress 插件高级版
经过几个星期的测试,终于可以推出微信机器人高级版,相对基础版,高级版本让你你设置更加容易,并且还有一些更加强大的功能,当然因为基础版已经满足大家的需求,高级版是收费的,现在特价销售,仅为 ¥79.99,以后增加更多功能之后,将提升到 ¥199.99,要买立刻, 点击这里购买微信机器人高级版。 更容易设置 微信机器人高级版让你所有的设置都可以在后台实现,比如输入微信 token,设置默认的缩略图等等,详细如下图: 更高级的功能 微信机器人高级版的另外一个加强的地方是,新增了一些高级高能,比如输入 n 返回最新文章,输入 r 返回随机文章等等,并且这些关键字都可以自定义,如果你已经申请了微信自定义菜单功能,这些关键字也可以用于自定义菜单,已经完全支持。 自定义回复 除了高级功能之后,你还可以在 WordPress 后台自定义回复(需要重新激活下插件): 目前支持文本和图文两种自定义回复,如果是文本回复,直接输入要回复的文本即可,如果是图文回复,请输入构成图文回复的单篇或者多篇日志,用英文逗号区分开,如:123,234,345,并且同个回复还可以支持多个关键字。 详细大家可以添加我的微信公众账号进行测试,账号为:WordPressJAM,或者直接扫描下面的二维码: 微信机器人高级版安装和设置 微信机器人高级版安装和基本版一致,上传激活,然后在微信公共账号后台将 URL 设置为:http://你博客地址/?weixin,Token 设置成上面一致: 最后到 WordPress 后台 > 微信机器人 进行设置和自定义回复。 下载:微信机器人 WordPress 插件。 购买:微信机器人高级版。 标签:WordPress 插件 微信
七牛镜像存储 WordPress 插件:一键实现 WordPress 博客静态文件 CDN 加速
七牛云存储是由七牛提供的在线存储服务,通过云端接口向企业客户提供网上无限存储空间,和传统的云存储服务(如 Amazon S3)不同,七牛云存储还增加了上传下载传输加速以及富媒体云端处理特性。 七牛云存储支持绑定域名(需要备案域名),全网 CDN 加速(多数据中心+多加速节点,上传下载均加速)、持续在线,可以无限扩展、用户只需按需付费,无硬件投资,并且还可以免费试用3个月。 七牛云存储的主要特点 云存储:可以存储静态文件,包含:图片,音视频,甚至是 CSS,JS,还可以存储其他文件和非结构化数据。 云处理:这是个人认为七牛最强地方,就是支持 图片/音频/视频 等资源在线压缩和转换处理,并且可以通过回调功能自定义数据处理。 云加速:七牛支持上传/下载双向加速,并且单文件上传无大小限制,支持断点续传。分布各地的加速节点,自动选择离用户最近的节点,保证数据上传下载的速度。 API 操作:七牛云存储提供了一系列 API 和 SDK 和示例教程教你接入使用。 缩略图:七牛支持设置不同大小规格的图片,而且是可以自定义尺寸的,根据用户的显示分辨率不同使用不同的图片,达到下载速度和显示体验的最佳搭配,而七牛的缩略图定义非常方便,只需要在七牛的后台 Web 界面进行进行定义即可。 七牛镜像存储 WordPress 插件:一键实现 WordPress 博客静态文件 CDN 加速 除了云存储以外,七牛还支持传统 CDN 的镜像存储,这个功能是七牛相对其他类 Amazon S3 服务最强悍的地方,因为对于很多 WordPress 站点来说,有了这个功能,就无需将原来的图片上传到七牛的服务器上,只需在 WordPress 站点做些简单的修改,就可以使用七牛的 CDN 服务了。我也制作了七牛镜像存储 WordPress 插件,下面我就详细说说这个插件的使用过程: 1. 登陆七牛,在域名绑定,输入自定义的域名,或者直接使用七牛提供的域名,点击绑定: 2. 镜像存储(源站加速),输入源站的地址,点击确定: 3. 下载 七牛镜像存储 WordPress 插件,上传激活,然后在 WordPress 后台 > […]

WordPress 性能优化:为什么我的博客比你的快
WordPress 很慢? 很多同学都说 WordPress 很慢,但是作为全世界最常用的建站和博客系统 WordPress 来说,我相信在性能设计上肯定不会有太大的问题,WordPress 开发团队也肯定也考虑到这个问题。 那么 WordPress 效率问题主要是出在哪里呢?根据我多年 WordPress 建站和维护的经验,很多性能的问题都是 WordPress 使用不当造成的,比如安装太多效率低下的插件,使用代码质量低下的主题,没有正确处理 WordPress 的缓存等等,所以提高 WordPress 性能,就要从这些方面入手。 今天就结合实际案例:App每日推送 这个使用 WordPress 构建的网站,给大家讲讲自己多年总结的 WordPress 优化经验和技巧: 关于 App每日推送 首先简单介绍下App每日推送这个网站,它是基于 WordPress 构建的 iPhone/iPad 应用推荐服务,这是目前我做过最复杂的 WordPress 网站,有多重筛选{可以通过设备(iPhone/iPad/通用),价格(免费/限免/收费)分类(游戏/应用/工具等等)选择 App},用户动态(可以关注,喜欢,发表评论,发布和回复帖子),讨论区,消息通知,用户积分,积分兑换等等功能。 并且整个网站每个月的流量超过 500 万PV,但是网站目前的速度很快,大部分页面在 0.1 秒内生成,并且每个页面基本保持只有 2 条 SQL 查询,比如首页:2 queries in 0.063 seconds。 那么我们是怎么进行优化的: 静态文件优化 网站的静态文件一般有两种:第一种是网站的 CSS,Javascript 和一些主题的常用背景图片和按钮文件,这些图片如果网站不进行改版或者其他改动,基本上是不会修改的,第二种是每天更新的网站内容中上传的图片或者附件,这些图片文件也是基本不会改动的。 解决好静态文件存储和加速,网站性能就首先能得到基本的保证了,WordPress 构建的网站和博客也是一样的。对于这些静态文件来说,最好的解决方案永远是使用 […]
WordPress 3.6 新功能概述
WordPress 已经发布了 3.6 的 beta 3 的测试版,那么 3.6 有哪些新功能呢? 日志格式:现在日志格式有了全新的 UI,主题作者可以通过模板函数实现结构化数据。 Twenty Thirteen:全新的 Twenty Thirteen(2013)主题。Twenty Thirteen 是一个具有丰富选线,色彩丰富,以博客为中心的主题,并且全面支持日志格式。 音频/视频:现在你无需插件或者第三方媒体托管服务,就可以在日志中嵌入音频或者视频了。 自动保存:日志将自动保存到本地,如果你的浏览器挂掉,或者电脑死机,设置服务器下线,你都不会丢失你撰写的日志。 日志锁定:可以看到有人正在编辑某篇日志,并且如果他长期没有动静,可以将他踢出去。 导航菜单:导航菜单被简化成可以折叠的 UI,并且可以通过一个单独标签来实现批量编辑分配菜单的位置。 日志修订:权限的日志修订 UI,可以滚动选择修订历史,并且支持高亮显示两个版本的不同之处,还可以快速恢复到任何修订版。
Android自绘GridView控件 Android开发技术
Android为我们提供了一个很好用的网格控件GridView,它的另外一种实现Google在提供PSDK时包含了一个简单的例子,大家一起来看看吧: 对于还不熟悉Android平台控件子类化的网友可以看看其具体实现的方法,主要是构造时提供了初始化资源、计算控件的尺寸和位置measure相关的处理,大家本次需要注意的是这个固定的Gird是从ViewGroup派生,没有实现onDraw,注意下面的onLayout方法,完整代码如下 public class FixedGridLayout extends ViewGroup { int mCellWidth; int mCellHeight; public FixedGridLayout(Context context) { super(context); } public FixedGridLayout(Context context, AttributeSet attrs) { super(context, attrs); TypedArray a = context.obtainStyledAttributes( attrs, R.styleable.FixedGridLayout); mCellWidth = a.getDimensionPixelSize( R.styleable.FixedGridLayout_cellWidth, -1); mCellHeight = a.getDimensionPixelSize( R.styleable.FixedGridLayout_cellHeight, -1); a.recycle(); } public void setCellWidth(int px) { […]
使用OpenGL开发一个指南针 Android开发技术
在Android设备中具备了很多新的特性,比如各种感应器,GL图形库支持。在大部分Android设备中都有磁力感应器,相对于重力感应而言它可以感应出方向,今天Android123就以Google的Samples的指南针例子和大家说下OpenGL的指南针的实现。 public class CompassActivity extends Activity implements Renderer, SensorEventListener { private GLSurfaceView mGLSurfaceView; //GL View private SensorManager mSensorManager; private float[] mGData = new float[3]; private float[] mMData = new float[3]; private float[] mR = new float[16]; private float[] mI = new float[16]; private FloatBuffer mVertexBuffer; private FloatBuffer mColorBuffer; private ByteBuffer mIndexBuffer; private float[] mOrientation […]
Android数组排序常见方法 Android开发技术
Android的数组排序方式基本上使用了Sun原生的Java API实现,常用的有Comparator接口实现compare方法和Comparable接口的compareTo方法,我们对于一个数组列表比如ArrayList可以通过这两个接口进行排序和比较,这里Android123给大家一个例子 private final Comparator cwjComparator = new Comparator() { private final Collator collator = Collator.getInstance(); public final int compare(Object a, Object b) { CharSequence a = ((Item) a).sName; CharSequence b = ((Item) b).sID; return collator.compare(a, b); } }; 我们的ArrayList对象名为mList,则执行排序可以调用方法 Collections.sort(mList, cwjComparator);
Android蓝牙控制之2.X或以上 Android开发技术
Android从2.0开始包含了完整的蓝牙组件,有关Android平台上的bluetooth控制常见的运行在API Level至少为5的代码如下: private BluetoothAdapter mAdapter = null; 开启蓝牙 if (!mAdapter.isEnabled()) { Intent cwj = new Intent(BluetoothAdapter.ACTION_REQUEST_ENABLE); startActivity(cwj); } 设置可发现状态 Intent android123 = new Intent(BluetoothAdapter.ACTION_REQUEST_DISCOVERABLE); android123.putExtra(BluetoothAdapter.EXTRA_DISCOVERABLE_DURATION, 500); //Android开发网提示这里为设置搜索超时500ms startActivity(android123); 本例使用的是Google推荐的通过Intent和Action方式调用系统的蓝牙宿主程序来控制蓝牙的开关,无需permission也可以很好的处理,希望未来Google应该在GPS控制上也提供类似的方法
Zipalign使用方法-SDK中的APK文件优化工具 Android开发技术
在Android SDK中包含了一个工具名为Zipalign,它可以优化你的APK程序包,我们都知道APK的MIME其实就是一个Zip压缩文件,通过Zipalign可以让你的应用程序运行更快,Android123猜测从原理上来讲应该是优化Zip文件的解压速度,毕竟这个工具的文件名为zip对齐。 在Android平台中,数据文件存储在apk文件中,可以多进程的访问,如果你开发过Win32可能知道程序的粒度对齐问题,不错虽然不是PE格式的文件,在Zip中一样,资源的访问可以通过更好的对其优化,而zipalign使用了4字节的边界对齐方式来影射内存,通过空间换时间的方式提高执行效率。下面Android开发网给大家一个例子来看下zipalign使用的例子: zipalign位于android sdk的tools文件夹下面,如果你使用windows操作系统可以通过cmd来执行它: 完整的命令行说明为 E:\android-sdk-windows\tools>zipalign.exe Zip alignment utilityCopyright (C) 2009 The Android Open Source Project Usage: zipalign [-f] [-v] <align> infile.zip outfile.zip zipalign -c [-v] <align> infile.zip <align>: alignment in bytes, e.g. ‘4’ provides 32-bit alignment -c: check alignment only (does not modify file) -f: overwrite existing […]
Android Widget开发模板 Android开发技术
Android上的Widget使用了Java语言开发比W3C的Widget运行效率提高了不少,可以做更多的事情调用系统的API,除了UI上的限制外,我们可以考虑帮助系统完善一些appWidget,Android123给出大家一个开发Widget的模板。 public class cwjWidget extends AppWidgetProvider { @Override public void onUpdate(Context context, AppWidgetManager appWidgetManager, int[] appWidgetIds) { context.startService(new Intent(context, UpdateService.class)); //这里创建一个服务,防止出现等待超时对话框 } public static class UpdateService extends Service { //这个内部的服务我们推荐新开一个线程操作一些容易阻塞的情况,比如网络下载等等 @Override public void onStart(Intent intent, int startId) { RemoteViews updateViews = buildUpdate(this); ComponentName thisWidget = new ComponentName(this, cwjWidget.class); AppWidgetManager manager = AppWidgetManager.getInstance(this); […]
Android开发者应该保持以下特质 Android开发技术
作为Android平台上的开发可能来看算是比较简单易学的,我们对于开发一些应用来说应该以量少质高的方式深入,目前Android Market充斥着大量重复而又低劣的应用,如何在众多软件中脱颖而出呢? 1. 用户群定位 – 目前我们要考虑软件是给什么样的人用的,操作人员的技术是什么,并不是所有的用户都是开发者理解很多专业术语。 2. 用户体验度 – 好的UI设计,尽量不要出现广告除了影响美观,浪费流量外还浪费屏幕资源,电池消耗等毕竟多开了一个Ad线程不是吗? 简单易用,不是每个人都是专家。 3. 严格测试 – 对于市面上很多软件对于版本升级或数据操作的可靠性不敢恭维,国内的大多数软件仍然存在着很多测试不充分出现的问题。 4. 注重反馈 – 很多地方我们的自己的测试人员可能无法发现有些问题,也许是因为机型或固件的问题造成的,所以软件应该提供一定的联系方式。 Android123推荐新手应该遵循 1. 深读SDK文档 2. 深读SDK的APIDemo和Samples 3. 掌握GIT开源代码 4. 多了解Android开源项目,学习别人的手法写程序。 10月5日我们将开始讨论各项Android开发中的具体技术,国庆还望各位开发者放松下来。
Android屏幕截图之View方法 Android开发技术
很多网友可能发现Android并没有提供屏幕截图ScreenShot的方法,了解Linux的网友可能知道直接读取/dev/graphics/fb0即可来实现framebuffer,当然了对于自己的View实现一些绘图或子类化的技术时可以不用系统级这样的方法,我们可以通过 view.setDrawingCacheEnabled(true); //其中View是你需要截图的的View Bitmap bm = view.getDrawingCache();
Android控件美化Shape你会用吗? Android开发技术
如果你对Android系统自带的UI控件感觉不够满意,可以尝试下自定义控件,我们就以Button为例,很早以前Android123就写到过Android Button按钮控件美化方法里面提到了xml的selector构造。当然除了使用drawable这样的图片外今天Android开发网谈下自定义图形shape的方法,对于Button控件Android上支持以下几种属性shape、gradient、stroke、corners等。 我们就以目前系统的Button的selector为例说下: <shape> <gradient android:startColor="#ff8c00" android:endColor="#FFFFFF" android:angle="270" /> <stroke android:width="2dp" android:color="#dcdcdc" /> <corners android:radius="2dp" /> <padding android:left="10dp" android:top="10dp" android:right="10dp" android:bottom="10dp" /> </shape> 对于上面,这条shape的定义,分别为渐变,在gradient中startColor属性为开始的颜色,endColor为渐变结束的颜色,下面的angle是角度。接下来是stroke可以理解为边缘,corners为拐角这里radius属性为半径,最后是相对位置属性padding。 对于一个Button完整的定义可以为 <?xml version="1.0" encoding="utf-8"?><selector xmlns:android="http://schemas.android.com/apk/res/android"> <item android:state_pressed="true" > <shape> <gradient android:startColor="#ff8c00" android:endColor="#FFFFFF" android:angle="270" /> <stroke android:width="2dp" android:color="#dcdcdc" /> <corners android:radius="2dp" /> <padding android:left="10dp" android:top="10dp" android:right="10dp" […]

Android应用Icon大小在不同分辨率下定义 Android开发技术
对于Android平台来说,不同分辨率下Icon的大小设计有着不同的要求,对于目前主流的HDPI即WVGA级别来说,通常hdpi的应用icon大小为72×72,而标准的mdpi即hvga为48×48,对于目前HTC和Motorola推出的一些QVGA的使用了ldpi,图标为32×32,常见的Android图标大小设计规范如下表所示: Launcher 36 x 36 px 48 x 48 px 72 x 72 px Menu 36 x 36 px 48 x 48 px 72 x 72 px Status Bar 24 x 24 px 32 x 32 px 48 x 48 px Tab 24 x 24 px 32 x 32 px 48 x 48 px […]
控制Android LED灯颜色代码 Android开发技术
很多Android手机上都配有LED灯,比如HTC的手机在充电、新来短信等时候都会有响应的指示,其实很简单的这都是NotificationManager的一些参数而已,下面Android123给大家说下如何通过代码控制LED灯的闪烁,因为有些机型没有LED灯或颜色种类较少,发布时需要真机观察。 final int ID_LED=19871103; NotificationManager nm=(NotificationManager)getSystemService(NOTIFICATION_SERVICE); Notification notification = new Notification(); notification.ledARGB = 0xFFFFFF; //这里是颜色,我们可以尝试改变,理论上0xFF0000是红色,0x00FF00是绿色 notification.ledOnMS = 100; notification.ledOffMS = 100; notification.flags = Notification.FLAG_SHOW_LIGHTS; nm.notify(ID_LED, notification); nm.cancel(ID_LED);
Android中使用定时器TimerTask类介绍 Android开发技术
在Android平台中需要反复按周期执行方法可以使用Java上自带的TimerTask类,TimerTask相对于Thread来说对于资源消耗的更低,除了使用Android自带的AlarmManager使用Timer定时器是一种更好的解决方法。 我们需要引入import java.util.Timer; 和 import java.util.TimerTask; private Timer mTimer = new Timer(true); private TimerTask mTimerTask; mTimerTask = new TimerTask() { public void run() { Log.v("android123","cwj"); } }; mTimer.schedule(mTimerTask, 5000,1000); //在1秒后每5秒执行一次定时器中的方法,比如本文为调用log.v打印输出。 如果想取消可以调用下面方法,取消定时器的执行 while(!mTimerTask.cancel()); mTimer.cancel(); 最后Android123提示大家,如果处理的东西比较耗时还是开个线程比较好,Timer还是会阻塞主线程的执行,更像是一种消息的执行方式。当然比Handler的postDelay等方法更适合处理计划任务。
Windows Phone 7 SDK完善度不如Android m3 Android开发技术
经过仔细分析,Windows Phone 7的SDK完善度不如Android m3版本,目前基础的类库基本上处于WPF/E的层面,除了基础的C#运行库和Silverlight的控件之外,Windows Phone 7目前看起来不像个是电话,至少感觉上去类似一个Mid终端,不过微软提供了类似OTA的升级方法,可以让我们感觉到未来可能会完善。 不过按照Android的发展史推算,m3过后还有两个m5版本,接下来是0.8和0.9最终的1.0开始就比较全面了,到了1.5基本上大部分该有的都有了,所以目前Windows Phone 7 从开发角度而言基本上只能做游戏和网络客户端,因为没有提供本地语言的支持,很多东西还无法很好的移植,对于地图等方面支持微软不如Google的Maps来的成熟,就目前来看WP7基本上没有什么太大的杀伤力在短期内,至少很多关键的特性没有被支持,可能竞争起来会有先天不足,目前媒体报道还停留在硬件层面,当东西真正变得很多时,我们可能发现微软目前拼的东西可能是娱乐不如Apple,互联网不如Google的尴尬地步。

