android ——多线程编程

  1、定义一个线程只需要新建一个类继承自Thread。然后重写run()方法,并在里面编写耗时逻辑即可:

class MyThread extends Thread{public void run(){//处理具体的逻辑
     }}

  启动的时候只需要new出MyThread的实例,然后调用它的start()方法,这样run()中写的代码就会在子线程中进行:

new Mythread().start();

 

  2、更多时候使用实现Runnable接口的方式来定义一个线程

class MyThread implements Runnable {public void run() {//处理具体的逻辑     
    }
}        

  如果使用了这种写法,启动线程的方法也要进行相应的改变:

MyThread mythread = new MyThread();
new Thread(mythread).start();

  Thread的构造函数接收了一个Runnable参数,MyThread正是一个实现了Runnable接口的对象,所以直接将它传入Thread的构造函数里,紧接着调用start()方法,run()中的代码就会在子线程中运行了。

 

  3、如果不想专门再定义一个类去实现Runnable接口,也可以使用匿名类的方式:

new Thread (new Runnable() {public void run() {//处理具体的逻辑     
    }
}).start();    

  例如:在子线程中更新UI,

  android的UI是线程不安全的,也就是说如果想要更新应用程序里的UI元素,就必须要在主线程中进行,否则就会出现意外。

  验证一下就是:先在布局中加入一个按钮和一个文本控件,

 1 <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
 2     android:layout_width="match_parent"
 3     android:layout_height="match_parent">
 4 
 5 
 6     <Button
 7         android:id="@+id/chage_text"
 8         android:layout_width="match_parent"
 9         android:layout_height="wrap_content"
10         android:text="改变文字" />
11 
12     <TextView
13         android:id="@+id/textView"
14         android:layout_width="wrap_content"
15         android:layout_height="wrap_content"
16         android:layout_centerInParent="true"
17         android:text="这是一段文字" 
18         android:textSize="20sp"/>
19 </RelativeLayout>

  然后是java代码:

 1 public class MainActivity extends AppCompatActivity {
 2     @Override
 3     protected void onCreate(Bundle savedInstanceState) {
 4         super.onCreate(savedInstanceState);
 5         setContentView(R.layout.activity_main);
 6         
 7         //注册按钮和文本控件
 8         Button changeText = (Button) findViewById(R.id.chage_text);
 9         final TextView textView = (TextView) findViewById(R.id.textView);
10         
11         //按钮响应
12         changeText.setOnClickListener(new View.OnClickListener() {
13             @Override
14             public void onClick(View view) {
15                 
16                 //开启一个子线程
17                 new Thread(new Runnable() {
18                     @Override
19                     public void run() {
20                         
21                         //修改文本控件中的文本
22                         textView.setText("这是另一段文字");
23                     }
24                 }).start();
25             }
26         });
27     }
28 }

  然后安装到手机上,然后就崩溃了,前面就说过要改变UI就需要在主线程中去改变。这时候就需要使用一套异步消息处理机制,也就是子线程中发送消息给Handler,然后Handler识别消息再去进行相应的操作。

 1 public class MainActivity extends AppCompatActivity {
 2 
 3     public static final int UPDATA_TEXT = 1;
 4 
 5     private TextView textView;
 6 
 7     private Handler handler = new Handler(){
 8 
 9         public void handleMessage(Message msg){
10             switch (msg.what){
11                 case UPDATA_TEXT:
12                     textView.setText("这是另一段文字");
13                     break;
14                 default:
15                     break;
16             }
17         }
18     };
19     @Override
20     protected void onCreate(Bundle savedInstanceState) {
21         super.onCreate(savedInstanceState);
22         setContentView(R.layout.activity_main);
23 
24         //注册按钮和文本控件
25         Button changeText = (Button) findViewById(R.id.chage_text);
26        textView = (TextView) findViewById(R.id.textView);
27 
28         //按钮响应
29         changeText.setOnClickListener(new View.OnClickListener() {
30             @Override
31             public void onClick(View view) {
32 
33                 //开启一个子线程
34                 new Thread(new Runnable() {
35                     @Override
36                     public void run() {
37                         Message message = new Message();
38                         message.what = UPDATA_TEXT;
39                         handler.sendMessage(message);//将Message对象发送出去
40                     }
41                 }).start();
42             }
43         });
44     }
45 }

  先创建一个Handler对象,并重写handleMessage方法用于对具体Message的处理,在这里对UI进行改变,然后在子线程中创建一个Message对象,将Message的what字段指定为提取设置好的值,然后调用handler的sendMessage()方法发送出去。

  

 

