当前位置: 编程技术>移动开发
本页文章导读:
▪三. spring版 timer HelloWorld 3. spring版 timer HelloWorld
1. 由于这回需要使用Spring的jar包,所以需要修改pom文件,添加如下依赖:<!-- Spring framework -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId.........
▪ 解析搜狗音乐的音乐上载地址 解析搜狗音乐的音乐下载地址
//
// SougouMusicParser.h
//
// Created by scott.8an@gmail.com on 12-3-13.
// Copyright (c) 2012年 littleworn llc. All rights reserved.
//
#import <Foundation/Foundation.h>
#import "ASIHTTPRequest.h".........
▪ 展示PopupWindow 显示PopupWindow
PopupWindow可以实现浮层效果,而且可以自定义显示位置,出现和退出时的动画,比如新浪微博顶部栏的微博分组就是用PopupWindow实现的。 一、实例化PopupWindo.........
[1]三. spring版 timer HelloWorld
来源: 互联网 发布时间: 2014-02-18
3. spring版 timer HelloWorld
1. 由于这回需要使用Spring的jar包,所以需要修改pom文件,添加如下依赖:
注:如果使用3.0版本就不是只改个版本号的问题了,因为spring3.0已经分包了。
2. 编写Timer类代码:
注意:此domain类完全没有依赖任何接口!!!
3. 编写spring配置文件:这个代码比较多就不全贴上去了
首先是上面那个bean的声明。
这个取代了JDK中的Timer
定义一个TimerFactoryBean来启动Task。
4. 编写测试代码:
OK 一切运行成功。
1. 由于这回需要使用Spring的jar包,所以需要修改pom文件,添加如下依赖:
<!-- Spring framework --> <dependency> <groupId>org.springframework</groupId> <artifactId>spring</artifactId> <version>2.5.6</version> </dependency>
注:如果使用3.0版本就不是只改个版本号的问题了,因为spring3.0已经分包了。
2. 编写Timer类代码:
package com.helloworld.common; public class SayHelloTask{ public void sayHello() { System.out.println("HelloWorld"); } }
注意:此domain类完全没有依赖任何接口!!!
3. 编写spring配置文件:这个代码比较多就不全贴上去了
<bean id="sayHelloTask" />
首先是上面那个bean的声明。
<bean id="schedulerTask" > <property name="targetObject" ref="sayHelloTask" /> <property name="targetMethod" value="sayHello" /> </bean> MethodInvokingTimerTaskFactoryBean 取代了JDK中的TimerTask <bean id="timerTask" > <property name="timerTask" ref="schedulerTask" /> <property name="delay" value="2000" /> <property name="period" value="6000" /> </bean>
这个取代了JDK中的Timer
<bean > <property name="scheduledTimerTasks"> <list> <ref local="timerTask" /> </list> </property> </bean>
定义一个TimerFactoryBean来启动Task。
4. 编写测试代码:
public class Test { public static void main(String[] args) { ApplicationContext context = new ClassPathXmlApplicationContext("Spring-Scheduler.xml"); } }
OK 一切运行成功。
[2] 解析搜狗音乐的音乐上载地址
来源: 互联网 发布时间: 2014-02-18
解析搜狗音乐的音乐下载地址
// // SougouMusicParser.h // // Created by scott.8an@gmail.com on 12-3-13. // Copyright (c) 2012年 littleworn llc. All rights reserved. // #import <Foundation/Foundation.h> #import "ASIHTTPRequest.h" #import "ASINetworkQueue.h" #import "TFHpple.h" #import "XPathQuery.h" #import "TFHppleElement.h" #import "DataType.h" //页面地址 #define kRequestURL(/blog_article/s_songName,i_pageNumber/index.html) \ [NSString stringWithFormat:@"http://mp3.sogou.com/music.so?pf=mp3&query=%@&page=%i&w=02009900&dr=1",s_songName,i_pageNumber] @interface SogouMusicParser : NSObject + (SogouMusicParser*)shareInstance; /** 发送成功通知的数组结构: [ { "song"="save me", "artist"="Queen", "size"="4.38M", "firstChoose_url"="http://ziyuan1.myi.cn/film/YINYUE/fir/firT1563.mp3", "other_link"= [ "http://mul1.tximg.cn/music/group/bbs/mp3/7/090528/1243462409315.mp3", "http://api.ning.com/files/SRIkTa2lzwqL1jt26257Yzj3TCFZ6jAJD2HaYhYB*N469JhRrd01xDttiHqjJD7K9WkWr69u6LnXChFfA2Wid0jWUfiIB33m/f.i.r._.mp3" ] },... ] **/ - (void)runToGetSongInfoFromSogouWithKeyword:(NSString*)kw pageNumber:(NSInteger)pgNum; @end
// // SougouMusicParser.m // // Created by scott.8an@gmail.com on 12-3-13. // Copyright (c) 2012年 littleworn llc. All rights reserved. // #import "SogouMusicParser.h" NSString *const SogouMusicParseSuccessNotification = @"SogouMusicParseSuccessNotification"; NSString *const SogouMusicParseFailedNotification = @"SogouMusicParseFailedNotification"; static SogouMusicParser *parser_ = nil; @interface SogouMusicParser (Private) //获得跳转地址的urls /** [ "http://mp3.sogou.com/down.so?gid=11950F9C68D7EDE7&globalId=1f940cf0056326c8&query=%CE%D2%C", "http://mp3.sogou.com/down.so?gid=11950F9C68D7EDE7&globalId=1f940cf0056326c8&query=%CE%D2%C", ... ] **/ - (NSArray*)getJumpToDownloadPageURLsWithKeyword:(NSString*)kw pageNumber:(int)pgNum; /** 返回字典结构: { "song"="save me", "artist"="Queen", "size"="4.38M", "firstChoose_url"="http://ziyuan1.myi.cn/film/YINYUE/fir/firT1563.mp3", "other_link"= [ "http://mul1.tximg.cn/music/group/bbs/mp3/7/090528/1243462409315.mp3", "http://api.ning.com/files/SRIkTa2lzwqL1jt26257Yzj3TCFZ6jAJD2HaYhYB*N469JhRrd01xDttiHqjJD7K9WkWr69u6LnXChFfA2Wid0jWUfiIB33m/f.i.r._.mp3" ] } **/ - (NSDictionary*)getMusicInfoByJumpToUrl:(NSString*)jumpToUrl; @end @implementation SogouMusicParser + (SogouMusicParser*)shareInstance{ if (!parser_) { parser_ = [[self alloc] init]; } return parser_; } - (NSArray*)getJumpToDownloadPageURLsWithKeyword:(NSString*)kw pageNumber:(int)pgNum{ if (kw && [kw length]) { //初始化需要返回的数组 NSMutableArray *urlsArr = [NSMutableArray arrayWithCapacity:0]; //去掉搜索条件两端空格 NSString *pureKW = [kw stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceAndNewlineCharacterSet]]; //用 + 号连接需要要搜索的绑定条件 NSArray *kwArr = [pureKW componentsSeparatedByString:@" "]; NSMutableString *neededKw = [NSMutableString stringWithCapacity:0]; if (kwArr && [kwArr count]) { for (NSString *str in kwArr) { [neededKw appendFormat:@"%@+",str]; } //去掉最后一个 + 号 [neededKw deleteCharactersInRange:NSMakeRange([neededKw length]-1, 1)]; }else{ neededKw = (NSMutableString*)kw; } //对url编码 NSString *requestURLStr = kRequestURL(/blog_article/neededKw,pgNum/index.html); NSString *requestURLStrEnc = [requestURLStr stringByAddingPercentEscapesUsingEncoding:CFStringConvertEncodingToNSStringEncoding(kCFStringEncodingGB_18030_2000)]; //请求页面地址 ASIHTTPRequest *request = [ASIHTTPRequest requestWithURL:[NSURL URLWithString:requestURLStrEnc]]; [request startSynchronous]; //获得返回数据 //NSString *responseStr = [request responseString]; NSData *responseData = [request responseData]; //NSLog(@"%@",responseStr); if (responseData) { TFHpple *help = [TFHpple hppleWithHTMLData:responseData]; if (help) { //用xpath解析获得歌曲的跳转地址 //获得tbody节点 NSString *xPath = @"//*[@id='songlist']"; TFHppleElement *tableNode = [help peekAtSearchWithXPathQuery:xPath]; TFHppleElement *tBodyNode = tableNode.firstChild; if (tBodyNode) { NSMutableArray *childrenNodes = (NSMutableArray*)tBodyNode.children; if (childrenNodes && [childrenNodes count]) { //移除第一个node [childrenNodes removeObjectAtIndex:0]; for (TFHppleElement *element in childrenNodes) { NSArray *tdNodeArr = element.children; if (tdNodeArr && [tdNodeArr count]) { for (TFHppleElement *tdEle in tdNodeArr) { TFHppleElement *aNode = tdEle.firstChild; if (aNode && [[aNode objectForKey:@"action"] isEqualToString:@"down"]) { /** window.open('/down.so?gid=1A6F5F0BA3CDD9C8&globalId=137c9db3dc0bf7bf&query=%B2%BB%C3%F0%B5%C4%B0%AE&tgid=629801e642a2eadc&pf=mp3&s=%CC%B7%D3%BD%F7%EB&t=%B2%BB%C3%F0%B5%C4%B0%AE&size=4195343&ac=0&c',' ','width=431,height=495,scrollbars=no'); uigsPB('consume=music_down&music_down=28');return(false); */ NSString *urlThatMixed = [aNode objectForKey:@"onclick"]; NSArray *urlParts = [urlThatMixed componentsSeparatedByString:@"'"]; //取第二个作为uri NSString *uri = [urlParts objectAtIndex:1]; if (uri && [uri length]) { NSString *url = [NSString stringWithFormat:@"http://mp3.sogou.com%@",uri]; //NSLog(@"组合新的跳转地址:http://mp3.sogou.com%@",uri); [urlsArr addObject:url]; } } } } } if ([urlsArr count]) { return urlsArr; } } } } }else{ //再次尝试 [self getJumpToDownloadPageURLsWithKeyword:kw pageNumber:pgNum]; } } return nil; } - (NSDictionary*)getMusicInfoByJumpToUrl:(NSString*)jumpToUrl{ if (jumpToUrl && [jumpToUrl length]) { //获得下载页面,不需要编码,因为获得的数据已经是编码过了的 ASIHTTPRequest *request = [ASIHTTPRequest requestWithURL:[NSURL URLWithString:jumpToUrl]]; [request startSynchronous]; //获得返回界面 NSString *responseStr = [request responseString]; NSData *responseData = [request responseData]; // NSLog(@"返回下载界面的网页信息:%@",responseStr); if (responseData) { NSMutableDictionary *dictionary = [NSMutableDictionary dictionaryWithCapacity:0]; //解析页面 TFHpple *help = [TFHpple hppleWithHTMLData:responseData]; /** 1.查找歌曲的下载地址 **/ //href="/blog_article/.. .mp3" NSString *pattern = @"href=/index.html"..+.mp3\""; NSRegularExpression *exp = [NSRegularExpression regularExpressionWithPattern:pattern options:NSRegularExpressionCaseInsensitive error:nil]; NSArray *metchedArr = [exp matchesInString:responseStr options:NSMatchingReportProgress range:NSMakeRange(0, [responseStr length])]; if (metchedArr && [metchedArr count]) { //用数组保存其他连接 NSMutableArray *otherLinksArr = [NSMutableArray arrayWithCapacity:0]; for (NSTextCheckingResult *result in metchedArr) { NSRange range = result.range; NSString *urlWithHREF = [responseStr substringWithRange:range]; if (urlWithHREF && [urlWithHREF length]) { NSArray *urlParts = [urlWithHREF componentsSeparatedByString:@"\""]; if (urlParts && [urlParts count]>2) { NSString *musicURL = [urlParts objectAtIndex:1]; //把第一个获得的地址存到首选里去 NSString *songURL = [dictionary objectForKey:@"firstChoose_url"]; if (!songURL || [songURL length]<1) { [dictionary setObject:musicURL forKey:@"firstChoose_url"]; }else{ //去重 if (![musicURL isEqualToString:songURL]) { //用数组保存其他链接 [otherLinksArr addObject:musicURL]; } } } } } //保存其他链接到字典 [dictionary setObject:otherLinksArr forKey:@"other_link"]; } //如果下载地址解析失败,一下内容都没有必要存在 NSString *firstChoose_url = [dictionary objectForKey:@"firstChoose_url"]; if (firstChoose_url && [firstChoose_url length]) { /** 2.查找歌曲的名称 **/ NSString *xPath = @"//*[@info1\"]"; TFHppleElement *info1Node = [help peekAtSearchWithXPathQuery:xPath]; TFHppleElement *aNode = info1Node.firstChild; NSString *songName = [aNode objectForKey:@"title"]; if (songName && [songName length]) { [dictionary setObject:songName forKey:@"song"]; }else{ [dictionary setObject:@"Unknown" forKey:@"song"]; } /** 3.查找艺术家 **/ NSArray *info1Children = info1Node.children; if (info1Children && [info1Children count]) { BOOL isArtistTag = NO; for (TFHppleElement *node in info1Children) { if ([node.tagName isEqualToString:@"a"] && isArtistTag) { NSString *artist = [node objectForKey:@"title"]; if (artist && [artist length]) { [dictionary setObject:artist forKey:@"artist"]; isArtistTag =NO; } } isArtistTag = YES; } } NSString *hasArtist = [dictionary objectForKey:@"artist"]; if (!hasArtist || [hasArtist length]<1) { [dictionary setObject:@"Unknown" forKey:@"artist"]; } /** 4.查找歌曲的大小 **/ xPath = @"//*[@info2\"]"; TFHppleElement *info2Node = [help peekAtSearchWithXPathQuery:xPath]; NSArray *children = info2Node.children; if (children && [children count]) { for (TFHppleElement *node in children) { if ([node.tagName isEqualToString:@"strong"]) { NSString *sizeDesc = node.content; if (sizeDesc && [sizeDesc length]) { [dictionary setObject:sizeDesc forKey:@"size"]; } } } } NSString *hasSize = [dictionary objectForKey:@"size"]; if (!hasSize || [hasSize length]<1) { [dictionary setObject:@"Unknown" forKey:@"size"]; } //NSLog(@"***************歌曲信息:%@",dictionary); //返回字典 return dictionary; } return nil; }else{ //重新请求,直到获取成功 [self getMusicInfoByJumpToUrl:jumpToUrl]; } } return nil; } - (void)runToGetSongInfoFromSogouWithKeyword:(NSString*)kw pageNumber:(NSInteger)pgNum{ if (kw && [kw length]) { NSMutableArray *songsInfoArr = [NSMutableArray arrayWithCapacity:0]; NSArray *songsURLsArr = [self getJumpToDownloadPageURLsWithKeyword:kw pageNumber:pgNum]; //如果第一次请求失败,再次请求 if (!songsInfoArr || [songsInfoArr count]<1) { songsURLsArr = [self getJumpToDownloadPageURLsWithKeyword:kw pageNumber:pgNum]; } //如果第二次请求失败,再次请求 if (!songsInfoArr || [songsInfoArr count]<1) { songsURLsArr = [self getJumpToDownloadPageURLsWithKeyword:kw pageNumber:pgNum]; } if (songsURLsArr && [songsURLsArr count]) { for (NSString *url in songsURLsArr) { NSDictionary *songInfo = [self getMusicInfoByJumpToUrl:url]; if (songInfo && [songInfo count]) { [songsInfoArr addObject:songInfo]; } } } if ([songsInfoArr count]) { [[NSNotificationCenter defaultCenter] postNotificationName:SogouMusicParseSuccessNotification object:nil userInfo:[NSDictionary dictionaryWithObject:songsInfoArr forKey:@"songsInfo"]]; }else{ [[NSNotificationCenter defaultCenter] postNotificationName:SogouMusicParseFailedNotification object:nil userInfo:[NSDictionary dictionaryWithObject:@"This page does not exist" forKey:@"msg"]]; } }else{ [[NSNotificationCenter defaultCenter] postNotificationName:SogouMusicParseFailedNotification object:nil userInfo:[NSDictionary dictionaryWithObject:@"Check what you've been input" forKey:@"msg"]]; } } @end
[3] 展示PopupWindow
来源: 互联网 发布时间: 2014-02-18
显示PopupWindow
PopupWindow可以实现浮层效果,而且可以自定义显示位置,出现和退出时的动画,比如新浪微博顶部栏的微博分组就是用PopupWindow实现的。
一、实例化PopupWindow,这里用R.layout.group_list填充mPopupWindow,并指定宽高。
二、指定PopupWindow的显示位置
也可使用下面方法
三、为PopupWindow指定动画
先定义动画
PopupWindow出现时的动画,popup_enter.xml
PopupWindow消失时的动画,popup_exit.xml
再设定动画的style
最后通过Java代码设置动画
PopupWindow可以实现浮层效果,而且可以自定义显示位置,出现和退出时的动画,比如新浪微博顶部栏的微博分组就是用PopupWindow实现的。
一、实例化PopupWindow,这里用R.layout.group_list填充mPopupWindow,并指定宽高。
mPopupLayout = getLayoutInflater().inflate(R.layout.group_list, null); mPopupWindow = new PopupWindow(mPopupLayout, width, height, true);
二、指定PopupWindow的显示位置
//mAncorView是页面中的某个View,默认是将mPopupWindow与mAncorView的左下角对齐,如果空间不够显示,则将将mPopupWindow与mAncorView的左上角对齐。offsetX和offsetY是mPopupWindow位置的相对偏移,很容易理解。 mPopupWindow.showAsDropDown(mAncorView, offsetX, offsetY);
也可使用下面方法
//下面的方法是用屏幕上的绝对坐标显示,mPopupWindow //我们往往不知道mPopupWindow要显示的精确位置,通常先计算页面上某个元素mView的位置,在进行偏移 //得到mView在屏幕中的坐标 int [] pos = new int[2]; mView.getLocationOnScreen(pos); offsetY = pos[1] + mView.getHeight(); offsetX = 0; //显示mPopupWindow mPopupWindow.showAtLocation(mView, Gravity.TOP|Gravity.CENTER_HORIZONTAL, offsetX, offsetY);//这里的第一个参数没搞明白什么用,android官方文档说是为了获取token
三、为PopupWindow指定动画
先定义动画
PopupWindow出现时的动画,popup_enter.xml
<?xml version="1.0" encoding="utf-8"?> <set xmlns:android="http://schemas.android.com/apk/res/android"> <scale android:fromXScale="0.6" android:toXScale="1.0" android:fromYScale="0.6" android:toYScale="1.0" android:pivotX="50%" android:pivotY="50%" android:duration="1000" /> <alpha android:interpolator="@android:anim/decelerate_interpolator" android:fromAlpha="0.0" android:toAlpha="1.0" android:duration="1000" /> </set>
PopupWindow消失时的动画,popup_exit.xml
<?xml version="1.0" encoding="utf-8"?> <set xmlns:android="http://schemas.android.com/apk/res/android"> <scale android:fromXScale="1.0" android:toXScale="0.5" android:fromYScale="1.0" android:toYScale="0.5" android:pivotX="50%" android:pivotY="50%" android:duration="500" /> <alpha android:interpolator="@android:anim/accelerate_interpolator" android:fromAlpha="1.0" android:toAlpha="0.0" android:duration="500" /> </set>
再设定动画的style
<style name="PopupAnimation" parent="android:Animation"> <item name="android:windowEnterAnimation">@anim/popup_enter</item> <item name="android:windowExitAnimation">@anim/popup_exit</item> </style>
最后通过Java代码设置动画
mPopupWindow.setAnimationStyle(R.style.PopupAnimation);
最新技术文章: