当前位置:  编程技术>移动开发
本页文章导读:
    ▪应用第三方库EGORefreshTableHeaderView实现时拉刷新功能        应用第三方库EGORefreshTableHeaderView实现下拉刷新功能 首先 从网上下载  #import"EGORefreshTableHeaderView.h"  这个里面的东西 包含到自己的tableView之中 例如 #import "EGORefreshTableHeaderView.h" @interface RootV.........
    ▪ Unity3D干的DEMO        Unity3D做的DEMO   用Unity3D搞的一个DEMO,由于处于创业初期,所以很多网友要求我写一些U3D教程的事也被我耽搁了。不过我会在后面挤出空闲时间尽量写教程和大家分享。 另外,有投资对我们.........
    ▪ [040] 微信大众帐号开发教程第16篇-应用实例之历史上的今天       [040] 微信公众帐号开发教程第16篇-应用实例之历史上的今天内容概要 本篇文章主要讲解如何在微信公众帐号上实现“历史上的今天”功能。这个例子本身并不复杂,但希望通过对它的学习,.........

[1]应用第三方库EGORefreshTableHeaderView实现时拉刷新功能
    来源: 互联网  发布时间: 2014-02-18
应用第三方库EGORefreshTableHeaderView实现下拉刷新功能

首先 从网上下载  #import"EGORefreshTableHeaderView.h"  这个里面的东西
包含到自己的tableView之中
例如
#import "EGORefreshTableHeaderView.h"
@interface RootViewController : UITableViewController<</span>EGORefreshTableHeaderDelegate>
 {
 //接下来开始声明一些必要的变量和方法并且遵守其协议
EGORefreshTableHeaderView *_refreshHeaderView;
 
//  Reloading var should really be your tableviewsdatasource
 //  Putting it here for demopurposes
 BOOL _reloading;
 }
 
- (void)reloadTableViewDataSource;
 -(void)doneLoadingTableViewData;
 @end

接下来 就是在 M文件中的 方法实现
 (void)viewDidLoad {
 [super viewDidLoad];
 
if (_refreshHeaderView == nil) {
 
EGORefreshTableHeaderView *view = [[EGORefreshTableHeaderViewalloc] initWithFrame:CGRectMake(0.0f, 0.0f -self.tableView.bounds.size.height, self.view.frame.size.width,self.tableView.bounds.size.height)];
 view.delegate = self;
 [self.tableViewaddSubview:view];
 _refreshHeaderView = view;
 [view release];
 
}
 
//  update the last update date
 [_refreshHeaderViewrefreshLastUpdatedDate];
 }
//viewDidLOAD初始化一下

 (void)reloadTableViewDataSource{
 
//  should be calling your tableviews data sourcemodel to reload
 //  put here just fordemo
 _reloading = YES;
 
}
 
- (void)doneLoadingTableViewData{
 
//  model should call this when its doneloading
 _reloading = NO;
 [_refreshHeaderViewegoRefreshScrollViewDataSourceDidFinishedLoading:self.tableView];
 
}
//这些就是datasource的一些方法


- (void)scrollViewDidScroll:(UIScrollView*)scrollView{
 
[_refreshHeaderViewegoRefreshScrollViewDidScroll:scrollView];
 
}
 
- (void)scrollViewDidEndDragging:(UIScrollView *)scrollViewwillDecelerate:(BOOL)decelerate{
 
[_refreshHeaderViewegoRefreshScrollViewDidEndDragging:scrollView];
 
}

//这些就是scrollview的一些协议方法的实现



 (void)egoRefreshTableHeaderDidTriggerRefresh:(EGORefreshTableHeaderView*)view{
 
[self reloadTableViewDataSource];
 [selfperformSelector:@selector(doneLoadingTableViewData) withObject:nilafterDelay:3.0];
 
}
 
-(BOOL)egoRefreshTableHeaderDataSourceIsLoading:(EGORefreshTableHeaderView*)view{
 
return _reloading; // should return if data source model isreloading
 
}
 
-(NSDate*)egoRefreshTableHeaderDataSourceLastUpdated:(EGORefreshTableHeaderView*)view{
 
return [NSDate date]; // should return date data source was lastchanged
 
}
//这些就是自己的代理方法

