Android---手动创建线程与GUI线程同步的第三种方法:

在GUI线程中调用runOnUiThread(Runnable runnable), 此时work Thread与GUI线程在同一个线程中, 所以,可以直接在work thread中更改GUI中的UI(此方法比较简单,适合work thread执行的任务比较简单,不耗进的任务。特别注意:当work thread 执行比较耗时的任务时,使用此方法会阻塞GUI线程,因为work thread 实际上也是在GUI线程中运行的)

1>布局与上二节都一样

1.1>效果如下:

1.2>代码如下:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"xmlns:tools="http://schemas.android.com/tools"android:layout_width="match_parent"android:layout_height="match_parent"android:orientation="vertical"android:paddingBottom="@dimen/activity_vertical_margin"android:paddingLeft="@dimen/activity_horizontal_margin"android:paddingRight="@dimen/activity_horizontal_margin"android:paddingTop="@dimen/activity_vertical_margin"tools:context="com.cxc.threadandhandler.MainActivity" ><TextViewandroid:layout_width="match_parent"android:layout_height="wrap_content"android:text="work thread运行在GUI线程中" /><LinearLayoutandroid:layout_width="match_parent"android:layout_height="wrap_content"android:orientation="horizontal" ><TextViewandroid:id="@+id/show_info_tv"android:layout_width="0dp"android:layout_height="wrap_content"android:layout_weight="1"android:text="显示后台任务情况" /><Buttonandroid:id="@+id/start_task_bt"android:layout_width="wrap_content"android:layout_height="wrap_content"android:text="Start Task" /></LinearLayout></LinearLayout>

2>代码

2.1>MainActivity具体代码

