这是我关于以块的形式下载文件的问题的延续.解释会很大,所以我会尝试将它分成几个部分.
1)我试图做什么?
我正在为Window-Phone应用程序创建一个下载管理器.首先,我试图解决下载大文件的问题(解释在上一个问题中).不,我想添加"可恢复的下载"功能.
2)我已经做了什么.
目前,我有一个运行良好的下载管理器,可以包含Windows Phone RAM限制.这个管理器的情节是,它允许使用HTTP Range标头下载小块文件.
快速解释它的工作原理:
该文件以恒定大小的块的形式下载.我们称这个大小为"delta".下载文件块后,它将以附加模式保存到本地存储(硬盘,在WP上称为隔离存储)(因此,下载的字节数组始终添加到文件末尾).下载单个块后的语句
if (mediaFileLength >= delta) // mediaFileLength is a length of downloaded chunk
Run Code Online (Sandbox Code Playgroud)
检查.如果这是真的,那意味着还有一些东西需要下载,这个方法是递归调用的.否则就意味着,这个块是最后一个,并且没有什么可以下载的.
3)有什么问题?
直到我在一次性下载时使用这个逻辑(我的意思是,一次性开始下载文件并等到下载完成后),这种方式运行良好.但是,我决定,我需要"简历下载" 功能.所以,事实:
3.1)我知道,文件块大小是一个常量.
3.2)我知道,文件完全下载与否.(这是我的app逻辑的间接结果,不会因为解释而疲惫不堪,只是假设,这是事实)
假设这两个语句我可以证明,下载的块的数量等于 (CurrentFileLength)/ delta.其中CurrentFileLenght是已下载文件的大小(以字节为单位).
要继续下载文件,我应该只设置所需的标头并调用下载方法.那似乎是逻辑,不是吗?我试图实现它:
// Check file size
using (IsolatedStorageFileStream fileStream = isolatedStorageFile.OpenFile("SomewhereInTheIsolatedStorage", FileMode.Open, FileAccess.Read))
{
int currentFileSize = Convert.ToInt32(fileStream.Length);
int currentFileChunkIterator = currentFileSize / delta;
}
Run Code Online (Sandbox Code Playgroud)
我看到的结果是什么?下载的文件长度等于2432000字节(delta为304160,文件总大小约为4.5 MB,我们只下载了一半).结果大约是7,995.(它实际上有long/int类型,所以它是7而应该是8!)为什么会发生这种情况?简单的数学告诉我们,文件长度应该是2433280,所以给定的值非常接近,但不相等. …
在我的应用程序中,我可以从网上下载一些媒体文件.通常我使用WebClient.OpenReadCompleted方法下载,解密并将文件保存到IsolatedStorage.它运作良好,看起来像这样:
private void downloadedSong_OpenReadCompleted(object sender, OpenReadCompletedEventArgs e, SomeOtherValues someOtherValues) // delegate, uses additional values
{
// Some preparations
try
{
if (e.Result != null)
{
using (isolatedStorageFile = IsolatedStorageFile.GetUserStoreForApplication())
{
// working with the gained stream, decryption
// saving the decrypted file to isolatedStorage
isolatedStorageFileStream = new IsolatedStorageFileStream("SomeFileNameHere", FileMode.OpenOrCreate, isolatedStorageFile);
// and use it for MediaElement
mediaElement.SetSource(isolatedStorageFileStream);
mediaElement.Position = new TimeSpan(0);
mediaElement.MediaOpened += new RoutedEventHandler(mediaFile_MediaOpened);
// and some other work
}
}
}
catch(Exception ex)
{
// try/catch …Run Code Online (Sandbox Code Playgroud) 我正在尝试编写一对简单的"客户端应用程序"和"XPC服务".我能够从客户端启动xpc服务(即我可以看到在Activity监视器进程列表中运行的服务),但是当我尝试发送任何具有响应块的请求时,我收到错误:"无法与之通信帮助应用程序."
这里最糟糕的是错误没有给我任何关于出错的信息.而且我也无法正确调试服务.据我所知,正确的方法是附加一个调试器进行处理(Debug-> Attach to process,也见这里).我在一个工作区中同时拥有客户端和服务项目.
当我从xcode运行客户端并尝试将调试器附加到已启动的服务时,以"无法附加到pid:X"错误结束.
如果我存档客户端应用程序从app文件运行它然后尝试将调试器附加到服务结果是相同的.
从我能想象的服务中记录内容的唯一方法是编写一个记录器类,将数据写入某个文件.尚未尝试过这种方法,但这看起来很疯狂.
所以我的问题是:
a)如何在收到诸如"无法与帮助应用程序通信"这样的非信息性响应时找出问题所在?
b)而且,首先调试xpc服务的正确方法是什么?上面的链接从现在开始已有5年了,不过我可以看到有些人说"附加到调试器"无效.
代码本身很简单:
XPC服务,监听器实现:
#import "ProcessorListener.h"
@implementation ProcessorListener
- (BOOL)listener:(NSXPCListener *)listener shouldAcceptNewConnection:(NSXPCConnection *)newConnection
{
[newConnection setExportedInterface: [NSXPCInterface interfaceWithProtocol:@protocol(TestServiceProtocol)]];
[newConnection setExportedObject: self];
self.xpcConnection = newConnection;
newConnection.remoteObjectInterface = [NSXPCInterface interfaceWithProtocol: @protocol(Progress)];
// connections start suspended by default, so resume and start receiving them
[newConnection resume];
return YES;
}
- (void) sendMessageWithResponse:(NSString *)receivedString reply:(void (^)(NSString *))reply
{
reply = @"This is a response";
}
- (void) sendMessageWithNoResponse:(NSString *)mString
{
// no response …Run Code Online (Sandbox Code Playgroud) 实际上,这个问题是在开发Cordova应用程序时发现的,这就是为什么我无法切换到新的WebView但必须继续使用Cordova的扩展WebBrowser.但是我创建了一个没有Corodova的简单测试来验证问题是WebBrowser本身而不是Cordova.
我的测试页面有以下代码:
<!DOCTYPE html>
<html>
<head>
<title>Mobile sandbox</title>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, height=device-height, user-scalable=no">
<script type="text/javascript" src="libs/jquery/jquery.min.js"></script>
</head>
<body>
<style>
@-ms-viewport{width:device-width; height:device-height;} /* we need this because according to this article http://trentwalton.com/2013/01/16/windows-phone-8-viewport-fix/ meta viewport does not work across WP devices but -ms-viewport works */
html, body {
margin: 0;
padding: 0;
overflow: hidden; /* crop away everything, don't show scrollbars */
}
#allContainer {
top: 0px;
left: 0px;
right: 0px;
bottom: 0px;
background-color: green;
position: absolute; /* to make …Run Code Online (Sandbox Code Playgroud) 我正在使用flot库,并且在正确显示x轴标签时遇到一些问题.
如果我有一个测试数据数组,像这样:
var textData = ["51% <br> 101 <br> data1", "11% <br> 32 <br> data2", "26% <br> 64 <br> data3"];
Run Code Online (Sandbox Code Playgroud)
然后使用它以这种方式创建x轴标签:
xaxis: {
tickLength: 0,
show: true,
ticks: [[0, textData[0]], [1, textData[1]], [2, textData[2]]]
},
Run Code Online (Sandbox Code Playgroud)
工作正常:

这适用于测试一,但是,数据项的数量可能会有所不同,所以我应该动态创建x轴值.我试过这个:
xaxis: {
tickLength: 0,
show: true,
}
})
for (var i = 0; i < textData.length; i++) {
ticks.push(i, textData[i]);
}
Run Code Online (Sandbox Code Playgroud)
这将创建图表,但x轴标签将显示不正确:

任何帮助将不胜感激.