先吐槽一下,xamarin到现在为止,虽然开发一下应用尚可,对于一些简单的app开发使用xamarin-forms方式开发,虽然有一些优势,可以省下开发三个平台共同功能的时间,但是当我们随着项目深入的时候难免遇到需要在特点平台特性的问题,微软在xamarin中虽然提供了方法让我们使用自定义的平台特性,但是当我们重写三各平台特性的时候,总有让人砸掉电脑的冲动,不仅需要去研究三个平台的不同特性,而且还需要在三个平台同时重写,即使能参考原平台的代码,也由于微软的封装并不特别完美,导致在许多时候,我们需要花费大把的时间在重写上,由于当前的xamarin文档并不完整,而且版本更新频繁和不稳定(即使标志为稳定版),经常遇到无文档可以借鉴的尴尬,相对于原生平台开发,综合来看并不划算。

吐槽完毕,看下列问题,在app开发中经常用到listview这个控件,使用了这个控件难免的用到异步加载数据这种方式,但是在winRT内核中,我们申明的Task并不能去操作前天的主线程,所以,当我们使用Task加载数据返回呈现数据的时候,在IOS和android下没有问题的代码,在设置为UWP平台时就会报线程异常,不能对listview的数据源Add()、Insert()。这时需对UWP平台做特殊处理。方式代码如下:

if (Device.OS == TargetPlatform.Windows)
{
Device.BeginInvokeOnMainThread(() =>
{
mailList.Insert(index, mail);
});
}
//或者
if (Device.OS == TargetPlatform.Windows)
{
Device.BeginInvokeOnMainThread(() =>
{
mailList.Add(mail);
});
}

当我们申明listview的数据源类型为ObservableCollection<T>类型的时候,我们经常使用这个集合类来更改我们的数据,但是有用UWP的平台特性,使得我们在更改model的属性来更改显现效果时一样会报线程异常。

于是对应的要修改掉ObservableCollection<T>集合的OnPropertyChanged方法,示例如下:

     public class MailInfo : INotifyPropertyChanged
{
public event PropertyChangedEventHandler PropertyChanged;
void OnPropertyChanged([CallerMemberName] string propertyName = null)
{
var hanlder = PropertyChanged;
if (hanlder != null)
{
if (Device.OS == TargetPlatform.Windows)
{
Device.BeginInvokeOnMainThread(() =>
{
hanlder(this, new PropertyChangedEventArgs(propertyName));
});
}
else
{
hanlder(this, new PropertyChangedEventArgs(propertyName));
}
}
}
public MailInfo()
{ }
[PrimaryKey, AutoIncrement]
public int Id { get; set; }
/// <summary>
/// 发件人
/// </summary>
public string MailFrom { get; set; }
/// <summary>
/// 收件人
/// </summary>
public string MailTo { get; set; }
/// <summary>
/// 邮件标题
/// </summary>
public string Subject { get; set; } string detail;
/// <summary>
/// 邮件内容
/// </summary>
[Ignore]
public string Detail
{
get
{
return detail;
}
set
{
if (!value.Equals(detail, StringComparison.Ordinal))
{
detail = value; OnPropertyChanged("Detail");
}
}
} /// <summary>
/// 邮件唯一编号
/// </summary>
[Indexed]
public int UniqueID_Server { get; set; } MessageImportance importanceType;
/// <summary>
/// 邮件重要性 Low = 0,Normal = 1,High = 2,
/// </summary>
public MessageImportance MessageImportanceType
{
get
{
return importanceType;
}
set
{
if (!value.Equals(importanceType))
{
importanceType = value; OnPropertyChanged("MessageImportanceType");
}
}
} bool hasAttachment;
/// <summary>
/// 是否有附件
/// </summary>
[Ignore]
public bool HasAttachment
{
get
{
return hasAttachment;
}
set
{
if (!value.Equals(hasAttachment))
{
hasAttachment = value;
OnPropertyChanged("HasAttachment");
}
}
} }

MailInfo.cs

经以上处理可解决UWP线程冲突问题。如有更好方式,欢迎留言交流。