转载于:https://www.cnblogs.com/xxbbtt/p/7467078.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/467765.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Linux内核设计的艺术

Linux内核设计的艺术这本书是我认为对Linux内核描述非常优秀的书籍。书籍中描述了内核启动的流程&#xff0c;内核运行的机理&#xff0c;内存管理&#xff0c;进程管理等等。#书籍目录第1章 从开机加电到执行main函数之前的过程11.1 启动BIOS&#xff0c;准备实模式下的中断向…

sklearn

文章目录机器学习机器怎样学习机器学习的两种方式用处监督学习三要素监督学习概念与数学形式统计学习三要素模型策略两大策略监督学习三大问题分类问题精确率与召回率标注问题回归问题无监督学习无监督学习主要方法无监督学习之聚类分析用途高斯混合模型密度分布估计协方差估计…

gtp6 linux 启动_Win10更新后导致双系统(LinuxWindows)开机引导失败出现grub rescue的修复办法...

Windows10更新有一定几率会破坏grub&#xff0c;找不到grub引导文件&#xff0c;所以我们要让它找到引导文件。当屏幕上提示&#xff1a;grub resume> 时。1、set命令查看当前grub引导指向哪个盘。grub resume> set显示结果&#xff0c;例如,cmdpath(hd0,gtp2)/EFI/parro…

Tomcat 在mac上(Idea)端口冲突解决办法

Port already in use: 1099 在mac上解决办法直接是找到占用1099端口的pid&#xff1b; 解决方式&#xff1a; lsof -i:1099 回车&#xff0c;之后会有pid&#xff0c;然后执行 kill (pid号) 最后问题就得到了解决&#xff01; 注意&#xff1a;有的时候kill不能将占用端口的pid…

调试LCD反被调戏了

相关文章调试&#xff0c;是一件有挑战的事情这篇文章的题目应该写做 - 我又被LCD艹了一个晚上。写个文档简单总结下#LCD显示的一些基本概念数字视频的基本概念源自于模拟视频。对于模拟视频我们可以这样理解&#xff1a;视频可以分解为若干个基本视点&#xff08;像素&#xf…

被LCD调戏睡不着了

好吧&#xff0c;我承认我不是因为被调戏睡不着的&#xff0c;我是因为今天晚上喝了一杯该死的咖啡&#xff0c;然后就睡不着了&#xff0c;这个点[3&#xff1a;40]在床上翻来覆去&#xff0c;刚开始我摸着楠哥的小腿&#xff0c;过了一会&#xff0c;觉得没意思了&#xff0c…

python 随机名言_如何用简易代码自动生成经典语录

“不要空想不可能的事情”“增加自己的幸福感”“我们最终将创造地面&#xff0c;并呵护它”“保持希望并学会放弃奇迹”上面所有引号内的句子都是由一段代码生成的&#xff0c;使用的程序由少于20行的python代码组成。当涉及到生成自然语言时&#xff0c;人们通常会想到使用高…

链家笔试2

链家笔试2 把m升水倒入n个相同的杯子(假设容器足够大)&#xff0c;允许有的容器是空的&#xff0c;共有多少种不同的倒法&#xff1f;&#xff08;用k表示&#xff09;5 1 1 和1 5 1 和1 1 5 是同一种倒法 输入&#xff1a; 第一行是测试数据的数目 x(0 < x < 20),以下每…

线性表、顺序表

文章目录线性表、顺序表线性表概念线性结构特点线性表概念两种分类顺序表代码遍历查找插入删除逆置链表&#xff08;用指针实现变长的先行存储结构&#xff09;特点习题线性表、顺序表 线性表概念 线性结构特点 存在唯一一个被称为“第一个”的数据元素存在唯一一个被称为“最…

lte 在网络覆盖方面应该注意哪些问题_LTE弱覆盖问题分析与优化

LTE弱覆盖问题分析与优化摘要&#xff1a;本文结合现网实际工作情况介绍了LTE弱覆盖的发现手段&#xff0c;LTE弱覆盖的成因&#xff0c;以及LTE弱覆盖的解决方法&#xff0c;总结相关经验&#xff0c;为LTE的规划建设提供参考依据。关键字&#xff1a;LTE弱覆盖、MR数据、站点…

KWin、libdrm、DRM从上到下全过程 —— drmModeAddFBxxx(33)

接前一篇文章:KWin、libdrm、DRM从上到下全过程 —— drmModeAddFBxxx(32) 上一回了开始对于drm_gem_handle_create_tail函数的解析,对于函数的注释和第一段代码进行了讲解,本回开始对于drm_gem_handle_create_tail函数的核心功能代码进行解析。为了便于理解,再次贴出drm…

Linux 5.7 将支持国产 RISC-V 芯片 K210

这是转载的一篇文章&#xff0c;文章主要内容是Linux合入了一个国产芯片k210的代码&#xff0c;虽然这个芯片不是很强大&#xff0c;但是对于学习来说非常有意义&#xff0c;而且&#xff0c;还有人在这个开发板上移植了Linux 0.11。今天早上我在查阅 Linux 内核邮件列表的时候…

动态路由选择协议(二)距离矢量路由选择协议

大多数的路由选择协议属于下面二者之一&#xff1a; 距离矢量&#xff08;distance vector&#xff09;和链路状态&#xff08;link state&#xff09;。 本篇学习的是距离矢量路由选择协议的基础。 大多数的距离矢量算法是R.E.Bellman、L.R.Ford和D.R.Fulkerson所做的工作为基…

我和蓝牙BT,BLE有一腿

你好&#xff0c;很不幸&#xff0c;你被一个标题骗了进来&#xff0c;可能我以后还会骗你&#xff0c;我这篇文章主要是写蓝牙相关的&#xff0c;不会涉及技术细节&#xff0c;主要是总结一些概念&#xff0c;这些概念会帮助你了解蓝牙知识&#xff0c;帮助你在面试或者聊天的…

Python之路,week03 - Python基础3

本节内容 函数与函数式编程函数式编程之参数详解局部变量与全局变量作用域嵌套函数 递归函数式编程介绍高阶函数内置函数1. 函数与函数式编程 1.面向对象&#xff1a;华山派---》类---》class 2.面向过程&#xff1a;少林派---》过程---》def 3.函数式编程&#xff1a;逍遥派--…

循环链表、双链表

文章目录循环链表、双链表双链表插入删除单循环链表双循环链表习题线性表实现方法比较循环链表、双链表 双链表 插入 删除 单循环链表 双循环链表 习题 线性表实现方法比较

[芦半山]Binder的异常机制

文中代码分析基于Android 10.0 (Q)两个进程之间若是要进行Binder通信&#xff0c;那么发起通信的一端我们就称它为Client进程。Client进程调用每一个代理对象的方法&#xff0c;本质上都是一次跨进程通信。如果这个方法是同步方法&#xff08;非oneway修饰&#xff09;&#xf…

bufg和bufgp_如何将自己写的verilog模块封装成IP核(一)

平台与材料一个写好的工程&#xff0c;综合通过&#xff0c;不用布局布线&#xff0c;ISE或Vivado皆可。如果是ISE&#xff0c;需要在properties里取消选中 iobuf 。这样就只能被当做内部模块调用了。Vivado步骤打开Vivado&#xff0c;创建一个工程Tools -> Create or packa…

消息中间件核心实体(1)

接上一篇《消息中间件核心实体(0)》&#xff0c;这一篇继续介绍消息中间件中的一些实体。 上一篇主要是Message、Topic、TopicMeta和Queue这样最基础的实体&#xff0c;这几篇介绍一些发送和消费的过程中会涉及到的实体和组件。 1. 发送 1.1 增强Message属性 Message一般只包含…

sklearn(2

算法库顶层设计 SKLEARN监督学习模块 近邻算法 neighbors支持向量机SVM岭回归 kernal_ridge判别分析discriminant_analysis广义线性模型linear_model集成方法ensemble决策树tree朴素贝叶斯naive_bayes交叉分解cross_decompostition高斯过程gaussian_process多层神经网络neural…