当前位置:  编程技术>移动开发
本页文章导读:
    ▪(断点续传-原理篇)        (断点续传---原理篇) (一)断点续传的原理其实断点续传的原理很简单,就是在Http的请求上和一般的下载有所不同而已。打个比方,浏览器请求服务器上的一个文时,所发出的请求如下:.........
    ▪ UITableView高度从適應        UITableView高度自適應 - (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath { // 列寬 CGFloat contentWidth = self.tableView.frame.size.width; // 用何種字體進行顯示 UIFont *font = [UIFont s.........
    ▪ 導航加入效能按鈕       導航加入功能按鈕 UIBarButtonItem *takeGoods = [[[UIBarButtonItem alloc] init] autorelease]; [takeGoods setAction:@selector(takeGoods:)]; [takeGoods setTarget:self]; takeGoods.title = @"購買"; [self.navigationItem setRightBarButtonItem.........

[1](断点续传-原理篇)
    来源: 互联网  发布时间: 2014-02-18
(断点续传---原理篇)
(一)断点续传的原理

其实断点续传的原理很简单,就是在Http的请求上和一般的下载有所不同而已。打个比方,浏览器请求服务器上的一个文时,所发出的请求如下:

假设服务器域名为wwww.sjtu.edu.cn,文件名为down.zip。

GET /down.zip HTTP/1.1

Accept: image/gif, image/x-xbitmap, image/jpeg, image/pjpeg, application/vnd.ms-

excel, application/msword, application/vnd.ms-powerpoint, */*

Accept-Language: zh-cn

Accept-Encoding: gzip, deflate

User-Agent: Mozilla/4.0 (compatible; MSIE 5.01; Windows NT 5.0)

Connection: Keep-Alive

服务器收到请求后,按要求寻找请求的文件,提取文件的信息,然后返回给浏览器,返回信息如下:

200

Content-Length=106786028

Accept-Ranges=bytes

Date=Mon, 30 Apr 2001 12:56:11 GMT

ETag=W/"02ca57e173c11:95b"

Content-Type=application/octet-stream

Server=Microsoft-IIS/5.0

Last-Modified=Mon, 30 Apr 2001 12:56:11 GMT

所谓断点续传,也就是要从文件已经下载的地方开始继续下载。所以在客户端浏览器传给

Web服务器的时候要多加一条信息--从哪里开始。

下面是用自己编的一个"浏览器"来传递请求信息给Web服务器,要求从2000070字节开始。

GET /down.zip HTTP/1.0

User-Agent: NetFox

RANGE: bytes=2000070-

Accept: text/html, image/gif, image/jpeg, *; q=.2, */*; q=.2

仔细看一下就会发现多了一行RANGE: bytes=2000070-;这一行的意思就是告诉服务器down.zip这个文件从2000070字节开始传,前面的字节不用传了。

服务器收到这个请求以后,返回的信息如下:

206

Content-Length=106786028

Content-Range=bytes 2000070-106786027/106786028

Date=Mon, 30 Apr 2001 12:55:20 GMT

ETag=W/"02ca57e173c11:95b"

Content-Type=application/octet-stream

Server=Microsoft-IIS/5.0

Last-Modified=Mon, 30 Apr 2001 12:55:20 GMT

和前面服务器返回的信息比较一下,就会发现增加了一行:

Content-Range=bytes 2000070-106786027/106786028

返回的代码也改为206了,而不再是200了。

知道了以上原理,就可以进行断点续传的编程了。


(二)Java实现断点续传的关键几点

(1)用什么方法实现提交RANGE: bytes=2000070-。

当然用最原始的Socket是肯定能完成的,不过那样太费事了,其实Java的net包中提供了这种功能。代码如下:

URL url = new URL(" http://www.sjtu.edu.cn/down.zip";;);

HttpURLConnection httpConnection = (HttpURLConnection)url.openConnection();

//设置User-Agent

httpConnection.setRequestProperty("User-Agent","NetFox");

//设置断点续传的开始位置

httpConnection.setRequestProperty("RANGE","bytes=2000070");

//获得输入流

InputStream input = httpConnection.getInputStream();

从输入流中取出的字节流就是down.zip文件从2000070开始的字节流。大家看,其实断点续传用Java实现起来还是很简单的吧。接下来要做的事就是怎么保存获得的流到文件中去了。

保存文件采用的方法

采用IO包中的RandAccessFile类。

操作相当简单,假设从2000070处开始保存文件,代码如下:


RandomAccess oSavedFile = new RandomAccessFile("down.zip","rw");
long nPos = 2000070;
//定位文件指针到nPos位置
oSavedFile.seek(nPos);
byte[] b = new byte[1024];
int nRead;
//从输入流中读入字节流,然后写到文件中
while((nRead=input.read(b,0,1024)) > 0)
{
 oSavedFile.write(b,0,nRead);
}

    
[2] UITableView高度从適應
    来源: 互联网  发布时间: 2014-02-18
UITableView高度自適應

- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath {
	// 列寬
	CGFloat contentWidth = self.tableView.frame.size.width;
	// 用何種字體進行顯示
	UIFont *font = [UIFont systemFontOfSize:13];
	
	// 該行要顯示的內容
	NSString *content = [data objectAtIndex:indexPath.row];
	// 計算出顯示完內容需要的最小尺寸
	CGSize size = [content sizeWithFont:font constrainedToSize:CGSizeMake(contentWidth, 1000) lineBreakMode:UILineBreakModeWordWrap];
	
	// 這裏返回需要的高度
	return size.height; 
}

// Customize the appearance of table view cells.
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
    
    static NSString *CellIdentifier = @"Cell";
    // 列寬
	CGFloat contentWidth = self.tableView.frame.size.width;
	// 用何種字體進行顯示
	UIFont *font = [UIFont systemFontOfSize:13];
	
	// 該行要顯示的內容
	NSString *content = [data objectAtIndex:indexPath.row];
	// 計算出顯示完內容需要的最小尺寸
	CGSize size = [content sizeWithFont:font constrainedToSize:CGSizeMake(contentWidth, 1000) lineBreakMode:UILineBreakModeWordWrap];
	
	// 構建顯示行
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
	if (cell == nil) {
        cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier] autorelease];
    }
	
	CGRect rect = [cell.textLabel textRectForBounds:cell.textLabel.frame limitedToNumberOfLines:0];
	// 設置顯示榘形大小
	rect.size = size;
	// 重置列文本區域
	cell.textLabel.frame = rect;
    
	cell.textLabel.text = content;
	
	// 設置自動換行(重要)
	cell.textLabel.numberOfLines = 0;
	// 設置顯示字體(一定要和之前計算時使用字體一至)
	cell.textLabel.font = font;

    return cell;
}


