我们知道在Android中,要更新UI只能在UI主线程去更新,而不允许在子线程直接去操作UI,但是很多时候,很多耗时的工作都交给子线程去实现,当子线程执行完这些耗时的工作后,我们希望去修改UI,但Android中又不允许在子线程中去直接修改UI,如:在子线程中执行从服务器下载一张图片的任务,下载完成后,希望这张图片显示一个ImageView上,在子线程中又不能直接操作ImageView,这怎么办呢?我们只能把这张图片发送给UI主线程,然后在主线程中去显示这张图片。为了能够实现这种子线程和主线程之间的数据交换,Android提供了异步消息处理机制来解决这个问题。Android的异步消息处理机制如:Handler异步消息处理机制和AsyncTask异步任务(内部实现也是基于异步消息处理机制)。Handler异步消息处理机制由Message,Handler,MessageQueue和Looper四个部分组成。
 
    一. 先看Android中启动子线程的方法:
    例子:创建和启动子线程的三个方法,Android中多线程的写法和Java多线程写法基本上都是一样的。
 
(1)布局文件内容:三个按钮,分别用于启动三个子线程
 <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"
tools:context=".MainActivity"
android:orientation="vertical"
> <Button
android:id="@+id/button01"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="第一种方式启动子线程"
/> <Button
android:id="@+id/button02"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="第二种方式启动子线程"
/> <Button
android:id="@+id/button03"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="第三种方式启动子线程"
/> </LinearLayout>
(2) MainActivity:先打印出主线程的ID,分别点击三个按钮,启动三个不同的子线程,在子线程分别打印出子线程的ID
 package zst.zst.thread01;
import java.util.TreeMap;
import android.os.Bundle;
import android.app.Activity;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
public class MainActivity extends Activity implements OnClickListener{
private Button button01;
private Button button02;
private Button button03; @Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
button01 = (Button)findViewById(R.id.button01);
button02 = (Button)findViewById(R.id.button02);
button03 = (Button)findViewById(R.id.button03);
button01.setOnClickListener(this);
button02.setOnClickListener(this);
button03.setOnClickListener(this); //主线程ID
System.out.println("主线程的ID-----> " + String.valueOf(Thread.currentThread().getId()));
}
@Override
public void onClick(View v) {
switch (v.getId()) {
case R.id.button01:
//第一种启动子线程的方法
FirstThread firstThread = new FirstThread();
firstThread.start(); break;
case R.id.button02:
//第二种启动子线程的方法
SecondThread secondThread = new SecondThread();
new Thread(secondThread).start(); break;
case R.id.button03:
//第三种启动子线程的方法,和第二种方法是同一种启动方法,只不过这里用匿名内部类,这种方法最常见
new Thread(new Runnable() { @Override
public void run() {
System.out.println("第三个子线程的ID---> " + String.valueOf(Thread.currentThread().getId()));
}
}).start(); break;
default:
break;
} }
//第一种方法定义一个线程
class FirstThread extends Thread{
@Override
public void run() {
System.out.println("第一个子线程的ID---> " + String.valueOf(Thread.currentThread().getId()));
} } //第二种方法定义一个线程
class SecondThread implements Runnable{
@Override
public void run() {
System.out.println("第二个子线程的ID---> " + String.valueOf(Thread.currentThread().getId()));
} } }

(3)

  输出:

 
 
 
    
 

Android多线程编程<一>Android中启动子线程的方法的更多相关文章

  1. Java多线程编程(1)--Java中的线程

    一.程序.进程和线程   程序是一组指令的有序集合,也可以将其通俗地理解为若干行代码.它本身没有任何运行的含义,它只是一个静态的实体,它可能只是一个单纯的文本文件,也有可能是经过编译之后生成的可执行文 ...

  2. android: 多线程编程基础

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

  3. Android 多线程编程

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

  4. C#多线程编程系列(二)- 线程基础

    目录 C#多线程编程系列(二)- 线程基础 1.1 简介 1.2 创建线程 1.3 暂停线程 1.4 线程等待 1.5 终止线程 1.6 检测线程状态 1.7 线程优先级 1.8 前台线程和后台线程 ...

  5. Python GUI之tkinter窗口视窗教程大集合(看这篇就够了) JAVA日志的前世今生 .NET MVC采用SignalR更新在线用户数 C#多线程编程系列(五)- 使用任务并行库 C#多线程编程系列(三)- 线程同步 C#多线程编程系列(二)- 线程基础 C#多线程编程系列(一)- 简介

    Python GUI之tkinter窗口视窗教程大集合(看这篇就够了) 一.前言 由于本篇文章较长,所以下面给出内容目录方便跳转阅读,当然也可以用博客页面最右侧的文章目录导航栏进行跳转查阅. 一.前言 ...

  6. “全栈2019”Java多线程第六章:中断线程interrupt()方法详解

    难度 初级 学习时间 10分钟 适合人群 零基础 开发语言 Java 开发环境 JDK v11 IntelliJ IDEA v2018.3 文章原文链接 "全栈2019"Java多 ...

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

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

  8. android ——多线程编程

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

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

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

随机推荐

  1. react项目搭建

    1.下载安装node.js,需要node.js环境. 2.经过挑选,决定选择creat-react-app这个项目脚手架,然后输入指令安装          $ npm install -g crea ...

  2. c#Dapper 批量插入Mysql

    <connectionStrings> <add name="sqlconnectionString" connectionString="server ...

  3. centos free详解

    CentOS 6及以前 $ free total used free shared buffers cached Mem: 4040360 4012200 28160 0 176628 3571348 ...

  4. javaweb开发.eclipse使用小常识

    一.javabean快速生成 1.写好属性,如 package me.lst.domain; import java.io.Serializable;import java.sql.Date; /** ...

  5. 实战Python实现BT种子转化为磁力链接

    经常看电影的朋友肯定对BT种子并不陌生,但是BT种子文件相对磁力链来说存储不方便,而且在网站上存放BT文件容易引起版权纠纷,而磁力链相对来说则风险小一些. 将BT种子转换为占用空间更小,分享更方便的磁 ...

  6. 如何查出sqlserver 性能瓶颈

    转载地址:https://www.cnblogs.com/yanwenbink05/p/4047374.html

  7. 2019.02.21 bzoj2829: 信用卡凸包(凸包)

    传送门 题意:给nnn个A∗BA*BA∗B的矩形,其中每个矩形的四个角被改造成了半径为rrr的四分之一 圆,问这些矩形的凸包周长. 思路:考虑求出圆心的凸包周长然后加上一个整圆的周长,证明很简单,略掉 ...

  8. JAVA 8 主要新特性 ----------------(一)总纲

    一.版本中数据结构的修改浅析 二.JDK1.8优点概括 三.新功能Lambda表达式入门 四.Lambda函数式接口 五.Lambda方法引用与构造器引用 六.集合Stream API 七.新时间日期 ...

  9. javascript的常用事件

  10. C#字符串操作方法签名等

    class Program { /// <summary> /// C# 里Main方法不需要public,而且不允许有两个是Main(string[] args)[包括String[] ...