美文网首页
Android中的线程

Android中的线程

作者: 陈兴强hha | 来源:发表于2018-05-20 14:15 被阅读0次

一 为什么使用线程?

Android中在主线程执行耗时操作会产生ANR(Application Not Responding)即应用无响应。

二 Android中的线程有哪几种?

1.Thread

Java中的线程实现方式有两种,一种是继承(extends)Thread,第二种是实现(implements)Runnable

2.AsyncTask

一种轻量级的异步实现类,封装了Thread和Handler,在线程中执行后台任务,进度和结果传递给ActivityThread更新ui。
特点1:方便更新ui
特点2:不适合特别耗时的任务

3.IntentService

一个Service,继承自Service封装了HandlerThread和Thread
特点1:Service都优先级比Handler高适合一些高优先级的任务
特点2:适合执行一些耗时的任务

4.HandlerThread

继承了Thread,一种可以使用Handler的Thread
一种具有消息循环的线程,它的内部可以使用handler
它的具体使用场景时IntentService

三 Thread

1.实现Runnable接口

第一步:Implements Runnable接口

class mRunnable implements Runnable

第二步:实现Runnable接口的run方法,业务逻辑写在这里

public void run()

第三步:线程名字(可以不写)

thread=new Thread(this,name);

name:线程名称

第四步 运行

thread.start();

看Demo

package com.example.myview2;

import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Log;

public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        
        RunnableDemo runnableDemo=new RunnableDemo();
        runnableDemo.start("线程1");
        
    }


    class RunnableDemo implements Runnable{

        private Thread thread;

        @Override
        public void run() {
            Log.e("====","业务逻辑"+:thread.getName());
        }

        public void start(String name){
            thread=new Thread(this,name);
            thread.start();

        }
    }
    
}

2.继承Thread接口

第一步:继承 Thread
第二步:实现run方法,业务逻辑写在这里
第三步:线程名字(可以不写)
第四步:start() 运行

看Demo

package com.example.myview2;

import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Log;

public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        RunnableDemo runnableDemo=new RunnableDemo();
        runnableDemo.start("线程1");

    }


    class RunnableDemo extends Thread{

        private Thread thread;

        @Override
        public void run() {
            Log.e("====","业务逻辑:"+thread.getName());
        }

        public void start(String name){
            thread=new Thread(this,name);
            thread.start();

        }
    }

}

四 AsyncTask

1.三个参数:

Params:

参数的类型

Progress:

后台任务的进度

Result:

任务的返回结果类型

2.四个方法:

onPreExecute:

在异步任务执行之前调用,运行于主线程。

doInBackground(Params...params):

异步任务,在线程池中执行,执行异步任务。
通过publishProgress更新任务进度,publicProgress会调用onProgressUpdate()方法
doInBackground方法会返还计算结果给onPostExecute

onProgressUpdate(Progress...values):

在主线程中执行,当后台的任务发生改变时,执行onProgressUpdate方法

onPostExecute(Result result)

在主线程中执行,在异步任务执行之后,此方法会被调用,result参数是doInBackgroun方法返回的

四个方法执行顺序:

onProExecute -> doInBackground -> onPostExecute

onCancelled()

异步任务取消时调用,此时不会运行onPostExecute
注意:
(1)AsyncTask,Execute方法必须在主线中执行
(2)不要在程序中直接调用onProgressUpdate、onPostExecute、doInBackground、onPostExecute等方法
(3)一个AsyncTas只能调用一次

五 IntentService

封装了HandlerThread和Thread继承自service,而service是一个抽象类,因此必需创建它的子类才能使用InterService,它适合执行后台耗时的任务 ,任务执行完后它会自动停止。由于IntentService是服务,所以它的先级比单纯的线程要高。

六 HandlerThread

HandlerThread继承自Thread,它是一种可以使用Hander的Thread。
它在run方法中通过Looper.prepare()来创建消息对列,通过looper.loop()开起消息循环

HandlerThread于普通Thread的不同之处:

HandlerThread:内部创建了消息对列,外部需要通过handler的方式通知HandlerThread执行一个具体的任务。
Thread:在run方法中执行一些耗时任务。
注意:
由于HandlerThread是一个无限循环,不用时通过quit、quitSafely终止线程执行。

七 线程池

Android中的线程来源于Java中的Executor,Executor是一个接口,真正的线程实现来源于ThreadPoolExecutor.
它的优点有以下三点:
(1)重用线程池中的线程避免因线程的创建和销毁带来的性能开销
(2)控制线程的最大并发数,避免大量的线程因互相抢占资源而导致阻塞
(3)能对线程进行简单的管理,并提供定时执行,定时循环等功能。

相关文章

  • 笔记:Android线程和线程池

    Android线程和线程池 Android中的线程操作相关的类有 AsyncTask IntentService ...

  • Android中的线程和线程池

    Android中的线程 线程,在Android中是非常重要的,主线程处理UI界面,子线程处理耗时操作。如果在主线程...

  • Android 开发艺术探索读书笔记 11 -- Android

    本篇文章主要介绍以下几个知识点:主线程和子线程Android 中的线程形态Android 中的线程池 11.1 主...

  • Android线程池的使用

    一、线程与线程池,为什么要使用线程池 1、Android中的线程 在Android中有主线程和子线程的区分。主线程...

  • 深度解析多线程带来的Android性能优化原理

    Android 开发中多线程的必要性; Android 开发中,许多操作都需要由 主线程(UI 线程)来执行,比如...

  • Android 性能优化:多线程

    前言Android 开发中多线程的必要性理解 Android 多线程MessageQueueLooperHandl...

  • Android 跨线程更新 UI

    在 Android 中,视图组件并不是线程安全的。出于线程保护,Android 会拒绝子线程对主线程 UI 的更新...

  • HandlerThread

    Android中为什么要采用Handler机制?Handler的作用是什么? Android中的UI线程(主线程)...

  • <> Chapter 11

    Android的线程和线程池 主线程和子线程 Android中的主线程也叫UI线程,主要作用是运行四大组件以及处理...

  • Android中多线程的使用

    说完了《Java中的多线程详解》之后,今天来说一下Android中的多线程。 先来列举下Android下启用多线程...

网友评论

      本文标题:Android中的线程

      本文链接:https://www.haomeiwen.com/subject/wvszdftx.html