CPDroid(CodeProject随身行!!)
CodeProject的懒人且吸引人的工具
引言
在开始我的文章之前,我想先说一下,我非常喜欢阅读CodeProject上的文章。此外,我也是这个社区的一名小小贡献者,为社区贡献了几篇文章。我努力阅读社区中几乎所有优秀的文章。有时候,我手头有时间,但却没有笔记本电脑来浏览文章(通常是在长途回家的路上),所以我会在手机浏览器上浏览CodeProject网站,但这并不吸引人。因此,为了解决我的问题,我决定为CodeProject开发一个原生应用,最终我开发了一个应用程序,在Android市场被称为“CPDroid”。我想感谢Luc Pattyn为CodeProject制作的 CPVanity 工具所做的出色工作,因为CPDroid的很多想法都来自于他的文章。您可以 在这里 从Android市场安装它。
总之,让我们开始对CPDroid做一点介绍。CPDroid是一款适用于Android手机的原生应用程序。我将应用程序组件分为三个部分。
- 第一部分是根据作者的CodeProject会员ID搜索作者。它将以清晰、整洁的格式获取作者信息和相关数据。
- 第二部分提供CodeProject文章和技巧的最新动态。
- 第三部分是关于我?和许可证。
CPDroid 功能
CPDroid 的功能非常简单明了。让我们总结一下:
- 作者搜索结果非常方便且吸引人。用户将获得作者信息及其相应的积分和其他详细信息,如文章数量、消息数量等,以及文章列表和声誉图。
- 用户可以通过点击列表视图阅读每篇文章,文章将在最易读的网页视图格式中打开。
- 使用Android SAX解析器技术获取CodeProject文章的最新动态。
主界面
主用户界面是不同部分的导航器。这是一个Android Activity,会调用三个不同的组件按钮。Intent 用于触发搜索作者和最新动态的关联Activity。由于主界面功能简单,我将不在此部分深入探讨,而更好的是展示我如何为导航到各个部分的UI制作圆角按钮。
<?xml version="1.0" encoding="utf-8"?>
<selector
xmlns:android="http://schemas.android.com/apk/res/android">
<item android:state_pressed="true" >
<bitmap android:src="@drawable/btnsearchall_pressed"
android:gravity="center" />
</item>
<item android:state_enabled="true" >
<bitmap android:src="@drawable/btnsearchall"
android:gravity="center" />
</item>
</selector>
在Android中,我们可以通过自定义图片来突出按钮。为了指示按钮的不同状态(焦点、选中等),您可以为每种状态定义不同的图片。例如,默认是蓝色图片,焦点时为橙色,按下时为黄色。一种简单的方法是使用XML可绘制资源“选择器”。在此代码中,当按钮被按下时,它将调用按钮按下状态的可绘制源图片;当未按下时,它将调用不同的可绘制资源。UI由Android操作系统通过优雅的映射来简单地管理。这也是Android OS吸引我投入Android的原因。

搜索作者
这是我最喜欢的部分,也是CPDroid的独特卖点。用户可以通过相应的会员ID进行作者搜索。虽然通过ID而不是姓名搜索作者非常困难,但我无法在自定义URL和复杂的正则表达式操作上投入更多精力来获取作者所需的必要数据。实际上,如果CodeProject有任何Web服务,生活会轻松很多。所有数据都来自解析的HTML,我必须说这对稳定应用程序来说并不好。这也是应用程序可能崩溃的一个大隐患。总之,我希望CodeProject将来能提供一些Web服务来扩展社区。


总之,作者搜索结果由模型单独处理,HTML解析由线程处理,并通过Handler
类将结果传递给视图。Handler
允许您发送和处理与线程的MessageQueue
相关的Message
和Runnable
对象。每个Handler
实例都与一个线程及其消息队列相关联。当您创建一个新的Handler
时,它会被绑定到创建它的线程/消息队列——从那时起,它将把消息和可运行对象传递到该消息队列,并在它们从消息队列中取出时执行它们。
Handler
有两个主要用途:
- 调度消息和可运行对象在未来某个时间点执行;以及
- 将一个动作排队,以便在与您自己的线程不同的线程上执行。
public void GetCpAuthorSummary(final ICPAuthorSummary cpAuthorNameCallback) {
new Thread(new Runnable() {
@Override
public void run() {
try {
summaryList = cp.GetAuthorSummary();
cp.GetArticlePage();
authorName = cp.GetName();
handler.post(new Runnable() {
@Override
public void run() {
cpAuthorNameCallback.AuthorSummaryResult
(true, authorName, summaryList);
}
});
} catch (Exception ex) {
cpAuthorNameCallback.AuthorSummaryResult(false,
authorName, summaryList);
}
}
}).start();
}
在这里,我使用了接口ICPAuthorSummary
来从线程获取结果,并在搜索作者Activity中进一步实现该接口。接口的布尔结果确保何时在视图中发布数据。
图片查看器
搜索完成后,它将显示作者CodeProject的个人资料图片以及其他相关详细信息。对于图片查看器,我习惯于从URL下载图片,从应用程序上下文和HTML中提取图片,然后下载到流中并生成Drawable
图片源。
public Drawable ImageOperations(Context ctx, String url, String saveFilename) {
try {
InputStream is = (InputStream) this.fetch(url);
Drawable d = Drawable.createFromStream(is, "src");
return d;
} catch (MalformedURLException e) {
e.printStackTrace();
return null;
} catch (IOException e) {
e.printStackTrace();
return null;
}
}
public Object fetch(String address) throws MalformedURLException,IOException {
URL url = new URL(address);
Object content = url.getContent();
return content;
}
作者统计、文章和声誉
本节将关联三个选项卡。“统计”选项卡提供统计文章的列表视图。在这里,我投入了更多精力来获取统计数据的正则表达式。
文章将显示相应搜索作者的文章。所有文章都将发布其文章详细信息,如浏览量、书签数、投票数、受欢迎程度和评分。您可以直接点击任何文章并在网页视图中阅读。声誉图并不非常吸引人,它只显示声誉图。
最新文章动态
为这一部分,感谢上帝!CodeProject为最新文章提供了RSS feed。所以我使用Android SAX解析器在视图中获取feed。我不会详细介绍Android SAX解析器,因为这需要在完整的文章中介绍,我一定会单独写一篇文章来提供。

结论
CPDroid是一款简单、吸引人且易于使用的Android原生应用程序。然而,由于缺乏CodeProject Web服务,我在应用程序中没有实现很多功能。解析HTML内容并使用复杂的正则表达式获取数据确实非常困难。但如果这个应用程序变得流行,我一定会发布CPDroid的下一个版本。
未来组件
一些未来组件的想法正在我的脑海中运行,以便在CPDroid中添加更多功能。但如果应用程序在Android市场获得良好反响,我将会在下一个版本中发布它们。其中一些组件如下:
- 收藏功能,用于收藏喜欢的作者
- 将文章保存为PDF
- 菜单控件导航器
- 显示著名作者奖项
历史
- 发布版本: 1.0