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元素,就必须要在主线程中进行,否则就会出现意外。

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

 <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"> <Button
android:id="@+id/chage_text"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="改变文字" /> <TextView
android:id="@+id/textView"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_centerInParent="true"
android:text="这是一段文字"
android:textSize="20sp"/>
</RelativeLayout>

  然后是java代码:

 public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main); //注册按钮和文本控件
Button changeText = (Button) findViewById(R.id.chage_text);
final TextView textView = (TextView) findViewById(R.id.textView); //按钮响应
changeText.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) { //开启一个子线程
new Thread(new Runnable() {
@Override
public void run() { //修改文本控件中的文本
textView.setText("这是另一段文字");
}
}).start();
}
});
}
}

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

 public class MainActivity extends AppCompatActivity {

     public static final int UPDATA_TEXT = 1;

     private TextView textView;

     private Handler handler = new Handler(){

         public void handleMessage(Message msg){
switch (msg.what){
case UPDATA_TEXT:
textView.setText("这是另一段文字");
break;
default:
break;
}
}
};
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main); //注册按钮和文本控件
Button changeText = (Button) findViewById(R.id.chage_text);
textView = (TextView) findViewById(R.id.textView); //按钮响应
changeText.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) { //开启一个子线程
new Thread(new Runnable() {
@Override
public void run() {
Message message = new Message();
message.what = UPDATA_TEXT;
handler.sendMessage(message);//将Message对象发送出去
}
}).start();
}
});
}
}

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

  

android ——多线程编程的更多相关文章

  1. android: 多线程编程基础

    9.1   服务是什么 服务(Service)是 Android 中实现程序后台运行的解决方案,它非常适合用于去执行那 些不需要和用户交互而且还要求长期运行的任务.服务的运行不依赖于任何用户界面,即使 ...

  2. Android 多线程编程

    Android 多线程编程 //1.多线程 进程:操作系统的多道程序 线程:同一个程序的多条路径 //2.创建多线程程序 创建一个类extends Thread 重写run方法 在main方法中创建对 ...

  3. Android多线程编程<一>Android中启动子线程的方法

          我们知道在Android中,要更新UI只能在UI主线程去更新,而不允许在子线程直接去操作UI,但是很多时候,很多耗时的工作都交给子线程去实现,当子线程执行完这些耗时的工作后,我们希望去修改 ...

  4. Android——多线程编程练习题

    随便选择两个城市作为预选旅游目标.实现两个独立的线程分别显示10次城市名,每次显示后休眠一段随机时间(1000ms以内),哪个先显示完毕,就决定去哪个城市.分别用Runnable接口和Thread类实 ...

  5. Android多线程编程<二>Handler异步消息处理机制之Message

      Message(消息):       一. Message的字段:    在Android中,Message作为线程之间(主要是子线程和UI主线程之间)数据交换的载体,通过Handler去传递.它 ...

  6. Android并发编程 多线程与锁

    该文章是一个系列文章,是本人在Android开发的漫漫长途上的一点感想和记录,如果能给各位看官带来一丝启发或者帮助,那真是极好的. 前言 前一篇Android并发编程开篇呢,主要是简单介绍一下线程以及 ...

  7. [置顶] Android异步加载数据库和多线程编程

    Android是一种基于Linux的自由及开放源代码的操作系统,主要使用于移动设备,如智能手机和平板电脑,由Google公司和开放手机联盟领导及开发.尚未有统一中文名称,中国大陆地区较多人使用“安卓” ...

  8. Android中的多线程编程(一)附源代码

    Android中多线程编程:Handler类.Runnable类.Thread类之概念分析 1.Handler类: Handler是谷歌封装的一种机制:能够用来更新UI以及消息的发送和处理.Handl ...

  9. Qt on Android 核心编程

    Qt on Android 核心编程(最好看的Qt编程书!CSDN博主foruok倾力奉献!) 安晓辉 著   ISBN 978-7-121-24457-5 2015年1月出版 定价:65.00元 4 ...

随机推荐

  1. FluentValidation:一个非常受欢迎的,用于构建强类型验证规则的.NET 库

    1. FluentValidation:一个非常受欢迎的,用于构建强类型验证规则的.NET 库 请求参数实体定义: FluentValidation 验证类定义: 过滤器:ActionFilter中O ...

  2. python generator与coroutine

    python  generator与coroutine 协程 简单介绍 协程,又称微线程,纤程,英文名Coroutine.协程是一种用户态的轻量级线程,又称微线程.协程拥有自己的寄存器上下文和栈,调度 ...

  3. scrapy实战8关于数据异步写入mysql:

    环境:python3 爬取网址:腾讯社招(http://hr.tencent.com/position.php?keywords=&tid=0&start=0#a)总共2202条数据 ...

  4. 浅谈labviEW定时器

    Labview提供了五种定时器:普通定时器3种: Tick Count (ms). Wait(ms).Wait Until Next ms  Multipule(等待下一个毫秒的整数倍) API函数定 ...

  5. 数字IC前后端设计中的时序收敛(三)--Hold违反的修复方法

    本文转自:自己的微信公众号<数字集成电路设计及EDA教程>(二维码见博文底部) 里面主要讲解数字IC前端.后端.DFT.低功耗设计以及验证等相关知识,并且讲解了其中用到的各种EDA工具的教 ...

  6. Java学习笔记之---内部类

    Java学习笔记之---内部类 (一)成员内部类 内部类在外部使用时,无法直接实例化,需要借助外部类信息才能实例化 内部类的访问修饰符可以任意,但是访问范围会受到影响 内部类可以直接访问外部类的成员, ...

  7. Jenkins+SVN+Maven+shell 自动化部署实践

      JAVA环境中利用Jenkins+svn+maven进行自动化部署实践   一. 前言2 1.介绍jenkins2 1.本地项目打包2 2.通过secureCRT工具,手动传输到服务器2 3.然后 ...

  8. uSID:SRv6新范式

    摘要:本文介绍最新的SRv6创新uSID(Micro Segment).uSID兼容既有的SRv6框架,将极大地改变SRv6的设计.实现和部署方式,成为SRv6的新范式. 一.SRv6 101 Seg ...

  9. 个人永久性免费-Excel催化剂功能第38波-比Vlookup更好用的查找引用函数

    谈起Excel的函数,有一个函数生来自带明星光环,在表哥表姐群体中无人不知,介绍它的教程更是铺天盖地,此乃VLOOKUP函数也.今天Excel催化剂在这里冒着被火喷的风险,大胆地宣布一个比VLOOKU ...

  10. Android 异常 UncaughtException detected: java.lang.RuntimeException: Parcelable encountered IOExcepti

    异常信息: UncaughtException detected: java.lang.RuntimeException: Parcelable encountered IOException wri ...