博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
第二十章:异步和文件I/O.(十一)
阅读量:6330 次
发布时间:2019-06-22

本文共 5604 字,大约阅读时间需要 18 分钟。

特定于平台的库

每个程序员都知道应该将可重用的代码放在库中,对于依赖服务使用的代码也是如此。这里开发的异步文件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
ExistsAsync(string filename); Task WriteTextAsync(string filename, string text); Task
ReadTextAsync(string filename); Task
> 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
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
ReadTextAsync(string filename) { StorageFolder localFolder = ApplicationData.Current.LocalFolder; IStorageFile storageFile = await localFolder.GetFileAsync(filename); return await FileIO.ReadTextAsync(storageFile); } public async Task
> GetFilesAsync() { StorageFolder localFolder = ApplicationData.Current.LocalFolder; IEnumerable
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(); } }}

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

转载地址:http://anboa.baihongyu.com/

你可能感兴趣的文章
GIT常用命令整理
查看>>
win7下git使用
查看>>
使用PostgreSQL遇到的一个问题[column does not exist]字段不存在:
查看>>
(2)PyCharm开发Flash项目之蓝图构建
查看>>
java_oop_接口
查看>>
oracle故障解决
查看>>
数据库与数据仓库
查看>>
tcpdump
查看>>
谈谈我对Manacher算法的理解
查看>>
获取手机屏幕长宽
查看>>
备份MOSS应用程序
查看>>
数据库内存结构
查看>>
利用Shell开发跳板机功能脚本案例
查看>>
IT行业博客的成功关键——回复《IT行业博客网站分析与创新》
查看>>
通过实验取证ARP和免费ARP的工作原理
查看>>
51CTO的技术门诊谈OSSIM
查看>>
六年心路成长 —— 做自己
查看>>
Unix整理笔记——高级命令sed和awk——里程碑M10
查看>>
Linux系统详解 第六篇:系统的启动、登录、注销与开关机
查看>>
网络安全系列之二十六 EFS加密
查看>>