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()方法发送出去。

  

时间: 2024-10-09 01:59:28

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

Android多线程编程(一)——多线程基础

什么是进程 一个进程是一个独立(self contained)的运行环境,它可以看作一个程序或者一个应用. 什么是线程 而线程是进程中执行的一个任务,Java运行环境是一个包含了不同累和程序的单一进程.线程可以被称为轻量级进程.线程需要较少的资源来创建和驻留在进程中,并且可以共享进程中的资源. Android线程 Android的线程,实际上和Java的多线程编程并没有什么本质上的不同.当我们需要执行一些耗时操作,比如说发起一条网络请求时,考虑到网速等其他原因,服务器未必会立刻响应我们的请求,如

Android多线程编程之线程池学习篇(一)

Android多线程编程之线程池学习篇(一) 一.前言 Android应用开发中多线程编程应用比较广泛,而应用比较多的是ThreadPoolExecutor,AsyncTask,IntentService,HandlerThread,AsyncTaskLoader等,为了更详细的分析每一种实现方式,将单独成篇分析.后续篇章中可能涉及到线程池的知识,特此本篇分析为何使用线程池,如何使用线程池以及线程池的使用原理. 二.Thread Pool基础 进程代表一个运行中的程序,一个运行中的Android

android: 多线程编程基础

9.1   服务是什么 服务(Service)是 Android 中实现程序后台运行的解决方案,它非常适合用于去执行那 些不需要和用户交互而且还要求长期运行的任务.服务的运行不依赖于任何用户界面,即使 当程序被切换到后台,或者用户打开了另外一个应用程序,服务仍然能够保持正常运行. 不过需要注意的是,服务并不是运行在一个独立的进程当中的,而是依赖于创建服务 时所在的应用程序进程.当某个应用程序进程被杀掉时,所有依赖于该进程的服务也会停 止运行. 另外,也不要被服务的后台概念所迷惑,实际上服务并不会

Android多线程编程方法及开启步骤

作者:华清远见讲师 实现线程的两种方式 使用继承的方法 class MyThread extends Thread{ @Override public void run(){ //处理具体的逻辑 } } 要启动这个线程,在主线程中新建一个该实例,调用其start()方法即可. 使用实现Runnable借口的方式 class MyThread implements Runnable{ @Override public void run(){ //处理具体的逻辑 } } 开启现成时,使用: MyTh

Android 多线程编程初探

Android 中的多线程其实就是 JavaSE 中的多线程,只是为了方便使用,android 封装了一些类,如 AsyncTask.HandlerThread 等,在日常的开发过程中,我们往往需要去执行一些耗时的操作,例如发起网络请求,考虑到网速等其他外在的因素,服务器可能不会立刻响应我们的请求,如果不将这条操作放到子线程中去执行,就会造成主线程被阻塞,今天我们就从多线程的基础来一起探讨 一.线程的基本用法   对于 Andorid 多线程来说我们最新接触到的就是 Thread 和 Runna

Android——多线程编程练习题

随便选择两个城市作为预选旅游目标.实现两个独立的线程分别显示10次城市名,每次显示后休眠一段随机时间(1000ms以内),哪个先显示完毕,就决定去哪个城市.分别用Runnable接口和Thread类实现. layout文件: 1 <?xml version="1.0" encoding="utf-8"?> 2 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/a

Android多线程编程

一.线程的三种使用方法 1.新建一个类继承自Thread,然后重写父类的run()方法,在run()方法中编写耗时逻辑,如下所示: class MyThread()extends Thread{ @Override public void run(){ //耗时操作 } } 开启这个线程的方法:new出这个MyThread类的实例,调用strart()方法,new  MyThread().start() 2.新建一个类实现Runnable接口的方式定义一个线程,如下所示: class MyThr

Android开发实践:多线程编程小结

我们知道,Android系统为了提高程序的实时响应能力,不允许在UI线程中进行耗时的操作,否则会出现ANR异常,因此必须将耗时的任务放到非UI线程中执行.Android/Java提供了很多类来帮助大家完成异步操作,比如:Thread类,Timer类,AsyncTask类,HandlerThread类,以及Executor接口.这些类都分别在什么场合下使用呢? 本文简单地总结一下Android开发中常见的多线程类型和解决方案,并比较和分析了各个方案的区别,以便更好地理解和应用这些API接口. 1.

Android 并发编程:(一)基础知识 —— 架构和组件

本章节所有内容皆为原创,如需转载,请注明出处. http://blog.csdn.net/manoel/article/details/38462631 写在前面的话 很久没写博客了,一是因为自身水平有限,怕误人子弟:二是因为感觉没什么可写的:三是因为时间有限,要寻找工作.学习和生活之间的平衡. 最近一直在研究和梳理Android多线程编程的东西,希望能够把这些分享给大家. 想必做过Android应用开发的同学应该都会知道,多线程是一个特别"诡异"的地方.之所以称为"诡异&q