前言:

  刚接触Xamarin.Android不到一个月时间,却被他折磨的不要不要的,随着开发会出现莫名其妙的问题,网上类似Xamarin.Android的文档也不多,于是本片文章是按照Java开发Android的思路写过来的,于是记录下来,希望大家碰到这个问题少走些弯路。

问题描述:

  在执行线程内想给TextView赋值发生错误。

错误提示:

  Android.Util.AndroidRuntimeException: Only the original thread that created a view hierarchy can touch its views.

问题原因:

  原来Android中相关的view和控件不是线程安全的,我们必须单独做处理。这里借此引出Handler的使用。

Handler的机制:

  handler机制,在android中提供了一种异步回调机制Handler,使用它,我们可以在完成一个很长时间的任务后做出相应的通知。

Handler的作用:

  当我们需要在子线程处理耗时的操作(例如访问网络,数据库的操作),而当耗时的操作完成后,需要更新UI,这就需要使用Handler来处理,因为子线程不能做更新UI的操作。Handler能帮我们很容易的把任务(在子线程处理)切换回它所在的线程。简单理解,Handler就是解决线程和线程之间的通信的。

原有错误代码:

  1. using System;
  2. using Android.App;
  3. using Android.Content;
  4. using Android.Runtime;
  5. using Android.Views;
  6. using Android.Widget;
  7. using Android.OS;
  8. using System.Threading;
  9.  
  10. namespace App1
  11. {
  12. [Activity(Label = "App1", MainLauncher = true, Icon = "@drawable/icon")]
  13. public class MainActivity : Activity
  14. {
  15. TextView tv1;
  16. protected override void OnCreate(Bundle bundle)
  17. {
  18. base.OnCreate(bundle);
  19. SetContentView(Resource.Layout.Main);
  20. Button button = FindViewById<Button>(Resource.Id.MyButton);
  21.  
  22. button.Click += delegate { TestThread(); };
  23.  
  24. tv1 = FindViewById<TextView>(Resource.Id.textView1);
  25. }
  26. private void TestThread()
  27. {
  28. Boolean loopFlag = true;
  29. Thread th = new Thread(new ThreadStart(delegate
  30. {
  31. int i = ;
  32. while (loopFlag && i < )
  33. {
  34. if (i == )
  35. {
  36. tv1.Text = "测试赋值";
  37. loopFlag = false;
  38. }
  39. i++;
  40. }
  41. }));
  42. th.Start();
  43. }
  44. }
  45. }

修改完成后的代码:

  1. using System;
  2. using Android.App;
  3. using Android.Content;
  4. using Android.Runtime;
  5. using Android.Views;
  6. using Android.Widget;
  7. using Android.OS;
  8. using System.Threading;
  9.  
  10. namespace App1
  11. {
  12. [Activity(Label = "App1", MainLauncher = true, Icon = "@drawable/icon")]
  13. public class MainActivity : Activity
  14. {
  15. TextView tv1;
  16. Handler hander;
  17. protected override void OnCreate(Bundle bundle)
  18. {
  19. base.OnCreate(bundle);
  20. SetContentView(Resource.Layout.Main);
  21. Button button = FindViewById<Button>(Resource.Id.MyButton);
  22.  
  23. hander = new UIHand(this);
  24. button.Click += delegate { TestThread(); };
  25.  
  26. tv1 = FindViewById<TextView>(Resource.Id.textView1);
  27. }
  28.  
  29. //模拟一个线程,在线程中修改TextView的文本
  30. private void TestThread()
  31. {
  32. Boolean loopFlag = true;
  33. Thread th = new Thread(new ThreadStart(delegate
  34. {
  35. int i = ;
  36. while (loopFlag && i < )
  37. {
  38. if (i == )
  39. {
  40. Message ms = new Message();
  41. ms.Obj = "测试赋值" + "@" + "";
  42. hander.SendMessage(ms); //调用HandleMessage方法
  43. loopFlag = false;
  44. }
  45. i++;
  46. }
  47. }));
  48. th.Start();
  49. }
  50.  
  51. //创建一个类,继承于Handler
  52. private class UIHand : Handler
  53. {
  54. MainActivity ma;
  55. public UIHand(MainActivity _ma)
  56. {
  57. ma = _ma;
  58. }
  59.  
  60. //重写HandleMessage方法
  61. public override void HandleMessage(Message msg)
  62. {
  63. try
  64. {
  65. String result = msg.Obj + ""; //相当于ToString();
  66. String[] str = result.Split('@');
  67. ma.tv1.Text = str[];
  68. }
  69. catch (Exception)
  70. {
  71.  
  72. }
  73. }
  74. }
  75. }
  76. }

这样问题就完美的解决了。

