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
android ——多线程编程相关推荐
- android 多线程编程
主线程的职责是创建.显示和更新UI控件.处理UI事件.启动子线程.停止子线程;子线程的职责是进行处理和向主线程发出更新UI消息,而不是直接更新UI. android 多线程编程报错: 05-14 15 ...
- android: 多线程编程基础
9.1 服务是什么 服务(Service)是 Android 中实现程序后台运行的解决方案,它非常适合用于去执行那 些不需要和用户交互而且还要求长期运行的任务.服务的运行不依赖于任何用户界面,即使 ...
- 线程与进程、Android多线程编程
线程与进程.Android多线程编程 目录 一.概念 1.程序 2.进程 3.并发 4.并行 5.线程 二.Android中的进程与线程 1.安卓的进程 2.安卓的线程 三.Android多线程编程 ...
- Android多线程编程(一)- 线程基础
Android多线程编程(一) 到了学习下一部分了,多线程编程一直都是Android经常使用的部份,在进行网络请求或者访问数据库时,为了避免主线程被耗时操作阻塞了进度,通常都会开启子线程进行处理,多线 ...
- Android开发实例——倒计时器——Android多线程编程
文章目录 一.倒计时器功能描述 二.实现步骤 1.新建Activity,命名为ThreadDemo 2.设计ThreadDemo 的布局文件 3.编写ThreadDemo.java 文件代码 3.1 ...
- Android多线程编程
Android多线程编程 其实就是将耗时操作放在子线程里运行,防止主线程被阻塞,影响软件使用. 线程的基本用法 定义一个线程只需要新建一个类继承自Thread,然后重写父类的run()方法,并在里面编 ...
- android开发多线程编程,Android多线程编程
Handler AsyncTask HTTPURLConnection使用 get方式使用 private void initData() { new Thread(() -> { try { ...
- Android多线程编程(异步通信)---Handler和AsyncTask
Handler机制: 1)主线程UI: 本身就有一个Looper机制,其中有Handler,中包含了消息队列MessageQueen: 2)UI线程模型: UI主线程不允许其他线程操作组件,只有UI主 ...
- Android 开发中的多线程编程技术
此文章来自"Intel Software"应用开发 多线程这个令人生畏的"洪水猛兽",很多人谈起多线程都心存畏惧.在Android开发过程中,多线程真的很难吗? ...
最新文章
- zzzp0371 属于本人
- php 自动处理小图的代码,PHP 处理图片的类实现代码
- HDU1266 Reverse Number
- Python 函数参数的分类及使用方法
- 怎样保护计算机连接线,一根网线把电脑烧了:雷雨天如何保护家电?
- 08-mysql-条件查询-常见函数与小结
- 《ArcGIS Runtime SDK for Android开发笔记》——(1)、Android Studio下载与安装
- python终端会话_如何为Python终端提供持久性历史记录
- java hashmap 实现 序列化_java – Jackson JSON对象映射器反序列化为LinkedHashMap而不是HashMap...
- [转载] 信息系统项目管理师教程——06 信息化基础知识
- android q mix3,Android Q+5G 小米MIX3现场播放8K视频
- 亚马逊SP-API接口申请对外公开可发布教程
- 计算机桌面个性化怎样设置方法,桌面文件夹图标个性化【设置方法】
- C++ float转换int
- 第8章 SMS--短信服务
- 线性代数常用名词详解1
- 腾讯优图·AI 开放平台全面升级:AI 能力最全面的平台
- 使用Burp抓包iphone(苹果)
- VS中使用nasm汇编编译器的方法
- java 俄罗斯方块消除整行_帮忙看下我的俄罗斯方块满行删除方法,为嘛一次只能删除1行。。...
热门文章
- 关于java assertion
- Windows平台下使用Active Directory对Subversion进行权限控制(非完美解决方案)
- EDM营销之如何使邮件列表更加有效
- 数据库不完全恢复 以及恢复到测试环境:
- C Primer Plus 第7章 C控制语句:分支和跳转 7.4 一个统计字数的程序
- Tomcat - Maven plugin: 运行找不到webapp
- iOS开发--验证码
- java cxf实现webservice接口方式之不依赖spring
- TCP三次握手及四次挥手详细图解(转)
- javax.servlet.jsp.JspTagException: