特定于平台的库

每个程序员都知道应该将可重用的代码放在库中,对于依赖服务使用的代码也是如此。这里开发的异步文件I / O函数将在第24章的NoteTaker程序中重用,您可能希望在自己的应用程序中使用这些函数,或者开发自己的函数。
但是,这些文件I / O类不能只放在一个库中。 FileHelper的各种平台实现必须位于该特定平台的库中。这需要为每个平台分别创建库。
本书可下载代码的Libraries目录包含一个名为Xamarin.FormsBook.Platform的解决方案。该名称的平台部分受到各种Xamarin.Forms.Platform库的启发。各种平台中的每一个都是此解决方案中的独立库。
Xamarin.FormsBook.Platform解决方案包含不少于七个库项目,每个项目的创建方式都有所不同:

  • Xamarin.FormsBook.Platform是一个普通的Xamarin.Forms可移植类库,其配置文件为111,这意味着它可以被所有平台访问。 您可以通过选择“添加新项目”对话框左侧的“交叉平台”和中心区域中的“类库(Xamarin.Forms)”,在Visual Studio中创建此类库。 在Xamarin Studio New Project对话框中,选择左侧的Multiplatform和Library,以及中心区域的Xamarin.Forms和Class Library。
  • Xamarin.FormsBook.Platform.iOS是在Visual Studio中创建的,方法是在“添加新项目”对话框的左栏中选择iOS,在中央部分选择“类库”(iOS)。在Xamarin Studio中,在New Project对话框中选择iOS和Library,在中心区域选择Class Library。
  • Xamarin.FormsBook.Platform.Android是在Visual Studio中创建的,方法是在“添加新项目”对话框的左侧选择Android,在中央部分选择“类库”(Android)。在Xamarin.Studio中,选择左侧的Android和Library以及中央部分的Class Library。
  • Xamarin.FormsBook.Platform.UWP是适用于Windows 10和Windows 10 Mobile的库。它是在Visual Studio中通过选择左侧的Windows和Universal,然后选择类库(通用Windows)创建的。
  • Xamarin.FormsBook.Platform.Windows是一个适用于Windows 8.1的可移植类库。它是在Visual Studio中通过选择左侧的Windows,Windows 8和Windows,然后选择类库(Windows 8.1)创建的。
  • Xamarin.FormsBook.Platform.WinPhone是一个适用于Windows Phone 8.1的可移植类库。它是在Visual Studio中通过选择左侧的Windows,Windows 8和Windows Phone,然后选择类库(Windows Phone)创建的。
  • 您经常会发现三个Windows平台可以共享代码,因为它们都使用Windows运行时API的变体。出于这个原因,创建了第七个项目名为Xamarin.FormsBook.Platform.WinRT。这是一个共享项目,它是在Visual Studio中通过在“添加新项目”对话框中搜索“共享”,并为C#选择共享项目而创建的。
    如果您自己创建这样的解决方案,则还需要使用Manage Packages for Solution对话框为所有这些库安装相应的Xamarin.Forms NuGet包。

您还需要在解决方案中的各个项目之间建立引用。 所有单个平台项目(Xamarin.FormsBook.Platform.WinRT除外)都需要引用Xamarin.FormsBook.Platform。 您可以通过选择左侧的Solution在Reference Manager对话框中设置这些引用。 此外,三个Windows项目(UWP,Windows和WinPhone)都需要引用共享的Xamarin.FormsBook.Platform.WinRT项目。 通过选择左侧的“共享项目”,可以在“参考管理器”对话框中设置这些引用
所有项目都有一个静态的Toolkit.Init方法。 这是Xamarin.Forms中的一个?Book.Platform库:

namespace Xamarin.FormsBook.Platform
{public static class Toolkit{public static void Init(){}}
}

除了Android库中的版本实际上保存了一些可能对此库中实现的类有用的信息之外,其他大多数都是相似的:

namespace Xamarin.FormsBook.Platform.Android
{public static class Toolkit{public static void Init(Activity activity, Bundle bundle){Activity = activity;}public static Activity Activity { private set; get; }}
}

每个Windows平台中的Toolkit.Init方法都调用do-nothing Toolkit.Init
共享Xamarin.FormsBook.Platform.WinRT项目中的方法:

namespace Xamarin.FormsBook.Platform.UWP
{public static class Toolkit{public static void Init(){Xamarin.FormsBook.Platform.WinRT.Toolkit.Init();}}
}

