先看简单示例:点击按钮,2s之后,TextView改变内容。

package cn.lixyz.handlertest;import android.app.Activity;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.view.View;
import android.widget.Button;
import android.widget.TextView;/*** 实现点击按钮,开始播放幻灯片,每张幻灯片间隔2s。*/public class MainActivity extends Activity {private TextView textView;private Button button;private Handler handler;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);textView = (TextView) findViewById(R.id.textView);button = (Button) findViewById(R.id.button);handler = new MyHandler();button.setOnClickListener(new MyOnClickListener());}class MyOnClickListener implements View.OnClickListener {@Overridepublic void onClick(View v) {Thread t = new MyThread();t.start();}}class MyThread extends Thread {@Overridepublic void run() {super.run();try {Thread.sleep(2 * 1000);Message message = handler.obtainMessage();message.obj = "更改后的内容";handler.sendMessage(message);} catch (InterruptedException e) {e.printStackTrace();}}}class MyHandler extends Handler {@Overridepublic void handleMessage(Message msg) {super.handleMessage(msg);String str = (String) msg.obj;textView.setText(str);}}
}

MainActivity.java

<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"tools:context=".MainActivity"><TextViewandroid:id="@+id/textView"android:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_gravity="center"android:padding="30dp"android:text="原来的内容"android:textSize="30dp" /><Buttonandroid:id="@+id/button"android:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_gravity="center"android:layout_marginTop="30dp"android:text="BUTTON" /></LinearLayout>

activity_main.xml

运行结果:

通过Handler实现线程间通信

解释一下上面的代码:

1. 在onCreate中创建自定义的Handler对象

2. 设置按钮的点击监听事件,点击按钮之后,会启动一个线程

3. 线程启动之后,会先休眠2s,然后Handler对象会获取一个Message,设置Message的obj属性为“更改后的内容”,然后将Message发送出去

4. 在我们自定义的Handler类中,实现了handleMessage方法,在这个方法中,我们接收到message,然后将message中的obj取出,更新TextView。

再一个例子:

package cn.lixyz.handlertest;import android.app.Activity;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.TextView;/*** 实现点击按钮,开始播放幻灯片,每张幻灯片间隔2s。*/public class MainActivity extends Activity {private EditText editText;private Button button;private Handler handler;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);editText = (EditText) findViewById(R.id.editText);button = (Button) findViewById(R.id.button);handler = new MyHandler();button.setOnClickListener(new MyOnClickListener());}class MyOnClickListener implements View.OnClickListener {@Overridepublic void onClick(View v) {Thread t = new MyThread();t.start();}}class MyThread extends Thread {@Overridepublic void run() {super.run();try {Thread.sleep(2 * 1000);String str = editText.getText().toString();Message message = handler.obtainMessage();message.obj = str;handler.sendMessage(message);} catch (InterruptedException e) {e.printStackTrace();}}}class MyHandler extends Handler {@Overridepublic void handleMessage(Message msg) {super.handleMessage(msg);String str = (String) msg.obj;Log.d("TTTT", "接收到的消息是" + str);}}
}

MainActivity.java

<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"tools:context=".MainActivity"><EditTextandroid:id="@+id/editText"android:layout_width="match_parent"android:layout_height="wrap_content"android:layout_gravity="center"android:hint="输入要传送的内容"android:padding="30dp" /><Buttonandroid:id="@+id/button"android:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_gravity="center"android:layout_marginTop="30dp"android:text="BUTTON" /></LinearLayout>

activity_main.xml

运行结果:

在子线程中发送,在主线程中接收,在子线程中处理,在主线程中更新

再稍微处理一下上面的代码,我们看一下他们的线程名:

package cn.lixyz.handlertest;import android.app.Activity;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.TextView;/*** 实现点击按钮,开始播放幻灯片,每张幻灯片间隔2s。*/public class MainActivity extends Activity {private TextView textView;private Button button;private Handler handler;private EditText editText;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);textView = (TextView) findViewById(R.id.textView);button = (Button) findViewById(R.id.button);editText = (EditText) findViewById(R.id.editText);handler = new MyHandler();button.setOnClickListener(new MyOnClickListener());}class MyOnClickListener implements View.OnClickListener {@Overridepublic void onClick(View v) {Thread t = new MyThread();t.start();}}class MyThread extends Thread {@Overridepublic void run() {super.run();try {Thread.sleep(2 * 1000);String str = "****" + editText.getText().toString() + "****";Message message = handler.obtainMessage();message.obj = str;handler.sendMessage(message);Log.d("TTTT", "这里是发送消息的线程,发送的内容是:" + str + "  线程名是:" + Thread.currentThread().getName());} catch (InterruptedException e) {e.printStackTrace();}}}class MyHandler extends Handler {@Overridepublic void handleMessage(Message msg) {super.handleMessage(msg);String str = (String) msg.obj;textView.setText(str);Log.d("TTTT", "这里是更改UI的线程,接收到的内容是:" + str + "  线程名是:" + Thread.currentThread().getName());}}
}

MainActivity.java

<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"tools:context=".MainActivity"><TextViewandroid:id="@+id/textView"android:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_gravity="center"android:padding="30dp"android:text="原来的内容"android:textSize="30dp" /><EditTextandroid:id="@+id/editText"android:layout_width="match_parent"android:layout_height="wrap_content"android:hint="输入要改变的文字" /><Buttonandroid:id="@+id/button"android:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_gravity="center"android:layout_marginTop="30dp"android:text="Send" /></LinearLayout>

activity_main.xml

运行结果:

从运行结果我们可以看到,发送消息的线程是一个WorkerThread,更新UI的线程是一个MainThread,这样就解决了主线程和子线程之间的通信问题,我们可以在子线程中将数据处理完成之后回传给UI线程,让UI线程去更新UI组件。

转载于:https://www.cnblogs.com/xs104/p/4815073.html

Android笔记(三十一)Android中线程之间的通信(三)子线程给主线程发送消息...相关推荐

  1. java中子线程与主线程通信_Android笔记(三十二) Android中线程之间的通信(四)主线程给子线程发送消息...

    之前的例子都是我们在子线程(WorkerThread)当中处理并发送消息,然后在主线程(UI线程)中获取消息并修改UI,那么可以不可以在由主线程发送消息,子线程接收呢?我们按照之前的思路写一下代码: ...

  2. 主线程和子线程的区别,线程之间的通信

    1.主线程来向子线程发送消息的方法 在平时写程序时,我们一般都是在子线程中向主线程发送消息,从而完成请求的处理,这个很常见,不用多说了.那么有时候,我们也可能碰到这样子的一种需求:需要主线程来向子线程 ...

  3. QT小例子GUI(主)线程与子线程之间的通信

    QT小例子GUI(主)线程与子线程之间的通信 在主线程上,可以控制子线程启动,停止,清零 如果子线程启动的话,每一秒钟会向主线程发送一个数字,让主线程更新界面上的数字. #ifndef TQT_H_ ...

  4. handler回调主线程_Android使用Handler实现子线程与子线程、子线程与主线程之间通信...

    转载:https://blog.csdn.net/shaoenxiao/article/details/54561753 今天这篇文章只讲一下怎么使用Handler实现子线程与子线程之间.子线程与主线 ...

  5. Android中Handler的使用方法——在子线程中更新界面

    本文主要介绍Android的Handler的使用方法.Handler可以发送Messsage和Runnable对象到与其相关联的线程的消息队列.每个Handler对象与创建它的线程相关联,并且每个Ha ...

  6. Android之HandlerThread源码分析和简单使用(主线程和子线程通信、子线程和子线程通信)

    1.先熟悉handler方式实现主线程和子线程互相通信方式,子线程和子线程的通信方式 如果不熟悉或者忘记了,请参考我的这篇博客     Android之用Handler实现主线程和子线程互相通信以及子 ...

  7. 黑马程序员--线程之间的通信,等待与唤醒机制,线程的终止方式,线程中的其他方法,优先级,toString() 守护线程,GUI图形化界面

    ------<a href="http://www.itheima.com" target="blank">Java培训.Android培训.iOS ...

  8. android不能在主线程,android.os.NetworkOnMainThreadException 在4.0之后谷歌强制要求连接网络不能在主线程进行访问(示例代码)...

    谷歌在4.0系统以后就禁止在主线程中进行网络访问了,原因是: 主线程是负责UI的响应,如果在主线程进行网络访问,超过5秒的话就会引发强制关闭, 所以这种耗时的操作不能放在主线程里.放在子线程里,而子线 ...

  9. VC中利用多线程技术实现线程之间的通信

    当前流行的Windows操作系统能同时运行几个程序(独立运行的程序又称之为进程),对于同一个程序,它又可以分成若干个独立的执行流,我们称之为线程,线程提供了多任务处理的能力.用进程和线程的观点来研究软 ...

最新文章

  1. 关于css知识要点总结大全
  2. 7年Java后端被淘汰,一路北漂辛酸史。。。
  3. mysql 自动归档,如何将数据库从非归档模式转为自动归档模式:
  4. 阿里开源的Arthas竟然还不会用?最佳实践来了!
  5. xmind怎么在左边创建_个人怎么做微信小程序商城
  6. 创建 vxlan 并部署 instance - 每天5分钟玩转 OpenStack(147)
  7. Windows 2003下×××服务器架设攻略
  8. AtCoder 2000 [AGC002F] Leftmost Ball(dp+组合数)
  9. 【最全最详细】publiccms常用的代码片段
  10. 论文浅尝 | WWW2020 - 知识图谱中的实体摘要:算法、评价和应用 (PPT)
  11. Android官方开发文档Training系列课程中文版:支持不同的设备之支持不同的语言
  12. python函数递归 字符串反转
  13. 对抗生成网络(Generative Adversarial Net)
  14. 程序猿学习中华古诗词路径
  15. excel如何使用函数判断包含某值
  16. 微博话题墙 html,Js仿微博插入话题功能
  17. Brute-Force模式匹配算法
  18. Python——Fraction类处理分数
  19. 34、HTML制做奖多多采购页面(仅供参考)
  20. 我是如何微信日涨四千粉的?

热门文章

  1. Python Django根据数据库表生成模型类的命令
  2. python3多个变量赋值
  3. VMware虚拟机中调用本机摄像头详解
  4. gpib安装包 python_ioctl errorno:25在使用pythongpib的GPIB通信中
  5. 基于 abp vNext 和 .NET Core 开发博客项目 - 完善与美化,Swagger登场
  6. Visual Studio下载、安装、运行教程
  7. 记录webpack使用问题,使用报错“UnhandledPromiseRejectionWarning,file-loader图片过大,无法加载图片,打包html文件报错TypeError
  8. antd 能自适应吗_自首要满足的条件有哪些,自首能从宽处罚吗?
  9. mysql5.7.20linux安装,linux下 mysql5.7.20安装(精华)
  10. 傅里叶变换音频可视化_Web Audio在音频可视化中的应用