一 为什么使用线程?
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)能对线程进行简单的管理,并提供定时执行,定时循环等功能。
网友评论