这些方法的目的是确保库绑定到应用程序,即使应用程序不直接访问库中的任何内容。 当您使用依赖服务和自定义渲染器时,应用程序不会直接调用任何库函数。 但是,如果您稍后发现确实需要执行某些库初始化,则此方法已存在。
您将发现本书可下载代码中包含的Xamarin.FormsBook.Platform库的版本已包含第9章“特定于平台的API调用”中的PlatformSoundPlayer类。您还将看到一些以 单词Ellipse和StepSlider。 这些将在第27章“自定义渲染器”中讨论。
让我们关注新的异步FileHelper类。 Xamarin.FormsBook.Platform库包含新的IFileHelper接口:

using System.Collections.Generic;
using System.Threading.Tasks;
namespace Xamarin.FormsBook.Platform
{public interface IFileHelper{Task<bool> ExistsAsync(string filename);Task WriteTextAsync(string filename, string text);Task<string> ReadTextAsync(string filename);Task<IEnumerable<string>> GetFilesAsync();Task DeleteAsync(string filename);}
}

按照惯例,返回Task对象的方法的后缀为Async。
所有三个Windows平台都可以共享相同的FileHelper类,因此这个共享类是在共享的Xamarin.FormsBook.Platform.WinRT项目中实现的。 FileHelper类中的五个方法中的每一个都以调用来开始,以获取与应用程序的本地存储区域关联的StorageFolder。 它们中的每一个都使用await进行异步调用,并使用async关键字进行标记:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using Windows.Storage;
using Xamarin.Forms;
[assembly: Dependency(typeof(Xamarin.FormsBook.Platform.WinRT.FileHelper))]
namespace Xamarin.FormsBook.Platform.WinRT
{class FileHelper : IFileHelper{public async Task<bool> ExistsAsync(string filename){StorageFolder localFolder = ApplicationData.Current.LocalFolder;try{await localFolder.GetFileAsync(filename);}catch{return false;}return true;}public async Task WriteTextAsync(string filename, string text){StorageFolder localFolder = ApplicationData.Current.LocalFolder;IStorageFile storageFile = await localFolder.CreateFileAsync(filename, CreationCollisionOption.ReplaceExisting);await FileIO.WriteTextAsync(storageFile, text);}public async Task<string> ReadTextAsync(string filename){StorageFolder localFolder = ApplicationData.Current.LocalFolder;IStorageFile storageFile = await localFolder.GetFileAsync(filename);return await FileIO.ReadTextAsync(storageFile);}public async Task<IEnumerable<string>> GetFilesAsync(){StorageFolder localFolder = ApplicationData.Current.LocalFolder;IEnumerable<string> filenames =from storageFile in await localFolder.GetFilesAsync()select storageFile.Name;return filenames;}public async Task DeleteAsync(string filename){StorageFolder localFolder = ApplicationData.Current.LocalFolder;StorageFile storageFile = await localFolder.GetFileAsync(filename);await storageFile.DeleteAsync();}}
}

你的支持是我继续的动力啊。

