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 ——多线程编程相关推荐

  1. android 多线程编程

    主线程的职责是创建.显示和更新UI控件.处理UI事件.启动子线程.停止子线程;子线程的职责是进行处理和向主线程发出更新UI消息,而不是直接更新UI. android 多线程编程报错: 05-14 15 ...

  2. android: 多线程编程基础

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

  3. 线程与进程、Android多线程编程

    线程与进程.Android多线程编程 目录 一.概念 1.程序 2.进程 3.并发 4.并行 5.线程 二.Android中的进程与线程 1.安卓的进程 2.安卓的线程 三.Android多线程编程 ...

  4. Android多线程编程(一)- 线程基础

    Android多线程编程(一) 到了学习下一部分了,多线程编程一直都是Android经常使用的部份,在进行网络请求或者访问数据库时,为了避免主线程被耗时操作阻塞了进度,通常都会开启子线程进行处理,多线 ...

  5. Android开发实例——倒计时器——Android多线程编程

    文章目录 一.倒计时器功能描述 二.实现步骤 1.新建Activity,命名为ThreadDemo 2.设计ThreadDemo 的布局文件 3.编写ThreadDemo.java 文件代码 3.1 ...

  6. Android多线程编程

    Android多线程编程 其实就是将耗时操作放在子线程里运行,防止主线程被阻塞,影响软件使用. 线程的基本用法 定义一个线程只需要新建一个类继承自Thread,然后重写父类的run()方法,并在里面编 ...

  7. android开发多线程编程,Android多线程编程

    Handler AsyncTask HTTPURLConnection使用 get方式使用 private void initData() { new Thread(() -> { try { ...

  8. Android多线程编程(异步通信)---Handler和AsyncTask

    Handler机制: 1)主线程UI: 本身就有一个Looper机制,其中有Handler,中包含了消息队列MessageQueen: 2)UI线程模型: UI主线程不允许其他线程操作组件,只有UI主 ...

  9. Android 开发中的多线程编程技术

    此文章来自"Intel Software"应用开发 多线程这个令人生畏的"洪水猛兽",很多人谈起多线程都心存畏惧.在Android开发过程中,多线程真的很难吗? ...

最新文章

  1. zzzp0371 属于本人
  2. php 自动处理小图的代码,PHP 处理图片的类实现代码
  3. HDU1266 Reverse Number
  4. Python 函数参数的分类及使用方法
  5. 怎样保护计算机连接线,一根网线把电脑烧了:雷雨天如何保护家电?
  6. 08-mysql-条件查询-常见函数与小结
  7. 《ArcGIS Runtime SDK for Android开发笔记》——(1)、Android Studio下载与安装
  8. python终端会话_如何为Python终端提供持久性历史记录
  9. java hashmap 实现 序列化_java – Jackson JSON对象映射器反序列化为LinkedHashMap而不是HashMap...
  10. [转载] 信息系统项目管理师教程——06 信息化基础知识
  11. android q mix3,Android Q+5G 小米MIX3现场播放8K视频
  12. 亚马逊SP-API接口申请对外公开可发布教程
  13. 计算机桌面个性化怎样设置方法,桌面文件夹图标个性化【设置方法】
  14. C++ float转换int
  15. 第8章 SMS--短信服务
  16. 线性代数常用名词详解1
  17. 腾讯优图·AI 开放平台全面升级:AI 能力最全面的平台
  18. 使用Burp抓包iphone(苹果)
  19. VS中使用nasm汇编编译器的方法
  20. java 俄罗斯方块消除整行_帮忙看下我的俄罗斯方块满行删除方法,为嘛一次只能删除1行。。...

热门文章

  1. 关于java assertion
  2. Windows平台下使用Active Directory对Subversion进行权限控制(非完美解决方案)
  3. EDM营销之如何使邮件列表更加有效
  4. 数据库不完全恢复 以及恢复到测试环境:
  5. C Primer Plus 第7章 C控制语句:分支和跳转 7.4 一个统计字数的程序
  6. Tomcat - Maven plugin: 运行找不到webapp
  7. iOS开发--验证码
  8. java   cxf实现webservice接口方式之不依赖spring
  9. TCP三次握手及四次挥手详细图解(转)
  10. javax.servlet.jsp.JspTagException: