热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

深入学习WindowsPhone7(一.ReactiveExtension)

题外话首先感谢一直关注我博客的博友们!使我有动力一直写下去。通过几个月对WindowsPhone7的学习后,对它又有了更深入的学习和了解,

                                                                    题外话

     首先感谢一直关注我博客的博友们!使我有动力一直写下去。通过几个月对Windows Phone7的学习后,对它又有了更深入的学习和了解,所以我又开了一个新章节,来把我学到的东西分享出来。也希望大家继续支持我,一起进步。

 

 

 

Reactive Extension for .Net framework

.Net反应性框架,在之前的.net框架中就已经有了,没想到也被应用到Windows phone7中来了。

程序员为指定异步操作指定回调,或事件处理程序的时候使用反应性编程。在异步操作完成或者事件触发的时候,就会调用方法并作为对该事件的反应。在这个模型中,数据流、异步请求、事件都可以做为可观察序列,并且接收异步消息,并通过LINQ来合成这些序列。

不过在Phone7中,这个框架只有一部分有用,主要用在:filtering eventscomposing multiple asynchronous web service requestsemulating data streams.

 

对于目前来说,在模拟器上没有办法测试AccelerometerLocationAPI,就是因为得不到数据。现在可以利用这个框架来实现数据模拟了。

 

模拟Accelerometer数据:

Thread thread = new Thread(StartAccelerometerEmulation);

thread.Start();

 

am = new Accelerometer();

var aro &#61; Observable.FromEvent<AccelerometerReadingEventArgs>(

eh &#61;> am.ReadingChanged &#43;&#61; eh,

eh &#61;> am.ReadingChanged -&#61; eh);

 

try

{

     am.Start();

}

catch (AccelerometerFailedException ae)

{

}

 

void InvokeAccelerometerReadingChanged(Vector3 data)