xamarin UWP平台线程交互问题的更多相关文章

  1. [译]:Xamarin.Android平台功能——位置服务

    返回索引目录 原文链接:Location Services. 译文链接:Xamarin.Android平台功能--位置服务 本部分介绍位置服务以及与如何使用位置提供商服务 Location Servi ...

  2. xamarin UWP ActivityIndicator

    在xamarin的UWP平台使用ActivityIndicator时,如果你时后台创建的这个对象,请设置他的宽度,不然在UWP平台下会发现找不这个对象,其实是在这个平台和特点版本下的宽度没设置,导致有 ...

  3. xamarin UWP图片读取

    xamarin使用listview时经常会使用图片,而图片的图片源设置在uwp平台中是有平台特性的,这点请注意区分处理.也就是说在android和IOS上正常的处理在uwp下却是错误的方式. 如同一张 ...

  4. xamarin UWP平台下 HUD 自定义弹窗

    在我的上一篇博客中我写了一个在xamarin的UWP平台下的自定义弹窗控件.在上篇文章中介绍了一种弹窗的写法,但在实际应用中发现了该方法的不足: 1.当弹窗出现后,我们拖动整个窗口大小的时候,弹窗的窗 ...

  5. Android的UI设计与后台线程交互

    本文将讨论Android应用程序的线程模型以及如何使用线程来处理耗时较长的操作,而不是在主线程中执行,保证用户界面(UI)的流畅运行.本文还将阐述一些用户界面(UI)中与线程交互的API.UI用户界面 ...

  6. android线程 Handler Message Queue AsyncTask线程模型 线程交互 + 修改Button样式 示例 最终easy整合版

     首先原谅我把文章的标题写的这么长.其实我还嫌弃它短了因为 写不下去了所以我就不写了.因为我实在不知道该怎么定义这篇文章的标题或许应该叫 "乱谈"比较合适. 这样可能还体现了 ...

  7. xamarin UWP证书问题汇总

    打算开发一个软件使用rsa加密的东西,所以有用到数字证书这块,最近遇到些问题, 问题一:使用如下代码添加数字证书后,在证书管理器的当前用户和本地计算机下都找不到这张证书. using (X509Sto ...

  8. 网络请求怎么样和UI线程交互? Activity2怎么通知Activity1 更新数据

    1.网络请求怎么样和UI线程交互? 目前我的做法是,建立线程池管理网络请求线程,通过添加task来新增网络请求.所有的网络操作通过统一的request来实现,网络返回结果通过回调onError和onS ...

  9. Android中UI线程与后台线程交互设计的5种方法

    我想关于这个话题已经有很多前辈讨论过了.今天算是一次学习总结吧. 在android的设计思想中,为了确保用户顺滑的操作体验.一 些耗时的任务不能够在UI线程中运行,像访问网络就属于这类任务.因此我们必 ...

随机推荐

  1. 1220 - Mysterious Bacteria--LightOj1220 (gcd)

    http://lightoj.com/volume_showproblem.php?problem=1220 题目大意: 给你一个x,求出满足 x=b^p, p最大是几. 分析:x=p1^a1*p2^ ...

  2. zabbix微信告警(虚拟机脚本测试成功,zabbix上收不到信息)

    前言: 使用zabbix直接运行脚本又可以正常接收.但是登录zabbix  web界面,测试!  动作显示已送达,但是微信并没有收到信息! 解决: 添加脚本参数,因为不添加脚本参数,调用不了你这个脚本 ...

  3. LNMP脚本安装

    #!/bin/bash#nginx:nginx-1.8.0.tar.gz#mysql:mysql-5.5.50.tar.gz#php:php-5.5.31.tar.gz#the software pa ...

  4. 电子数字 网易游戏在线笔试 第一题 hihocoder

    题目链接 http://hihocoder.com/contest/ntest2016spring1/problem/1 这个题目有几个算法考点: (1)对于一个LED数码管(由7个发光二极管封装在一 ...

  5. .NET 4.5+项目迁移.NET Core的问题记录

    .NET 4.5+项目迁移.NET Core的问题记录 这几天试着把目前的开发框架迁移到新的.net core平台,中间遇到的问题在这里简单记录一下. 迁移过程遇到的最大的问题IOC容器.我目前使用的 ...

  6. 位图图像处理控件ImageCapture Suite更新至v9.1

    概述:Dynamsoft公司旗下非常出名的位图图像处理控件ImageCapture Suite更新至了v9.1,这次新版本为Mac版本和IE 9新增了不少功能,同时还对其他组件的性能进行了质的提高! ...

  7. 使用ShareSDK一键分享

    首先需要到ShareSDK官方网站注册并且下载SDK,创建应用,获得ShareSDK的Appkey:文件如图: 在ShareSDK中打开即可:输入项目名称和包名,选择要分享的平台,点击确定会自动生成一 ...

  8. 这几天对Redis的初探,写一个阶段性的东西

    原来基于wcf写了一个交互框架,其中自定义了一个session队列,用于保存客户端连接的一些信息. 这几天在想如何将这个wcf框架做负载均衡,于是将session队列拆分出来,用一个共享的内存进行处理 ...

  9. SQL导入Excel文件

    如果表已存在,SQL语句为: insert into aa select * from OPENDATASOURCE('Microsoft.Jet.OLEDB.4.0', 'Data Source=D ...

  10. 命令行解析Crash文件

    做了快两年的开发了,没有写过博客,最近公司app上架,程序崩溃被拒绝了,可是给的crash文件,又看不出哪里的问题,网上各种搜,终于找到了解决的办法,想想还是写个博客吧,希望给哪些也遇到这类问题的朋友 ...