1、handler
2、activityrunonuithread(runnable)
3、viewpost(runnable)
4、viewpostdelayed(runnabe,long)
5、asynctask
进程是系统调度和资源分配的一个独立单位。
在Android中,一个应用程序就是一个独立的集成,应用运行在一个独立的环境中,可以避免其他应用程序/进程的干扰。当我们启动一个应用程序时,系统就会创建一个进程(该进程是从Zygote中fork出来的,有独立的ID),接着为这个进程创建一个主线程,然后就可以运行MainActivity了,应用程序的组件默认都是运行在其进程中。开发者可以通过设置应用的组件的运行进程,在清单文件中给组件设置:android:process = "进程名";可以达到让组件运行在不同进程中的目的。让组件运行在不同的进程中,既有好处,也有坏处。我们依次的说明下。
好处:每一个应用程序(也就是每一个进程)都会有一个内存预算,所有运行在这个进程中的程序使用的总内存不能超过这个值,让组件运行不同的进程中,可以让主进程可以拥有更多的空间资源。当我们的应用程序比较大,需要的内存资源比较多时(也就是用户会抱怨应用经常出现OutOfMemory时),可以考虑使用多进程。
坏处:每个进程都会有自己的虚拟机实例,因此让在进程间共享一些数据变得相对困难,需要采用进程间的通信来实现数据的共享。
线程是进程的一个实体,是CPU调度和分派的基本单位,它是比进程更小的能独立运行的基本单位。
在Android中,线程会有那么几种状态:创建、就绪、运行、阻塞、结束。当应用程序有组件在运行时,UI线程是处于运行状态的。默认情况下,应用的所有组件的 *** 作都是在UI线程里完成的,包括响应用户的 *** 作(触摸,点击等),组件生命周期方法的调用,UI的更新等。因此如果UI线程处理阻塞状态时(在线程里做一些耗时的 *** 作,如网络连接等),就会不能响应各种 *** 作,如果阻塞时间达到5秒,就会让程序处于ANR(application not response)状态。
1线程作用
减少程序在并发执行时所付出的时空开销,提高 *** 作系统的并发性能。
2线程分类
守护线程、非守护线程(用户线程)
21 守护线程
定义:守护用户线程的线程,即在程序运行时为其他线程提供一种通用服务
常见:如垃圾回收线程
设置方式:threadsetDaemon(true);//设置该线程为守护线程
22 非守护线程(用户线程)
主线程 & 子线程。
221 主线程(UI线程)
定义:Android系统在程序启动时会自动启动一条主线程
作用:处理四大组件与用户进行交互的事情(如UI、界面交互相关)
因为用户随时会与界面发生交互,因此主线程任何时候都必须保持很高的响应速度,所以主线程不允许进行耗时 *** 作,否则会出现ANR。
222 子线程(工作线程)
定义:手动创建的线程
作用:耗时的 *** 作(网络请求、I/O *** 作等)
23 守护线程与非守护线程的区别和联系
区别:虚拟机是否已退出,即
a 当所有用户线程结束时,因为没有守护的必要,所以守护线程也会终止,虚拟机也同样退出
b 反过来,只要任何用户线程还在运行,守护线程就不会终止,虚拟机就不会退出
3线程优先级
31 表示
线程优先级分为10个级别,分别用Thread类常量表示。
32 设置
通过方法setPriority(int grade)进行优先级设置,默认线程优先级是5,即 ThreadNORM_PRIORITY。
4线程状态
创建状态:当用 new *** 作符创建一个线程的时候
就绪状态:调用 start 方法,处于就绪状态的线程并不一定马上就会执行 run 方法,还需要等待CPU的调度
运行状态:CPU 开始调度线程,并开始执行 run 方法
阻塞(挂起)状态:线程的执行过程中由于一些原因进入阻塞状态,比如:调用 sleep/wait 方法、尝试去得到一个锁等
结束(消亡)状态:run 方法执行完 或者 执行过程中遇到了一个异常
(1)start()和run()的区别
通过调用Thread类的start()方法来启动一个线程,这时此线程是处于就绪状态,并没有运行。调用Thread类调用run()方法来完成其运行 *** 作的,方法run()称为线程体,它包含了要执行的这个线程的内容,run()运行结束,此线程终止,然后CPU再调度其它线程。
(2)sleep()、wait()、yield()的区别
sleep()方法属于Thread类,wait()方法属于Object类。
调用sleep()方法,线程不会释放对象锁,只是暂停执行指定的时间,会自动恢复运行状态;调用wait()方法,线程会放弃对象锁,进入等待此对象的等待锁定池,不调用notify()方法,线程永远处于就绪(挂起)状态。
yield()直接由运行状态跳回就绪状态,表示退让线程,让出CPU,让CPU调度器重新调度。礼让可能成功,也可能不成功,也就是说,回到调度器和其他线程进行公平竞争。
1Android线程的原则
(1)为什么不能再主线程中做耗时 *** 作
防止ANR, 不能在UI主线程中做耗时的 *** 作,因此我们可以把耗时的 *** 作放在另一个工作线程中去做。 *** 作完成后,再通知UI主线程做出相应的响应。这就需要掌握线程间通信的方式了。 在Android中提供了两种线程间的通信方式:一种是AsyncTask机制,另一种是Handler机制。
(2)为什么不能在非UI线程中更新UI 因为Android的UI线程是非线程安全的,应用更新UI,是调用invalidate()方法来实现界面的重绘,而invalidate()方法是非线程安全的,也就是说当我们在非UI线程来更新UI时,可能会有其他的线程或UI线程也在更新UI,这就会导致界面更新的不同步。因此我们不能在非UI主线程中做更新UI的 *** 作。
2Android实现多线程的几种方式
3为何需要多线程
多线程的本质就是异步处理,直观一点说就是不要让用户感觉到“很卡”。
4多线程机制的核心是啥
多线程核心机制是Handler
推荐Handler讲解视频: 面试总被问到Handler?带你从源码的角度解读Handler核心机制
根据上方提到的 多进程、多线程、Handler 问题,我整理了一套 Binder与Handler 机制解析的学习文档,提供给大家进行学习参考,有需要的可以 点击这里直接获取!!! 里面记录许多Android 相关学习知识点。
步骤:
1、创建Handler对象(此处创建于主线程中便于更新UI)。
2、构建Runnable对象,在Runnable中更新界面。
3、在子线程的run方法中向UI线程post,runnable对象来更新UI。
代码
import androidosBundle;
import androidosHandler;
import androidosSystemClock;
import androidappActivity;
import androidcontentIntent;
import androidviewMenu;
import androidviewSurfaceHolder;
import androidviewView;
import androidwidgetButton;
import androidwidgetTextView;
public class MainActivity extends Activity {
private Button button;
private TextView textview;
private final int SPLASH_DISPLAY_LENGHT = 1;
private static int flag = 0;
private static int count=0;
private int ab=1;
private boolean isrun = true;
@Override
protected void onCreate(Bundle savedInstanceState) {
superonCreate(savedInstanceState);
setContentView(Rlayoutactivity_main);
button = (Button)findViewById(Ridbutton1);
textview = (TextView)findViewById(RidtextView1);
final Handler handler= new Handler();
final Runnable runnable = new Runnable() {
public void run() {
textviewsetText(IntegertoString(ab));
}
};
final Thread t = new Thread(){
//public boolean isrun=true;
@Override
public void run() {
while(isrun)
{
handlerpost(runnable); //加入到消息队列这样没有启动新的线程,虽然没有报异常。但仍然阻塞ProgressDialog的显示
ab++;
try {
sleep(1000); //直接调用
} catch (InterruptedException e) {
return;
}
}
}
};
tstart();
buttonsetOnClickListener(new ButtonOnClickListener()
{
@Override
public void onClick(View view)
{
isrun=false;
}
});
}
}
一个Android 程序默认情况只有一个进程,但是一个进程可以有多个线程。其中有一个UI 线程也称为UI主线程,UI Thread在Android程序运行的时候就被创建,主要是负责控制UI界面的显示、更新和控件交互。所有的Android应用程序组件----包括Activity、Service、Broadcast Receiver都在应用程序的主线程中运行。因此,任何组件中的费时 *** 作处理都可能阻塞所有其他的组件、包括Service和可见的Activity。
在Android 中,对未响应的定义是:Activity对一个输入事件在5s内没有响应,或者Broadcast Receiver在10s内没有完成他的onReceive处理程序。对于任何不用直接和用户界面进行交互的重要处理,使用后台线程技术处理是非常重要的,将文件 *** 作、网络交互、数据库、复杂计算调度到后台线程中完成非常重要,以免阻塞主线程。
方法一:Thread+Handler
开启一个新线程:new Thread(new MyThread())start();
//通过Handler物件,通知主线程UI Thread来更新界面
Handler myHandler=new Handler(){
//此方法主要用于更新UI
public void handleMessage(Message msg){
switch(msgwhat){
//根据Thread返回的标识进行相应的处理
}
}
};
class MyThread implements Runnable{
public void run(){
int what=0;
//将耗时 *** 作放到这里处理
//to-do
以上就是关于android开发怎么获取后台线程全部的内容,包括:android开发怎么获取后台线程、每个Android 都应必须了解的多线程知识点~、android里如何在子线程中如何更新主线程的控件等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)