我们经常会在后台线程中去做一些耗时的操作,比如去网络取数据。但是当数据取回来,需要显示到页面上的时候,会遇到一些小麻烦,因为我们都知道,android的UI页面是不允许在其他线程直接操作的。下面总结4中方法用来在线程中操作UI界面。

  模拟耗时操作

  1. private void connectNet() throws InterruptedException {
  2. Thread.sleep(2000);
  3. }

  方法一:Handler

子线程中通过Handler的sendMessage(msg)发送事件:

  1. private void method1() {
  2. new Thread(new Runnable() {
  3. @Override
  4. public void run() {
  5. try {
  6. //耗时操作
  7. connectNet();
  8. //向Handler发送消息
  9. mHadndler.sendEmptyMessage(111);
  10. } catch (InterruptedException e) {
  11. e.printStackTrace();
  12. }
  13. }
  14. }).start();
  15. }

  方法二:View.post(Runnable)

  1. private void method2() {
  2. myText.setOnClickListener(new View.OnClickListener() {
  3. @Override
  4. public void onClick(View v) {
  5. new Thread(new Runnable() {
  6. @Override
  7. public void run() {
  8. try {
  9. //耗时操作
  10. connectNet();
  11. myText.post(new Runnable() {
  12. @Override
  13. public void run() {
  14. myText.setText("联网结束,更新UI数据");
  15. }
  16. });
  17. } catch (InterruptedException e) {
  18. e.printStackTrace();
  19. }
  20. }
  21. }).start();
  22. }
  23. });
  24. }

  方法三:Activity.runOnUiThread

与view.post类似

  1. private void method3() {
  2. new Thread(new Runnable() {
  3. @Override
  4. public void run() {
  5. try {
  6. //耗时操作
  7. connectNet();
  8. runOnUiThread(new Runnable() {
  9. @Override
  10. public void run() {
  11. myText.setText("runOnUiThread...");
  12. }
  13. });
  14. } catch (InterruptedException e) {
  15. e.printStackTrace();
  16. }
  17. }
  18. }).start();
  19. }

    方法四:AsyncTask

  1. private void method4() {
  2. //UI线程中执行
  3. new LoadTask().execute("www.91dota.com");
  4. }
  5. private class LoadTask extends AsyncTask {
  6. protected void onPostExecute(String result) {
  7. myText.setText(result); //得到来自网络的信息刷新页面
  8. }
  9. protected String doInBackground(Object[] objects) {
  10. return "......";//后台耗时操作
  11. }
  12. }

===========================》

附上代码和布局

MainActivity.java

  1. public class MainActivity extends AppCompatActivity {
  2. private TextView myText;
  3. private Handler mHadndler = new Handler() {
  4. @Override
  5. public void handleMessage(Message msg) {
  6. super.handleMessage(msg);
  7. myText.setText("收到消息啦..." + msg.what);
  8. }
  9. };
  10.  
  11. @Override
  12. protected void onCreate(Bundle savedInstanceState) {
  13. super.onCreate(savedInstanceState);
  14. setContentView(R.layout.activity_main);
  15. myText = findViewById(R.id.myTextView);
  16. }
  17.  
  18. /**
  19. * 方法一:Handler
  20. */
  21. private void method1() {
  22. new Thread(new Runnable() {
  23. @Override
  24. public void run() {
  25. try {
  26. //耗时操作
  27. connectNet();
  28. //向Handler发送消息
  29. mHadndler.sendEmptyMessage(111);
  30. } catch (InterruptedException e) {
  31. e.printStackTrace();
  32. }
  33. }
  34. }).start();
  35. }
  36.  
  37. /**
  38. * 方法二:通过View.post(Runnable)
  39. */
  40. private void method2() {
  41. myText.setOnClickListener(new View.OnClickListener() {
  42. @Override
  43. public void onClick(View v) {
  44. new Thread(new Runnable() {
  45. @Override
  46. public void run() {
  47. try {
  48. //耗时操作
  49. connectNet();
  50. myText.post(new Runnable() {
  51. @Override
  52. public void run() {
  53. myText.setText("联网结束,更新UI数据");
  54. }
  55. });
  56. } catch (InterruptedException e) {
  57. e.printStackTrace();
  58. }
  59. }
  60. }).start();
  61. }
  62. });
  63. }
  64.  
  65. /**
  66. * 方法三:Activity.runOnUiThread(Runnable )
  67. */
  68. private void method3() {
  69. runOnUiThread(new Runnable() {
  70. @Override
  71. public void run() {
  72. try {
  73. //耗时操作
  74. connectNet();
  75. myText.setText("runOnUiThread...");
  76. } catch (InterruptedException e) {
  77. e.printStackTrace();
  78. }
  79. }
  80. });
  81. }
  82.  
  83. /**
  84. * 方法四:AsyncTask
  85. */
  86. private void method4() {
  87. //UI线程中执行
  88. new LoadTask().execute("www.91dota.com");
  89.  
  90. }
  91. private class LoadTask extends AsyncTask {
  92. protected void onPostExecute(String result) {
  93. myText.setText(result); //得到来自网络的信息刷新页面
  94. }
  95. protected String doInBackground(Object[] objects) {
  96. return "......";//后台耗时操作
  97. }
  98. }
  99.  
  100. private void connectNet() throws InterruptedException {
  101. Thread.sleep(2000);
  102. }
  103. }

activity_main.xml

  1. <?xml version="1.0" encoding="utf-8"?>
  2. <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
  3. xmlns:app="http://schemas.android.com/apk/res-auto"
  4. xmlns:tools="http://schemas.android.com/tools"
  5. android:layout_width="match_parent"
  6. android:layout_height="match_parent"
  7. android:orientation="vertical">
  8.  
  9. <TextView
  10. android:id="@+id/myTextView"
  11. android:layout_width="match_parent"
  12. android:layout_height="50dp"
  13. android:layout_margin="10dp"
  14. android:background="#dea"
  15. android:gravity="center"
  16. android:text="Hello World!" />
  17.  
  18. </LinearLayout>

参考:http://www.it165.net

Android 操作UI线程的一些方法的更多相关文章

  1. Android 关于操作UI线程

    在非UI线程里访问 Android UI toolkit—这个在一个worker线程修改了 View .这会导致不可预期的结果,而且还难以调试. 为了修复这个问题,Android提供了几个方法从非UI ...

  2. 转:探讨android更新UI的几种方法

    本文转自:http://www.cnblogs.com/wenjiang/p/3180324.html 作为IT新手,总以为只要有时间,有精力,什么东西都能做出来.这种念头我也有过,但很快就熄灭了,因 ...

  3. Android 更新UI的两个方法

    Android 更新UI的两个方法 在Android的开发过程中,常常需要适时的更新UI.Androd中的UI是在主线程中更新的.如果在主线程之外的线程中直接更新,就会出现报错并抛出异常: andro ...

  4. 【转】探讨android更新UI的几种方法----不错

    原文网址:http://www.cnblogs.com/wenjiang/p/3180324.html 作为IT新手,总以为只要有时间,有精力,什么东西都能做出来.这种念头我也有过,但很快就熄灭了,因 ...

  5. 探讨android更新UI的几种方法

    作为IT新手,总以为只要有时间,有精力,什么东西都能做出来.这种念头我也有过,但很快就熄灭了,因为现实是残酷的,就算一开始的时间和精力非常充足,也会随着项目的推进而逐步消磨殆尽.我们会发现,自己越来越 ...

  6. 探讨android更新UI的几种方法(转)

    作为IT新手,总以为只要有时间,有精力,什么东西都能做出来.这种念头我也有过,但很快就熄灭了,因为现实是残酷的,就算一开始的时间和精力非常充足,也会随着项目的推进而逐步消磨殆尽.我们会发现,自己越来越 ...

  7. WPF / Win Form:多线程去修改或访问UI线程数据的方法( winform 跨线程访问UI控件 )

    WPF:谈谈各种多线程去修改或访问UI线程数据的方法http://www.cnblogs.com/mgen/archive/2012/03/10/2389509.html 子线程非法访问UI线程的数据 ...

  8. Android开发——子线程操作UI的几种方法

    在Android项目中经常有碰到这样的问题,在子线程中完成耗时操作之后要更新UI,下面就自己经历的一些项目总结一下更新的方法: 在看方法之前需要了解一下Android中的消息机制. 转载请标明出处:h ...

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

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

随机推荐

  1. JS面试Q&A(续):Javascript数组排序, 默认是字符串Unicode排序, 不适合数字

    Q:下面代码段的执行后data里面的数据是什么?为什么? var data= [40,1,5,200] data.sort(); A: data的内容是[1, 200, 40, 5] 因为,Javas ...

  2. python脚本参数传递

    环境:python 库:optparse 效果:python  xxx.py  -parameter1  参数1  -parameter2 参数2 .... 废话少说,直接上代码ok?  xxx.py ...

  3. 连接Hive的客户端界面工具–SQuirrel SQL Client

    关键字:Hive客户端.界面.SQuirrel SQL Client 刚看到一个可以连接Hive的客户端界面工具–SQuirrel SQL Client,试了一下,用起来还行,在这里记录一下安装及使用 ...

  4. 浅谈jmeter请求参数获取的方式

    一.传统的web端请求参数我们在浏览器url栏看到传递的参数是什么,比如百度: 1.我们假如百度有一个这样的地址: https://www.baidu.com/s?wd=jmeter&name ...

  5. 十年阿里java架构师的六大设计原则和项目经验

      先看一幅图吧: 这幅图清晰地表达了六大设计原则,但仅限于它们叫什么名字而已,它们具体是什么意思呢?下面我将从原文.译文.理解.应用,这四个方面分别进行阐述. 1.单一职责原则(Single Res ...

  6. 【Jmeter自学】badboy使用(三)

    ==================================================================================================== ...

  7. 【Excel技能】字符串包含某字符串个数?替换许多组字符串?

    =len(单元格A)-len(substitute(单元格A,某字符串,)) 原理:将某字符串替换成空,前后字符串长即为减去的这个字符串长度,这个字符串出现个数=前后字符串长度之差/这个字符串长度 = ...

  8. 《算法》第五章部分程序 part 5

    ▶ 书中第五章部分程序,包括在加上自己补充的代码,Knuth-Morris-Pratt 无回溯匹配,Boyer - Moore 无回溯匹配,Rabin - Karp 指纹匹配 ● Knuth-Morr ...

  9. 《算法》第四章部分程序 part 1

    ▶ 书中第四章部分程序,加上自己补充的代码,包含无向 / 有向图类 ● 无向图类 package package01; import java.util.NoSuchElementException; ...

  10. Google maps javascript API

    https://developers.google.com/maps/documentation/javascript/datalayer .... GeoJSON 是一种针对互联网上共享地理空间数据 ...