第二十章:异步和文件I/O.(十一)相关推荐

  1. 鸟哥的Linux私房菜(服务器)- 第二十章、WWW 伺服器

    第二十章.WWW 伺服器 最近更新日期:2011/08/05 我們最常講的『架站』其實就是架設一個 Web 網站啦!那麼什麼是 Web 呢?那就是全球資訊廣播的意思 (World Wide Web), ...

  2. 鸟哥的Linux私房菜(基础篇)- 第二十章、启动流程、模块管理与 Loader

    第二十章.启动流程.模块管理与 Loader 最近升级日期:2009/09/14 系统启动其实是一项非常复杂的程序,因为核心得要侦测硬件并加载适当的驱动程序后,接下来则必须要呼叫程序来准备好系统运行的 ...

  3. activiti高亮显示图片_【正点原子FPGA连载】第二十章SD卡读BMP图片HDMI显示实验领航者 ZYNQ 之嵌入式开发指南...

    1)实验平台:正点原子领航者ZYNQ开发板 2)平台购买地址:https://item.taobao.com/item.htm?&id=606160108761 3)全套实验源码+手册+视频下 ...

  4. 修改dts后重编译_「正点原子FPGA连载」第二十章另一种方式编译ZYNQ镜像

    1)摘自[正点原子]领航者 ZYNQ 之linux驱动开发指南 2)实验平台:正点原子领航者ZYNQ开发板 3)平台购买地址:https://item.taobao.com/item.htm?& ...

  5. 【正点原子Linux连载】第二十章 V4L2摄像头应用编程-摘自【正点原子】I.MX6U嵌入式Linux C应用编程指南V1.1

    1)实验平台:正点原子阿尔法Linux开发板 2)平台购买地址:https://item.taobao.com/item.htm?id=603672744434 2)全套实验源码+手册+视频下载地址: ...

  6. 【正点原子FPGA连载】 第二十章 LCD触摸屏实验摘自【正点原子】DFZU2EG/4EV MPSoC 之FPGA开发指南V1.0

    1)实验平台:正点原子MPSoC开发板 2)平台购买地址:https://detail.tmall.com/item.htm?id=692450874670 3)全套实验源码+手册+视频下载地址: h ...

  7. 第十章、epub文件处理 -- 样式处理

    https://github.com/geometer/FBReaderJ 第十章.epub文件处理 -- 样式处理 这一章的内容比较简单,因为第九章中集中了篇幅介绍显示的流程,所以把处理样式的流程单 ...

  8. 【OpenCV 学习笔记】第二十章: 角点检测之:harris算法以及Shi-Tomasi算法

    第二十章: 角点检测之:harris算法以及Shi-Tomasi算法 一张图像,我们可以用很多方法去处理它,就会得到很多不同的特征.比如基于梯度方法我们就能得到图像的边缘特征:比如基于直方图我们就得到 ...

  9. 【正点原子STM32连载】第二十章 基本定时器实验 摘自【正点原子】MiniPro STM32H750 开发指南_V1.1

    1)实验平台:正点原子MiniPro H750开发板 2)平台购买地址:https://detail.tmall.com/item.htm?id=677017430560 3)全套实验源码+手册+视频 ...

  10. 【正点原子MP157连载】第二十章 字符设备驱动开发-摘自【正点原子】STM32MP1嵌入式Linux驱动开发指南V1.7

    1)实验平台:正点原子STM32MP157开发板 2)购买链接:https://item.taobao.com/item.htm?&id=629270721801 3)全套实验源码+手册+视频 ...

最新文章

  1. JaveWeb 公司项目(4)----- Easyui的表单验证
  2. Linux的软件包封装格式有,linux软件安装包详解---全
  3. JEECG - 基于代码生成器的J2EE智能开发框架 续一:开发环境搭建步骤
  4. python 爬虫库比较_公认8个效率最高的爬虫框架
  5. 学生成绩管理系统实验报告_学习60天python成果,Python变成学生成绩管理系统
  6. CryptoQuant CEO:比特币大规模从Coinbase流出是最强劲的看涨信号
  7. java三星题之_JAVA三星题之playing a TicTacToe game
  8. Git fatal: write error: Broken pipe
  9. 图像/视频超分之降质过程
  10. Java 并发编程常识 —— by 梁飞
  11. 微型计算机忘记密码,一种基于微型计算机的密码锁的制作方法
  12. 第六章 现在给我道歉还来得及~修改登录cookie进后台上传muma
  13. Codeforces Round #570 (Div. 3)B. Equalize Prices
  14. 常用技巧精选(一)尺取法
  15. 灵机一动-趣味问题种种
  16. gin 无法获取ajax数据,新鸟入gin的坑,求问如何对post的json数据进行绑定?
  17. 触心创业路 - 记一家VR游戏创业团队的经历
  18. python自动化定位方式
  19. 智能手机硬件加速及虚拟内存利弊分析
  20. MQ消息的自动应答和手动应答| RabbitMQ系列(三)

热门文章

  1. 基于Transformer的高效、低延时、流式语音识别模型
  2. GPU 「抗压」不行还费电,FPGA将成深度学习「新基建」
  3. 百度开源业内首个口罩人脸检测及分类模型,携手开发者共同抗疫
  4. 云从科技上交大提出DCMN+ 模型,在多项阅读理解数据集上成绩领先
  5. 热潮下的冷思考,人工智能即将改变的三大领域
  6. 向类脑芯片迈进!科学家制造出光基人工神经元网络芯片
  7. 英特尔CEO:英特尔下一个市场将是无人驾驶汽车
  8. 「特征工程」与「表示学习」
  9. 大科学时代,指数级增长的科学仍然拥有前所未有的朝气与活力
  10. MIT博士用概率编程让AI和人类一样看三维|NeurIPS 2021