android--多进程和多线程

来源:互联网 发布:用stata怎么导面板数据 编辑:程序博客网 时间:2024/05/22 12:34

一,进程
1.前台进程,是用户当前正在使用的进程,只有一些前台进程可以在任何时候存在,最后一个被结束的
2.可见进程,不包含前台进程的组件,会在屏幕上显示一个可见的UI
3.后台不可见进程
4.未运行任何程序组件的线程,作为一个缓存,缩短下次程序需要重新使用的启动时间系统经常种植这些进程,可以调解程序缓存和系统缓存的平衡
二,线程
当程序第一次启动时,会开启一个主线程(负责处理与UI有关的事件),那么请启动的线程没办法动态改变界面组件的属性值,handler可以接受子线程发送的数据,并用此数据配合主线程对UI进行修改
1.定义一个线程,只需要新建一个类继承Thread,然后重写父类的run()方法,并在里面编写耗时逻辑就行
class Mythread extends Thread{
@Override
public void run(){
//处理具体的逻辑
]
}
启动
New Mythread().start();
2.继承的耦合性有点高,大部分选择Runnnable方法
class Mythread implements Runnable{
@Override
public void run(){
//处理具体的逻辑
]
}
启动:
Mythread myThread=new Mythreas();
new Thread(Mythread).start();
Thread的构造函数接受一个Runnable的参数,而Mythread正是一个实现了Runnable的接口对象
三,异步任务
1. AsyncTask是一个抽象类,通常用于被继承
需要定义三个泛型 :Params 启动任务执行的输入参数的类型,Progress 后台任务完成的进度值的类型
Result 后台执行任务完成后返回结果的类型
2.方法:
a:先创建子类,并为泛型指定类型,如果不需要,指定为void
b: 根据需要,实现方法, 
      *onPreExecute(), 该方法将在执行实际的后台操作前被UI 线程调用。可以在该方法中做一些准备工作,如在界面上显示一个进度条,或者一些控件的实例化,这个方法可以不用实现。

       * doInBackground(Params...), 将在onPreExecute 方法执行后马上执行,该方法运行在后台线程中。这里将主要负责执行那些很耗时的后台处理工作。可以调用 publishProgress方法来更新实时的任务进度。该方法是抽象方法,子类必须实现。
      * onProgressUpdate(Progress...),在publishProgress方法被调用后,UI 线程将调用这个方法从而在界面上展示任务的进展情况,例如通过一个进度条进行展示。
      * onPostExecute(Result), 在doInBackground 执行完成后,onPostExecute 方法将被UI 线程调用,后台的计算结果将通过该方法传递到UI 线程,并且在界面上展示给用户.

      * onCancelled(),在用户取消线程操作的时候调用。在主线程中调用onCancelled()的时候调用

c:调用子类的实例execute(Params...params),是让任务是以单线程队列方式或线程池队列方式运行
d:规则:必须在线程中创建实例,调用excute方法,AsyncTask只能被执行一次
 四,异步消息处理机制
  1.Message
     线程之间传递的消息,可以在内部携带少量的信息,用于在不同的线程之间交换数据,如arg1何arg2携带整形数据,obj字段携带Object对象
2.Handler
    用于发送(SendMessage)和处理(HandleMessage)消息的
3.MessageQueue
    消息队列,存放所有通过Handler发送的消息,每个线程只有一个队列
4.Looper
   每个线程的 MessageQueue的管家,调用Looper的loop方法,进入一个无限循环,每当MessageQueue存在一条消息,就将它取出,传递到Handler的handleMessage方法
   每个线程也只有一个Looper对象
流程:
    主线程创建一个Handler对象,并重写handleMessage()方法,当在子线程需要对UI进行操作时,创建一个Message对象,并通过Handler将消息发送出去,之后就被添加得到MessageQueue队列中等待,而Looper取出待处理消息,分发回到handleMessage()方法中(主线程执行)

0 0