UILabel宽高自适应可以:
sizeToFit

    
[3] 導航加入效能按鈕
    来源: 互联网  发布时间: 2014-02-18
導航加入功能按鈕
UIBarButtonItem *takeGoods = [[[UIBarButtonItem alloc] init] autorelease];
[takeGoods setAction:@selector(takeGoods:)];
[takeGoods setTarget:self];
	
	
takeGoods.title = @"購買";
	
[self.navigationItem setRightBarButtonItem:takeGoods];

    
最新技术文章:
▪Android开发之登录验证实例教程
▪Android开发之注册登录方法示例
▪Android获取手机SIM卡运营商信息的方法
▪Android实现将已发送的短信写入短信数据库的...
▪Android发送短信功能代码
▪Android根据电话号码获得联系人头像实例代码
▪Android中GPS定位的用法实例
▪Android实现退出时关闭所有Activity的方法
▪Android实现文件的分割和组装
▪Android录音应用实例教程
▪Android双击返回键退出程序的实现方法
▪Android实现侦听电池状态显示、电量及充电动...
▪Android获取当前已连接的wifi信号强度的方法
▪Android实现动态显示或隐藏密码输入框的内容
▪根据USER-AGENT判断手机类型并跳转到相应的app...
▪Android Touch事件分发过程详解
▪Android中实现为TextView添加多个可点击的文本
数据库 iis7站长之家
▪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