解决android.content.res.Resources NotFoundException的一个方法

android开发中会用一些资源,这些资源以不同形式存在,比如说图片,xml等,android为这些不同类型的资源统一编号,生成资源类R
。如下:

public final class R {
public static final class anim {
public static final int popup_enter=0x7f040000;
public static final int popup_exit=0x7f040001;
}
public static final class drawable {
public static final int gradient_bg=0x7f020000;
public static final int icon=0x7f020001;
}
public static final class layout {
public static final int city_item=0x7f030000;
}
}

在编译器编译程序时可以找到的资源,但在运行时却找不到,会出现如下异常:
12-14 01:40:58.452: WARN/AppWidgetHostView(627): android.content.res.Resources$NotFoundException: Resource ID #0x7f030000
出现此类异常时,可以根据 Resource ID到资源类R中找相关的资源。比如0x7f030000,对应的是city_item布局文件,就可以将问题缩小到更小的范围。对于这类运行时找不到资源,但资源又确实存在的问题,可能的编译打包时出现问题,没有将该资源加入。可修改一下该资源,让编译器重新编译。

继续阅读解决android.content.res.Resources NotFoundException的一个方法

Android中如何自定义Menu菜单

我们又如何来自定义Menu呢?下面我就主要来讲讲如何在Android上自定义Menu菜单,希望对大家有所帮助。

用过UCWEB-Android版的人都应该对其特殊的menu有印象,把menu做成Tab-Menu(支持分页的Menu),可以容纳比 Android传统的menu更丰富的内容(Android的menu超过6项则缩略在[更多]里),本文参考网上的例子(作 者:CoffeeCole,email:longkefan@foxmail.com),对例子进行简化以及封装,使其作为一个复合控件融入自己的 framework。 继续阅读Android中如何自定义Menu菜单

高版本apk运行在android 1.5上出现的问题及解决方法

当采用高版本SDK开发的Android应用,更换成1.5的SDK后会出现如下错误,说是一些资源文件找不到。但这个资源文件又是你程序中从来没有用到的。

java.io.FileNotFoundException: res/drawable/title_bar_shadow.9.png

Caused by: android.content.res.Resources$NotFoundException: File res/drawable/title_bar_shadow.9.png from drawable resource ID #0x7f020001

Caused by: android.view.InflateException: Binary XML file line #8: Error inflating class java.lang.reflect.Constructor

经查发现,是sdk1.5版本和高版本的sdk创建的工程的目录结构不同,高版本的考虑到不同分辨率,所以有drawable-ldpi, drawable-mdpi, drawable-hdpi。而sdk1.5及以下没有种结构。只的drawable一个文件夹。用SDK1.5有时可以编辑通过高版本sdk创建的应用工程,但在1.5的机器上运行时不能从指定的drawable中找到相关资源所以不能运行。

知道问题所在后解决就很容易了,在工程中加上drawable资源文件夹,将drawable-ldpi, drawable-mdpi, drawable-hdpi中的相应资源加入到drawable中,再次编译就可以运行了。

参考:http://codinganswers.info/index.php/2011/07/exception-while-running-my-app-targetsdk-2-2-api-level-8-running-on-1-5-api-level-3/

采用XMPP协议向android客户端推送消息

XMPP(可扩展通讯和表示协议)是基于可扩展标记语言(XML)的协议,它用于即时消息(IM)以及在线探测。这个协议可能最终允许因特网用户向因特网上的其他任何人发送即时消息。

androidpn是一个基于XMPP协议的java开源Android push notification实现。它包含了完整的客户端和服务器端。经过源代码研究我发现,该服务器端基本是在另外一个开源工程openfire基础上修改实现的,不过比较郁闷的是androidpn的文档是由韩语写的,所以整个研究过程基本都是读源码。它的实现示意图如下:

androidpn客户端需要用到一个基于java的开源XMPP协议包asmack,这个包同样也是基于openfire下的另外一个开源项目smack,不过我们不需要自己编译,可以直接把androidpn客户端里面的asmack.jar拿来使用。客户端利用asmack中提供的XMPPConnection类与服务器建立持久连接,并通过该连接进行用户注册和登录认证,同样也是通过这条连接,接收服务器发送的通知。

androidpn服务器端也是java语言实现的,基于openfire开源工程,不过它的Web部分采用的是spring框架,这一点与openfire是不同的。Androidpn服务器包含两个部分,一个是侦听在5222端口上的XMPP服务,负责与客户端的XMPPConnection类进行通信,作用是用户注册和身份认证,并发送推送通知消息。另外一部分是Web服务器,采用一个轻量级的HTTP服务器,负责接收用户的Web请求。服务器架构如下:

最上层包含四个组成部分,分别是SessionManager,Auth Manager,PresenceManager以及Notification Manager。SessionManager负责管理客户端与服务器之间的会话,Auth Manager负责客户端用户认证管理,Presence Manager负责管理客户端用户的登录状态,NotificationManager负责实现服务器向客户端推送消息功能。

服务器端界面如下,分别对应了上述的几个功能模块:

发送以后,我们可以在手机端看到接收的消息:

这个解决方案的最大优势就是简单,我们不需要象C2DM那样依赖操作系统版本,也不会担心某一天Google服务器不可用。利用XMPP协议我们还可以进一步的对协议进行扩展,实现更为完善的功能。

采用这个方案,我们目前只能发送文字消息,不过对于推送来说一般足够了,因为我们不能指望通过推送得到所有的数据,一般情况下,利用推送只是告诉手机端服务器发生了某些改变,当客户端收到通知以后,应该主动到服务器获取最新的数据,这样才是推送服务的完整实现。

相关资料:

谷歌Android如何从云端推送消息到手机

How to Implement Push Notifications for Android

两个SQL语句,性能相差如此大

用Hibernate开发的应用,使用是Oracle10g,使用的方言是org.hibernate.dialect.OracleDialect

数据到达360W的时候,分页查询比较慢,达到10S多,分析了自动生成的SQL,发现SQL格式如下:
SELECT *
FROM (SELECT row_.*, ROWNUM rownum_
FROM (SELECT users.id,users.name
FROM my.users users0_) row_)
WHERE rownum_ <= 100 AND rownum_ > 10
将方言改为org.hibernate.dialect.Oracle10gDi生成的SQL是
SELECT *
FROM (SELECT row_.*, ROWNUM rownum_
FROM (SELECT users.id,users.name
FROM my.users users0_) row_ where rownum <= 100 )
WHERE rownum_ > 10。

速度很快。

页面设计中的几个规范

1、高级查询与简单查询:如是列表中存在高级查询和简单查询时,简单查询一般只用一个文本框,以突出其简单快速的特性;高级查询应该采用链接的形式,以表明要转到另外一个页面,如baidu中的“高级”链接,google中的” 高级搜索”链接。
2、按钮的使用:系统中一般如果存在与数据库交互的应该使用按钮,如增加,修改,删除等。对于页面的跳转一般采用链接的形式。如转到增加页面。转修改页面等;
3、系统分析设计中尽量少用或不用“信息”,“管理”等字样,这些词一般概括性较强,但不具体,不适合用于这些场合
4、用例的名称一般采用动词+名词的形式命名