zoukankan      html  css  js  c++  java
  • 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线程冲突问题。如有更好方式,欢迎留言交流。

  • 相关阅读:
    记一次cdh6.3.2版本spark写入phoniex的错误:Incompatible jars detected between client and server. Ensure that phoenix-[version]-server.jar is put on the classpath of HBase in every region server:
    kylin的除法函数的坑
    Exception:kylin构建cube, Cannot modify mapReduce.queue.name at runtime
    cdh版本 livy部署
    kylin-3.1.1-bin-hadoop3搭建,构建cube报的错误,Cannot modify dfs.replication at runtime. It is not in list of params that are allowed to be modified at runtime
    apache开源 国内镜像地址
    一次phoniex表查询报出 org.apache.hadoop.hbase.NotServingRegionException
    spark高级分析2的数据集地址
    题解 P4240【毒瘤之神的考验】
    题解 P4688/BZOJ4939 【[Ynoi2016] 掉进兔子洞】
  • 原文地址:https://www.cnblogs.com/zuimengaitianya/p/5846506.html
Copyright © 2011-2022 走看看