package com.cxc.threadandhandler;import android.app.Activity;
import android.os.Bundle;
import android.os.Handler;
import android.os.HandlerThread;
import android.os.Looper;
import android.os.Message;
import android.util.Log;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.TextView;public class MainActivity extends Activity {private static final String TAG = "com.cxc.threadandhandler.mainactivity";private TextView show_info_tv;private Button start_task_bt;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);Log.d(TAG, "---main---" + Thread.currentThread().getId());Log.d(TAG, "---onCreate---");initViews();}private void initViews() {Log.d(TAG, "---initViews---");show_info_tv = (TextView) findViewById(R.id.show_info_tv);start_task_bt = (Button) findViewById(R.id.start_task_bt);start_task_bt.setOnClickListener(myButtonClickListener);}OnClickListener myButtonClickListener = new OnClickListener() {@Overridepublic void onClick(View v) {// TODO Auto-generated method stubswitch (v.getId()) {case R.id.start_task_bt:// to-do// 将耗时的操作移到子线程中Log.d(TAG, "---Start Task Button Click---");BackgroundThread backgroundThread = new BackgroundThread();runOnUiThread(backgroundThread);break;default:break;}}};class BackgroundThread implements Runnable {public BackgroundThread() {// TODO Auto-generated constructor stub}@Overridepublic void run() {// TODO Auto-generated method stubLog.d(TAG, "-----work thread ---" + Thread.currentThread().getId());backgroundThreadProcessing();}// 在后台执行一些处理的方法---耗时操作private void backgroundThreadProcessing() {// to-do 耗时操作Log.d(TAG, "-----work thread -backgroundThreadProcessing ---"+ Thread.currentThread().getId());for (int i = 0; i < 10; i++) {String text = show_info_tv.getText().toString();/** 在GUI线程中调用runOnUiThread(Runnable runnable); 此时work Thread* 与GUI线程在同一个线程中, 所以,可以直接在work thread中更改GUI中的UI*/text +=("*"+i);show_info_tv.setText(text );Log.d(TAG,"----:"+text);}}}@Overridepublic boolean onCreateOptionsMenu(Menu menu) {// Inflate the menu; this adds items to the action bar if it is present.getMenuInflater().inflate(R.menu.main, menu);return true;}@Overridepublic boolean onOptionsItemSelected(MenuItem item) {// Handle action bar item clicks here. The action bar will// automatically handle clicks on the Home/Up button, so long// as you specify a parent activity in AndroidManifest.xml.int id = item.getItemId();if (id == R.id.action_settings) {return true;}return super.onOptionsItemSelected(item);}
}

运行效果如下:

2.3>Log日志

06-01 20:42:26.879: D/com.cxc.threadandhandler.mainactivity(13839): ---main---1
06-01 20:42:26.879: D/com.cxc.threadandhandler.mainactivity(13839): ---onCreate---
06-01 20:42:26.879: D/com.cxc.threadandhandler.mainactivity(13839): ---initViews---
06-01 20:42:33.499: D/com.cxc.threadandhandler.mainactivity(13839): ---Start Task Button Click---
06-01 20:42:33.499: D/com.cxc.threadandhandler.mainactivity(13839): -----work thread ---1
06-01 20:42:33.499: D/com.cxc.threadandhandler.mainactivity(13839): -----work thread -backgroundThreadProcessing ---1
06-01 20:42:33.499: D/com.cxc.threadandhandler.mainactivity(13839): ----:显示后台任务情况*0
06-01 20:42:33.499: D/com.cxc.threadandhandler.mainactivity(13839): ----:显示后台任务情况*0*1
06-01 20:42:33.499: D/com.cxc.threadandhandler.mainactivity(13839): ----:显示后台任务情况*0*1*2
06-01 20:42:33.504: D/com.cxc.threadandhandler.mainactivity(13839): ----:显示后台任务情况*0*1*2*3
06-01 20:42:33.504: D/com.cxc.threadandhandler.mainactivity(13839): ----:显示后台任务情况*0*1*2*3*4
06-01 20:42:33.504: D/com.cxc.threadandhandler.mainactivity(13839): ----:显示后台任务情况*0*1*2*3*4*5
06-01 20:42:33.504: D/com.cxc.threadandhandler.mainactivity(13839): ----:显示后台任务情况*0*1*2*3*4*5*6
06-01 20:42:33.504: D/com.cxc.threadandhandler.mainactivity(13839): ----:显示后台任务情况*0*1*2*3*4*5*6*7
06-01 20:42:33.504: D/com.cxc.threadandhandler.mainactivity(13839): ----:显示后台任务情况*0*1*2*3*4*5*6*7*8
06-01 20:42:33.504: D/com.cxc.threadandhandler.mainactivity(13839): ----:显示后台任务情况*0*1*2*3*4*5*6*7*8*9

3>分析从上面的Log可以看出work thread 确实运行在GUI线程中,所以可以直接在work thread 中直接更改GUI中的 UI控件,而不会引起"  android.view.ViewRootImpl$CalledFromWrongThreadException: Only the original thread that created a view hierarchy can touch its views."异常

4>总结对于比较耗时的操作应该放到work thread 中运行,此时可以使用方法(二)来实现

Android---手动创建线程与GUI线程同步(三)相关推荐

  1. Android---手动创建线程与GUI线程同步(二)

    本文在上一节Android---手动创建线程与GUI线程同步(一)的基础上来进行改进 上一节我们实现了在子线程中进行耗时工作,并通过Handler更改GUI中的UI,但是我们并不能通过它来获取后台工作 ...

  2. Android手动创建和解析Json

    Android手动创建和解析Json 概述 现在Android开发中创建和解析Json大都是利用Gson.fastJson等可以映射对象的第三方库,确实非常方便,使用Gson解析可以参考我的另一篇文章 ...

  3. Android---手动创建线程与GUI线程同步(一)

    虽然使用Intent Service 和创建AsyncTasks是非常有用的捷径,但还是有一些需要创建和管理自己的线程来执行后台处理的场景.通常的情况就是存在长时间运行或者相互联系的线程,它们需要一些 ...

  4. android手动创建数据表,Android开发—数据库应用—手动创建(SQLite)数据库--手动创建数据表(table)...

    /* (程序头部注释开始) * 程序的版权和版本声明部分 * Copyright (c) 2011, 烟台大学计算机学院学生 * All rights reserved. * 文件名称:数据库应用-手 ...

  5. 我会手动创建线程,为什么让我使用线程池?

    你有一个思想,我有一个思想,我们交换后,一个人就有两个思想 If you can NOT explain it simply, you do NOT understand it well enough ...

  6. 消息机制(GUI线程讲解)

    文章目录 前奏 窗口代码 你能回答这些问题吗? 消息队列: 消息队列在何处呢? 那么Windows如何解决的呢? 重点: 总结: 前奏 首先我们来画一个窗口: 窗口代码 #include<Win ...

  7. android 多线程创建texture,从源码角度剖析Android系统EGL及GL线程

    本文转载自天天P图攻城狮微信公众号,作者:天天P图Android工程师kenneyqin(覃华峥),原文链接https://mp.weixin.qq.com/s/j_N5_C7iQUPWENdRYfj ...

  8. java 多线程编程(包括创建线程的三种方式、线程的生命周期、线程的调度策略、线程同步、线程通信、线程池、死锁等)

    1 多线程的基础知识 1.1 单核CPU和多核CPU 单核CPU,其实是一种假的多线程,因为在一个时间单元内,也只能执行一个线程的任务.微观上这些程序是分时的交替运行,只不过是给人的感觉是同时运行,那 ...

  9. 手把手教你手动创建线程池

    点击上方 好好学java ,选择 星标 公众号 重磅资讯.干货,第一时间送达 今日推荐:2020,搞个 Mac 玩玩!个人原创+1博客:点击前往,查看更多 作者:IamHYN 链接:https://s ...

最新文章

  1. Ubuntu下安装Anaconda
  2. DeepMind论文:深度压缩感知,新框架提升GAN性能(附链接)
  3. 并发新特性—Executor 框架与线程池
  4. JavaScript:Scope(域)的基本指南
  5. pycharm调试如何返回上一步_如何在瑞芯微RK3399开发板上调用底层接口技术调试笔记...
  6. MathType可以在Word、PPT中插入矩阵吗
  7. 会自学的四足机器人,3.5个小时学会走路!
  8. layui单选框verify_layui 单选框选中事件
  9. JAVA Swing GUI设计 WindowBuilder Pro Container使用大全1——JTabbePane(卡片)使用
  10. [2018.07.12 T1]B君的第一题
  11. 华医网自动答题小脚本软件,并收集答案保存起来
  12. 金蝶K3工业单据中间层插件开发教程
  13. JavaSwing真的过时了吗?请不要忽略了它的启蒙作用
  14. 希尔伯特《几何学基础》的章节目录
  15. linux、windows nginx启动 重启 关闭命令
  16. 简明易懂的JVM垃圾回收理解
  17. python数据挖掘课程 十.Pandas、Matplotlib、PCA绘图实用代码补充
  18. android 怎么封装方法,开发那点事(九)安卓开发,封装常用方法,工作用
  19. 论文悦读(1)——NVM文件系统之NOVA文件系统
  20. wolframalpha最新版_WolframAlpha下载-WolframAlpha ios版下载 苹果版V1.7.4-PC6苹果网

热门文章

  1. 转:ps aux指令詳解
  2. stripslashes和addslashes的区别
  3. @SuppressWarnings 详解
  4. android应用程序签名
  5. 2019 Multi-University Training Contest 1 - 1011 - Function - 数论
  6. Centos6 安装RabbitMq3.7.7
  7. 第十章 优先级队列 (b3)完全二叉堆:删除与下滤
  8. 获取拍照图片,显示大图像
  9. 【转】批量删除redis中的key
  10. Python -- 循环技巧(Looping Techniques)