Xamarin.Android 使用线程无法更改页面文本问题的更多相关文章

  1. xamarin android 在代码中如何设置文本颜色

    xamarin android 在代码中如何设置文本颜色 TextView v = FindViewById<TextView>(Android.Resource.Id.Message); ...

  2. Xamarin.Android 使用Timer 并更改UI

    http://blog.csdn.net/ozhangsan12345/article/details/72653070 第一步:创建timer对象 //创建timer对象 Timer _dispat ...

  3. 更改Xamarin Android App名称

    更改Xamarin Android App名称   Xamarin Android生成的App名称默认和项目名一致.修改该名称有两种方式.   第一种方式:右击Android项目,选择“属性”命令,然 ...

  4. Visual Studio跨平台开发实战(5) - Xamarin Android多页面应用程式开发

    原文 Visual Studio跨平台开发实战(5) - Xamarin Android多页面应用程式开发 前言 大部份的Andr​​oid 都具有实体或虚拟的Back键. 因此在处理多页面应用程式时 ...

  5. Xamarin Android自定义文本框

    xamarin android 自定义文本框简单的用法 关键点在于,监听EditText的内容变化,不同于java中文本内容变化去调用EditText.addTextChangedListener(m ...

  6. Visual Studio跨平台开发(5):Xamarin Android多页面应用开发

    前言 大部份的Android 都具有实体或虚拟的Back键. 因此在处理多页面应用程序时, 与先前所介绍的iOS Navigation controller 比较起来会简单许多. 1. 开启Visua ...

  7. Xamarin.Android开发

    使用 Visual Studio 生成第一个 Xamarin.Android 应用程序,并进一步了解使用 Xamarin 进行 Android 应用程序开发的基础知识.在此过程中,会介绍生成和部署 X ...

  8. [译]:Xamarin.Android开发入门——Hello,Android深入理解

    返回索引目录 原文链接:Hello, Android_DeepDive. 译文链接:Xamarin.Android开发入门--Hello,Android深入理解 本部分介绍利用Xamarin开发And ...

  9. Xamarin.Android 如何使用Assets目录下的文件

    原文:Xamarin.Android 如何使用Assets目录下的文件 个人原创,转载注明出处:http://blog.csdn.net/supluo/article/details/43672411 ...

随机推荐

  1. Full authentication is required to access this resource

    参考 https://www.jianshu.com/p/d10e0cee4adb security.basic.enabled=false

  2. js正则积累

    判断是否为数字 function isNumber(val){ var regPos = /^\d+(\.\d+)?$/; //非负浮点数 var regNeg = /^(-(([0-9]+\.[0- ...

  3. Python学习之MacBook Pro中PyCharm安装pip以及itchat

    前言:Mac中自带的python没有用,自己安装了一个PyCharm,网上很多人说安装Itchat后会安装到自带的Python中去.本文记录怎么安装到自己安装的Python3.7中去.主要技术来源于h ...

  4. WordPress 自动初始化数据库

    背景 自动化搭建开发环境.测试.部署如通过网页操作(访问 /wp-admin/install.php)相对比较麻烦且在有的场景无法实现. 步骤 修改 wp-config.php 配置 wordpres ...

  5. (转载)Android开发——Android中常见的4种线程池(保证你能看懂并理解)

    0.前言 转载请注明出处:http://blog.csdn.net/seu_calvin/article/details/52415337 使用线程池可以给我们带来很多好处,首先通过线程池中线程的重用 ...

  6. Pandas plot出图

    1.创建一个Series 这是一个线性的数据,我们随机生成1000个数据,Series 默认的 index 就是从0开始的整数,但是这里我显式赋值以便让大家看的更清楚 >>> imp ...

  7. 洛谷4556 [Vani有约会]雨天的尾巴

    原题链接 每个点开一个权值线段树,然后用树上差分的方法修改,最后自底向上暴力线段树合并即可. 不过空间较大,会\(MLE\),写个内存池就可以了. #include<cstdio> #in ...

  8. ----关于position的四个标签----

    从[ two1-4 ]分别为absolute,fixed,static,relative标签 四个标签下位移值相同,[ two2 ]和[ two1 ]都出现在左上角,[ two2 ] 盖住了[ two ...

  9. Alpha 冲刺 (7/10)

    队名 火箭少男100 组长博客 林燊大哥 作业博客 Alpha 冲鸭鸭鸭鸭鸭鸭鸭! 成员冲刺阶段情况 林燊(组长) 过去两天完成了哪些任务 协调各成员之间的工作 学习MSI.CUDA 试运行软件并调试 ...

  10. 2019.02.28 bzoj4199: [Noi2015]品酒大会(sam+线段树)

    传送门 题意:给一个串,每个位置有一个权值,当S[s...s+len−1]=S[t...t+len−1]&&S[s...s+len]̸=S[t..t+len]S[s...s+len-1 ...