以上是实现下拉菜单的一些实现. 有些数据方面的更新 需要到对应的方法里去实现. 这些方法名字都很清晰  就不做过多解释了 

    
[2] Unity3D干的DEMO
    来源: 互联网  发布时间: 2014-02-18
Unity3D做的DEMO

 

用Unity3D搞的一个DEMO,由于处于创业初期,所以很多网友要求我写一些U3D教程的事也被我耽搁了。不过我会在后面挤出空闲时间尽量写教程和大家分享。

另外,有投资对我们项目和团队感兴趣的,可以联系我QQ:327112182

我们目前人员齐全,人员都来自各大游戏公司,在旧公司都担任主管级别职位。


    
[3] [040] 微信大众帐号开发教程第16篇-应用实例之历史上的今天
    来源: 互联网  发布时间: 2014-02-18
[040] 微信公众帐号开发教程第16篇-应用实例之历史上的今天

内容概要

本篇文章主要讲解如何在微信公众帐号上实现“历史上的今天”功能。这个例子本身并不复杂,但希望通过对它的学习,读者能够对正则表达式有一个新的认识,能够学会运用现有的网络资源丰富自己的公众账号。


何谓历史上的今天

回顾历史的长河,历史是生活的一面镜子;以史为鉴,可以知兴衰;历史上的每一天,都是喜忧参半;可以了解历史的这一天发生的事件,借古可以鉴今,历史是不能忘记的。查看历史上每天发生的重大事情,增长知识,开拓眼界,提高人文素养。


寻找接口(数据源)

要实现查询“历史上的今天”,首先我们要找到相关数据源。笔者经过搜索发现,网络上几乎没有现成的“历史上的今天”API可以使用,所以我们只能通过爬取、解析网页源代码的方式得到我们需要的数据。笔者发现网站http://www.rijiben.com/上包含“历史上的今天”功能,就用它做数据源了。


开发步骤

为了便于读者理解,我们需要清楚该应用实例的开发步骤,主要如下:

1)发起HTTP GET请求,获取网页源代码。

2)运用正则表达式从网页源代码中抽取我们需要的数据。

3)对抽取得到的数据进行加工(使内容呈现更加美观)。

4)将以上三步进行封装,供外部调用。

5)在公众账号后台调用封装好的“历史上的今天”查询方法。


代码实现

笔者将上述步骤1)、2)、3)中的代码实现封装成了TodayInHistoryService类,并对外提供了getTodayInHistory()方法来获取“历史上的今天”。实现代码如下:

import java.io.BufferedReader;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.net.HttpURLConnection;
import java.net.URL;
import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

/**
 * 历史上的今天查询服务
 * 
 * @author liufeng
 * @date 2013-10-16
 * 
 */
public class TodayInHistoryService {

	/**
	 * 发起http get请求获取网页源代码
	 * 
	 * @param requestUrl
	 * @return
	 */
	private static String httpRequest(String requestUrl) {
		StringBuffer buffer = null;

		try {
			// 建立连接
			URL url = new URL(/blog_article/requestUrl/index.html);
			HttpURLConnection httpUrlConn = (HttpURLConnection) url.openConnection();
			httpUrlConn.setDoInput(true);
			httpUrlConn.setRequestMethod("GET");

			// 获取输入流
			InputStream inputStream = httpUrlConn.getInputStream();
			InputStreamReader inputStreamReader = new InputStreamReader(inputStream, "utf-8");
			BufferedReader bufferedReader = new BufferedReader(inputStreamReader);

			// 读取返回结果
			buffer = new StringBuffer();
			String str = null;
			while ((str = bufferedReader.readLine()) != null) {
				buffer.append(str);
			}

			// 释放资源
			bufferedReader.close();
			inputStreamReader.close();
			inputStream.close();
			httpUrlConn.disconnect();
		} catch (Exception e) {
			e.printStackTrace();
		}
		return buffer.toString();
	}

