• xamarin UWP平台线程交互问题


        先吐槽一下,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方法,示例如下:

       

      1     public class MailInfo : INotifyPropertyChanged
      2     {
      3         public event PropertyChangedEventHandler PropertyChanged;
      4         void OnPropertyChanged([CallerMemberName] string propertyName = null)
      5         {
      6             var hanlder = PropertyChanged;
      7             if (hanlder != null)
      8             {
      9                 if (Device.OS == TargetPlatform.Windows)
     10                 {
     11                     Device.BeginInvokeOnMainThread(() =>
     12                     {
     13                         hanlder(this, new PropertyChangedEventArgs(propertyName));
     14                     });
     15                 }
     16                 else
     17                 {
     18                     hanlder(this, new PropertyChangedEventArgs(propertyName));
     19                 }
     20             }
     21         }
     22         public MailInfo()
     23         {
     24 
     25         }
     26         [PrimaryKey, AutoIncrement]
     27         public int Id { get; set; }
     28         /// <summary>
     29         /// 发件人
     30         /// </summary>
     31         public string MailFrom { get; set; }
     32         /// <summary>
     33         /// 收件人
     34         /// </summary>
     35         public string MailTo { get; set; }
     36         /// <summary>
     37         /// 邮件标题
     38         /// </summary>
     39         public string Subject { get; set; }
     40 
     41         string detail;
     42         /// <summary>
     43         /// 邮件内容
     44         /// </summary>
     45         [Ignore]
     46         public string Detail
     47         {
     48             get
     49             {
     50                 return detail;
     51             }
     52             set
     53             {
     54                 if (!value.Equals(detail, StringComparison.Ordinal))
     55                 {
     56                     detail = value;
     57 
     58                     OnPropertyChanged("Detail");
     59                 }
     60             }
     61         }
     62 
     63 
     64         /// <summary>
     65         /// 邮件唯一编号
     66         /// </summary>
     67         [Indexed]
     68         public int UniqueID_Server { get; set; }
     69 
     70         MessageImportance importanceType;
     71         /// <summary>
     72         /// 邮件重要性 Low = 0,Normal = 1,High = 2,
     73         /// </summary>
     74         public MessageImportance MessageImportanceType
     75         {
     76             get
     77             {
     78                 return importanceType;
     79             }
     80             set
     81             {
     82                 if (!value.Equals(importanceType))
     83                 {
     84                     importanceType = value;
     85 
     86                     OnPropertyChanged("MessageImportanceType");
     87                 }
     88             }
     89         }
     90 
     91         bool hasAttachment;
     92         /// <summary> 
     93         /// 是否有附件
     94         /// </summary>
     95         [Ignore]
     96         public bool HasAttachment
     97         {
     98             get
     99             {
    100                 return hasAttachment;
    101             }
    102             set
    103             {
    104                 if (!value.Equals(hasAttachment))
    105                 {
    106                     hasAttachment = value;
    107                     OnPropertyChanged("HasAttachment");
    108                 }
    109             }
    110         }
    111 
    112 
    113 
    114     }
    MailInfo.cs

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

  • 相关阅读:
    (转)Entity Framework 缓存处理与日志监控,(非常重要的技术)
    (转)6步确保 windbg 成功调试 .net
    (转)十天内掌握线性代数:惊人的超速学习实验
    (转)创业需要知道的13句话
    今年阅读书籍计划,C++之STL篇
    不靠广告也盈利:移动应用掘金7大案例剖析(转)
    常用JS操作(复选框、单选框、下拉框)
    Windows系统直接运行jar
    修改打开方式的程序列表中列出程序的名称
    ora12514错误,TNS:监听程序当前无法识别链接描述符中请求的服务
  • 原文地址:https://www.cnblogs.com/zuimengaitianya/p/5846506.html
Copyright © 2020-2023  润新知