{

    Deployment.Current.Dispatcher.BeginInvoke(() &#61;> AccelerometerReadingChanged(data));

}

void AccelerometerReadingChanged(Vector3 data)

{

     this.textBlock1.Text &#61; "x: " &#43; data.X.ToString("0.00");

     this.textBlock2.Text &#61; " y: " &#43; data.Y.ToString("0.00");

     this.textBlock3.Text &#61; " z: " &#43; data.Z.ToString("0.00");

}

 

private void StartAccelerometerEmulation()

{

    var emulationDataAsObservable &#61; EmulateAccelerometerReading().ToObservable();

    emulationDataAsObservable.Subscribe(args &#61;> InvokeAccelerometerReadingChanged(args));

}

 

static IEnumerable<Vector3> EmulateAccelerometerReading()

{

    Random random &#61; new Random();

 

for (double theta &#61; 0; ; theta &#43;&#61; .1)

    {

   

        Vector3 reading &#61; new Vector3((float)Math.Sin(theta), (float)Math.Cos(theta * 1.1), (float)Math.Sin(theta * .7));

        reading.Normalize();

 

        if (random.NextDouble() > .95)

        {

             reading &#61; new Vector3((float)(random.NextDouble() * 3.0 - 1.5),

                     (float)(random.NextDouble() * 3.0 - 1.5),

                     (float)(random.NextDouble() * 3.0 - 1.5));

 

         }

 

          yield return reading;

         Thread.Sleep(200);

  }

}

 

 

 

 

模拟Location数据&#xff1a;

Thread t &#61; new Thread(StartLocationEmulation);

t.Start();

 

watcher &#61; new GeoCoordinateWatcher(GeoPositionAccuracy.Default);

watcher.MovementThreshold &#61; 35;

 

var gcwo &#61; Observable.FromEvent<GeoPositionChangedEventArgs<GeoCoordinate>>(

eh &#61;>watcher.PositionChanged &#43;&#61;eh,

eh &#61;>watcher.PositionChanged -&#61;eh);

 

watcher.Start();

 

private void StartLocationEmulation()

{

     var position &#61; EmulatePositionChangedEvents().ToObservable();

     position.Subscribe(ev &#61;> wait_PositionChanged(null, ev));

}

 

static IEnumerable<GeoPositionChangedEventArgs<GeoCoordinate>> EmulatePositionChangedEvents()

{

     Random random &#61; new Random();

     while (true)

     {

        double latitude &#61; (random.NextDouble() * 180.0) - 90.0; // latitude is between -90 and 90

        double longitude &#61; (random.NextDouble() * 360.0) - 180.0; // longitude is between -180 and 180

        yield return new GeoPositionChangedEventArgs<GeoCoordinate>(

        new GeoPosition<GeoCoordinate>(DateTimeOffset.Now, new GeoCoordinate(latitude, longitude)));

 

         Thread.Sleep(random.Next(2000));

       }

}

 

private void wait_PositionChanged(object sender, GeoPositionChangedEventArgs<GeoCoordinate> e)

{

    Deployment.Current.Dispatcher.BeginInvoke(()&#61;>MyPositionChanged(e));

}

 

private void MyPositionChanged(GeoPositionChangedEventArgs<GeoCoordinate> e)

{

   this.textBlock1.Text &#61; "Time: " &#43; e.Position.Timestamp. ToString("yyyy-MM-dd hh:mm:ss");

   this.textBlock2.Text &#61; "Latitude: " &#43; e.Position.Location.Latitude.ToString("0.00");

   this.textBlock3.Text &#61; "Longitude: " &#43; e.Position.Location.Longitude.ToString("0.00");

}

 

 

 

 



推荐阅读
  • 本文介绍了C#中生成随机数的三种方法,并分析了其中存在的问题。首先介绍了使用Random类生成随机数的默认方法,但在高并发情况下可能会出现重复的情况。接着通过循环生成了一系列随机数,进一步突显了这个问题。文章指出,随机数生成在任何编程语言中都是必备的功能,但Random类生成的随机数并不可靠。最后,提出了需要寻找其他可靠的随机数生成方法的建议。 ... [详细]
  • Android自定义控件绘图篇之Paint函数大汇总
    本文介绍了Android自定义控件绘图篇中的Paint函数大汇总,包括重置画笔、设置颜色、设置透明度、设置样式、设置宽度、设置抗锯齿等功能。通过学习这些函数,可以更好地掌握Paint的用法。 ... [详细]
  • SpringBoot uri统一权限管理的实现方法及步骤详解
    本文详细介绍了SpringBoot中实现uri统一权限管理的方法,包括表结构定义、自动统计URI并自动删除脏数据、程序启动加载等步骤。通过该方法可以提高系统的安全性,实现对系统任意接口的权限拦截验证。 ... [详细]
  • Java容器中的compareto方法排序原理解析
    本文从源码解析Java容器中的compareto方法的排序原理,讲解了在使用数组存储数据时的限制以及存储效率的问题。同时提到了Redis的五大数据结构和list、set等知识点,回忆了作者大学时代的Java学习经历。文章以作者做的思维导图作为目录,展示了整个讲解过程。 ... [详细]
  • 本文介绍了如何使用C#制作Java+Mysql+Tomcat环境安装程序,实现一键式安装。通过将JDK、Mysql、Tomcat三者制作成一个安装包,解决了客户在安装软件时的复杂配置和繁琐问题,便于管理软件版本和系统集成。具体步骤包括配置JDK环境变量和安装Mysql服务,其中使用了MySQL Server 5.5社区版和my.ini文件。安装方法为通过命令行将目录转到mysql的bin目录下,执行mysqld --install MySQL5命令。 ... [详细]
  • 深入理解Kafka服务端请求队列中请求的处理
    本文深入分析了Kafka服务端请求队列中请求的处理过程,详细介绍了请求的封装和放入请求队列的过程,以及处理请求的线程池的创建和容量设置。通过场景分析、图示说明和源码分析,帮助读者更好地理解Kafka服务端的工作原理。 ... [详细]
  • Imtryingtofigureoutawaytogeneratetorrentfilesfromabucket,usingtheAWSSDKforGo.我正 ... [详细]
  • 恶意软件分析的最佳编程语言及其应用
    本文介绍了学习恶意软件分析和逆向工程领域时最适合的编程语言,并重点讨论了Python的优点。Python是一种解释型、多用途的语言,具有可读性高、可快速开发、易于学习的特点。作者分享了在本地恶意软件分析中使用Python的经验,包括快速复制恶意软件组件以更好地理解其工作。此外,作者还提到了Python的跨平台优势,使得在不同操作系统上运行代码变得更加方便。 ... [详细]
  • 本文介绍了作者在开发过程中遇到的问题,即播放框架内容安全策略设置不起作用的错误。作者通过使用编译时依赖注入的方式解决了这个问题,并分享了解决方案。文章详细描述了问题的出现情况、错误输出内容以及解决方案的具体步骤。如果你也遇到了类似的问题,本文可能对你有一定的参考价值。 ... [详细]
  • 有没有一种方法可以在不继承UIAlertController的子类或不涉及UIAlertActions的情况下 ... [详细]
  • 如何在服务器主机上实现文件共享的方法和工具
    本文介绍了在服务器主机上实现文件共享的方法和工具,包括Linux主机和Windows主机的文件传输方式,Web运维和FTP/SFTP客户端运维两种方式,以及使用WinSCP工具将文件上传至Linux云服务器的操作方法。此外,还介绍了在迁移过程中需要安装迁移Agent并输入目的端服务器所在华为云的AK/SK,以及主机迁移服务会收集的源端服务器信息。 ... [详细]
  • 本文介绍了在使用Python中的aiohttp模块模拟服务器时出现的连接失败问题,并提供了相应的解决方法。文章中详细说明了出错的代码以及相关的软件版本和环境信息,同时也提到了相关的警告信息和函数的替代方案。通过阅读本文,读者可以了解到如何解决Python连接服务器失败的问题,并对aiohttp模块有更深入的了解。 ... [详细]
  • 在编写业务代码时,常常会遇到复杂的业务逻辑导致代码冗长混乱的情况。为了解决这个问题,可以利用中间件模式来简化代码逻辑。中间件模式可以帮助我们更好地设计架构和代码,提高代码质量。本文介绍了中间件模式的基本概念和用法。 ... [详细]
  • 本文讨论了如何在codeigniter中识别来自angularjs的请求,并提供了两种方法的代码示例。作者尝试了$this->input->is_ajax_request()和自定义函数is_ajax(),但都没有成功。最后,作者展示了一个ajax请求的示例代码。 ... [详细]
  • Java SE从入门到放弃(三)的逻辑运算符详解
    本文详细介绍了Java SE中的逻辑运算符,包括逻辑运算符的操作和运算结果,以及与运算符的不同之处。通过代码演示,展示了逻辑运算符的使用方法和注意事项。文章以Java SE从入门到放弃(三)为背景,对逻辑运算符进行了深入的解析。 ... [详细]
author-avatar
陈尧倩682
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有