	/**
	 * 从html中抽取出历史上的今天信息
	 * 
	 * @param html
	 * @return
	 */
	private static String extract(String html) {
		StringBuffer buffer = null;
		// 日期标签:区分是昨天还是今天
		String dateTag = getMonthDay(0);

		Pattern p = Pattern.compile("(.*)(<div listren\">)(.*?)(</div>)(.*)");
		Matcher m = p.matcher(html);
		if (m.matches()) {
			buffer = new StringBuffer();
			if (m.group(3).contains(getMonthDay(-1)))
				dateTag = getMonthDay(-1);

			// 拼装标题
			buffer.append("≡≡ ").append("历史上的").append(dateTag).append(" ≡≡").append("\n\n");

			// 抽取需要的数据
			for (String info : m.group(3).split("  ")) {
				info = info.replace(dateTag, "").replace("(图)", "").replaceAll("</?[^>]+>", "").trim();
				// 在每行末尾追加2个换行符
				if (!"".equals(info)) {
					buffer.append(info).append("\n\n");
				}
			}
		}
		// 将buffer最后两个换行符移除并返回
		return (null == buffer) ? null : buffer.substring(0, buffer.lastIndexOf("\n\n"));
	}

	/**
	 * 获取前/后n天日期(M月d日)
	 * 
	 * @return
	 */
	private static String getMonthDay(int diff) {
		DateFormat df = new SimpleDateFormat("M月d日");
		Calendar c = Calendar.getInstance();
		c.add(Calendar.DAY_OF_YEAR, diff);
		return df.format(c.getTime());
	}

	/**
	 * 封装历史上的今天查询方法,供外部调用
	 * 
	 * @return
	 */
	public static String getTodayInHistoryInfo() {
		// 获取网页源代码
		String html = httpRequest("http://www.rijiben.com/");
		// 从网页中抽取信息
		String result = extract(html);

		return result;
	}

	/**
	 * 通过main在本地测试
	 * 
	 * @param args
	 */
	public static void main(String[] args) {
		String info = getTodayInHistoryInfo();
		System.out.println(info);
	}
}
代码解读:

1)27-58行代码是httpRequest()方法,用于发起http get请求,获取指定url的网页源代码。

2)66-92行代码是extract()方法,运用正则表达式从网页源代码中抽取“历史上的今天”数据。

3)111-118行代码是getTodayInHistory()方法,封装给外部调用查询“历史上的今天”。

4)125-128行代码是main方法,用于在本地的开发工具中测试。

5)75-76行代码的作用是判断获取到的“历史上的今天”数据是当天的还是前一天的(因为不能保证www.rijiben.com上的数据一定在凌晨零点准时更新,所以为了保证数据的准确性必须做此判断)。

