先吐槽一下,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. html 页面内锚点定位及跳转方法总结

    第一种方法,也是最简单的方法是锚点用<a>标签,在href属性中写入DIV的id.如下: <!DOCTYPE html><html><head> < ...

  2. java JFrame窗体真正关闭

    程序: package JFrame.bao; import java.awt.event.WindowAdapter;import java.awt.event.WindowEvent; impor ...

  3. swift禁用webView对H5中数字,链接,日期,地址,电话号码做解析

    showWebView.dataDetectorTypes = .None //swift禁用webView对H5中数字,链接,日期,地址,电话号码做解析 其UIDataDetectorTypes属性 ...

  4. XAF ListView 移除顶部工具栏

    此方法适用于C/S及B/S,无需分别写在web和win中. Module下新建ViewController,代码如下: public partial class GongZuoJiaoShen_Yin ...

  5. MVC, MVP, MVVM比较以及区别

    MVC, MVP和MVVM都是用来解决界面呈现和逻辑代码分离而出现的模式.以前只是对它们有部分的了解,没有深入的研究过,对于一些里面的概念和区别也是一知半解.现在一边查资料,并结合自己的理解,来谈一下 ...

  6. [转]如何拷贝一个 SQL Server 的表

    这篇短文将介绍几种拷贝 SQL Server 表的方法.第一种方式是最简单的在同一个数据库里将表拷贝到另外一个表.你需要记住的是,拷贝表的时候并不会拷贝表的约束和索引.下面是代码模板和简单的使用方法: ...

  7. <Android>文件下载

    使用HTTP协议下载文件 创建一个URL对象 通过URL对象,创建一个HttpURLConnection对象 调用getInputStream()方法得到InputStream对象 从InputStr ...

  8. if else 的令人防不胜防的奇葩错误

    if(a==t && b+c >a)  else flag=false; 这个语句乍一看没什么问题,如果a==t 成立b+c >a不成立-〉flag=false; 但是编译 ...

  9. [置顶]PADS PCB功能使用技巧系列之NO.006- 如何实现OrCAD与PADS Layout同步?

    很多同仁都喜欢用OrCAD画原理图,而PCB Layout则用PADS/PowerPCB,这两者被有些人誉为“黄金组合”,但由于两者并非一套软件,因此如何实现同步亦是需要急待解决的问题... (未完待 ...

  10. 人脸识别经典算法三:Fisherface(LDA)

    Fisherface是由Ronald Fisher发明的,想必这就是Fisherface名字由来.Fisherface所基于的LDA(Linear Discriminant Analysis,线性判别 ...