6)第71行代码是本文的重点,笔者编写的正则表达式规则是“(.*)(<div listren\">)(.*?)(</div>)(.*)”。正则表达式规则需要根据网页源代码进行编写的,特别是包含“历史上的今天”数据的那部分HTML标签,所以我们先来查看网页源代码。通过httpRequest("http://www.rijiben.com/")方法获取到的网页源代码,与我们通过浏览器访问http://www.rijiben.com/页面再点击右键选择“查看网页源代码”所得到的结果完全一致。我们通过浏览器查看http://www.rijiben.com/的网页源代码,然后找到“历史上的今天”数据所在位置,如下图所示:


从上面的源代码截图中可以看到,我们需要的数据被包含在<div >标签内,这样就不难理解为什么正则表达式要这样写:

(.*)(<div listren\">)(.*?)(</div>)(.*)

我们使用括号()将正则表达式规则分成了5组,下面是这些分组的说明:

第1组:(.*)表示网页源代码中<div >标签之前还有任意多个字符。
第2组:(<div listren\">)中的反斜杠表示转义,所以该规则就是用于匹配<div >。
第3组:(.*?)表示在标签<div >和</div>之间的所有内容,这才是我们真正需要的数据所在。
第4组:(</div>)就是用于匹配<div >的结束标签。
第5组:(.*)表示在</div>标签之后还有任意多的字符。

掌握了正则表达式规则的含义,就不难理解为什么在extract()方法中全都是在使用m.group(3),因为m.group(3)就表示匹配到数据的第3个分组。m.group(3)的内容如下:

          <ul>                      <li><a href="/news6836/index.html" title="0690年10月16日 武则天登上皇位">0690年10月16日 武则天登上皇位</a>  (图)</li>                      <li><a href="/news6837/index.html" title="1854年10月16日 唯美主义运动的倡导者王尔德诞辰">1854年10月16日 唯美主义运动的倡导者王尔德诞辰</a>  </li>                      <li><a href="/news6838/index.html" title="1854年10月16日 德国社会主义活动家考茨基诞生">1854年10月16日 德国社会主义活动家考茨基诞生</a>  </li>                      <li><a href="/news6839/index.html" title="1908年10月16日 阿尔巴尼亚领导人恩维尔·霍查诞辰">1908年10月16日 阿尔巴尼亚领导人恩维尔·霍查诞辰</a>  (图)</li>                      <li><a href="/news6840/index.html" title="1913年10月16日 中国“两弹一星”元勋钱三强诞辰">1913年10月16日 中国“两弹一星”元勋钱三强诞辰</a>  (图)</li>                      <li><a href="/news6841/index.html" title="1922年10月16日 开滦煤矿工人罢工失败">1922年10月16日 开滦煤矿工人罢工失败</a>  (图)</li>                      <li><a href="/news6842/index.html" title="1927年10月16日 德国诺贝尔文学奖得主格拉斯诞生">1927年10月16日 德国诺贝尔文学奖得主格拉斯诞生</a>  (图)</li>                      <li><a href="/news6843/index.html" title="1933年10月16日 抗日同盟军失败">1933年10月16日 抗日同盟军失败</a>  (图)</li>                      <li><a href="/news6844/index.html" title="1950年10月16日 人民解放军进军西藏">1950年10月16日 人民解放军进军西藏</a>  (图)</li>                      <li><a href="/news6845/index.html" title="1954年10月16日 俞平伯《关于红楼梦研究问题的信》发表">1954年10月16日 俞平伯《关于红楼梦研究问题的信》发表</a>  (图)</li>                      <li><a href="/news6846/index.html" title="1959年10月16日 美军将领、国务卿马歇尔去世">1959年10月16日 美军将领、国务卿马歇尔去世</a>  (图)</li>                      <li><a href="/news6847/index.html" title="1964年10月16日 勃列日涅夫取代赫鲁晓夫  成为苏共中央第一书记">1964年10月16日 勃列日涅夫取代赫鲁晓夫  成为苏共中央第一书记</a>  </li>                      <li><a href="/news6848/index.html" title="1964年10月16日 我国第一颗原子弹爆炸成功">1964年10月16日 我国第一颗原子弹爆炸成功</a>  (图)</li>                      <li><a href="/news6849/index.html" title="1973年10月16日 震撼世界的石油危机爆发">1973年10月16日 震撼世界的石油危机爆发</a>  (图)</li>                      <li><a href="/news6850/index.html" title="1978年10月16日 约翰·保罗二世当选新教皇">1978年10月16日 约翰·保罗二世当选新教皇</a>  </li>                      <li><a href="/news6851/index.html" title="1979年10月16日 哈克将军宣布巴基斯坦推迟大选解散政党">1979年10月16日 哈克将军宣布巴基斯坦推迟大选解散政党</a>  </li>                      <li><a href="/news6852/index.html" title="1984年10月16日 图图主教荣获“诺贝尔和平奖”">1984年10月16日 图图主教荣获“诺贝尔和平奖”</a>  </li>                      <li><a href="/news6853/index.html" title="1988年10月16日 北京正负电子对撞机对撞成功">1988年10月16日 北京正负电子对撞机对撞成功</a>  (图)</li>                      <li><a href="/news6854/index.html" title="1991年10月16日 美国小镇枪杀案22人丧生">1991年10月16日 美国小镇枪杀案22人丧生</a>  </li>                      <li><a href="/news6855/index.html" title="1991年10月16日 莫扎特死因有新说">1991年10月16日 莫扎特死因有新说</a>  </li>                      <li><a href="/news6856/index.html" title="1991年10月16日 钱学森获“国家杰出贡献科学家”殊荣">1991年10月16日 钱学森获“国家杰出贡献科学家”殊荣</a>  (图)</li>                      <li><a href="/news6857/index.html" title="1994年10月16日 德国总理科尔四连任">1994年10月16日 德国总理科尔四连任</a>  </li>                      <li><a href="/news6858/index.html" title="1994年10月16日 第十二届广岛亚运会闭幕">1994年10月16日 第十二届广岛亚运会闭幕</a>  </li>                      <li><a href="/news6859/index.html" title="1994年10月16日 修秦陵制秦俑工匠墓葬被发现">1994年10月16日 修秦陵制秦俑工匠墓葬被发现</a>  </li>                      <li><a href="/news6860/index.html" title="1995年10月16日 美国百万黑人男子大游行">1995年10月16日 美国百万黑人男子大游行</a>  (图)</li>                    </ul>       
可以看到,通过正则表达式抽取得到的m.group(3)中仍然有大量的html标签、空格、换行、无关字符等。我们要想办法把它们全部过滤掉,第83行代码的作用正是如此。


组装文本消息

// 组装文本消息(历史上的今天)
TextMessage textMessage = new TextMessage();
textMessage.setToUserName(fromUserName);
textMessage.setFromUserName(toUserName);
textMessage.setCreateTime(new Date().getTime());
textMessage.setMsgType(WeixinUtil.RESP_MESSAGE_TYPE_TEXT);
textMessage.setFuncFlag(0);
textMessage.setContent(TodayInHistoryService.getTodayInHistoryInfo());

对于公众帐号的消息回复在本系列教程的第5篇已经讲的很详细了,所以在这里笔者只是简单的组装了文本消息。最后,我们来看一下在微信公众帐号上的演示效果:



说明:与其说这是一篇关于公众帐号应用开发的教程,倒不如说这是一篇关于网页数据爬取的教程。本文旨在为读者开辟思路,介绍一种数据获取方式。当然,这种做法也是有弊端的,当网页改版源代码结构发生变化时,就需要重新改写数据抽取代码。没有做不到,只有想不到!


如果觉得文章对你有所帮助,请通过留言或关注微信公众帐号xiaoqrobot来支持柳峰!

转帖请注明本文出自柳峰的博客(http://blog.csdn.net/lyq8479),请尊重他人的辛勤劳动成果,谢谢!


2楼xuhongyupai24分钟前今天在群上看见出来新的了,立马就来看看!果断顶一个1楼chenyaqiang1小时前大爱啊。老师辛苦了。让我受益匪浅啊

    
最新技术文章:
▪Android开发之登录验证实例教程
▪Android开发之注册登录方法示例
▪Android获取手机SIM卡运营商信息的方法
▪Android实现将已发送的短信写入短信数据库的...
▪Android发送短信功能代码
▪Android根据电话号码获得联系人头像实例代码
▪Android中GPS定位的用法实例
▪Android实现退出时关闭所有Activity的方法
操作系统 iis7站长之家
▪Android录音应用实例教程
▪Android双击返回键退出程序的实现方法
▪Android实现侦听电池状态显示、电量及充电动...
▪Android获取当前已连接的wifi信号强度的方法
▪Android实现动态显示或隐藏密码输入框的内容
▪根据USER-AGENT判断手机类型并跳转到相应的app...
▪Android Touch事件分发过程详解
▪Android中实现为TextView添加多个可点击的文本
▪Android程序设计之AIDL实例详解
▪Android显式启动与隐式启动Activity的区别介绍
▪Android按钮单击事件的四种常用写法总结
▪Android消息处理机制Looper和Handler详解
▪Android实现Back功能代码片段总结
▪Android实用的代码片段 常用代码总结
▪Android实现弹出键盘的方法
▪Android中通过view方式获取当前Activity的屏幕截...
▪Android提高之自定义Menu(TabMenu)实现方法
▪Android提高之多方向抽屉实现方法
▪Android提高之MediaPlayer播放网络音频的实现方法...
▪Android提高之MediaPlayer播放网络视频的实现方法...
▪Android提高之手游转电视游戏的模拟操控
 


站内导航:


特别声明:169IT网站部分信息来自互联网,如果侵犯您的权利,请及时告知,本站将立即删除!

©2012-2021,,E-mail:www_#163.com(请将#改为@)

浙ICP备11055608号-3