美文网首页
Android异步处理技术

Android异步处理技术

作者: 潜心之力 | 来源:发表于2017-10-08 12:32 被阅读0次

Handler是Android的异步消息处理机制,常用于更新UI操作。


一、Handler、Looper、Message、MessageQueue 四者间的关系

1、Handler是处理者,负责发送和处理消息。

2、Looper是每个线程中MessageQueue的管家,Looper.loop()是一个无限的循环,调用此方法可以不断地从MessageQueue中取出未处理的消息,并传递到Handler的handlerMessage(Message msg)方法中,让Handler进行处理,每个线程只有一个Looper对象。

3、Message 是线程间传递的消息,它内部可以携带少量信息,用于不同线程之间的数据交互,由Handler发送及处理。

4、MessageQueue是存放Message的队列,每个线程只有一个MessageQueue对象。

5、概括:Handler发送消息,MessageQueue存放Handler发送过来的消息,Looper调用loop()方法后,不断地从MessageQueue中取出消息,并回传给Handler的handlerMessage(Message msg)方法中,让Handler进行处理。


二、Handler发送Message

1、创建一个Message对象

Message message =new Message(); 

Message message =mHandler.obtainMessage();

第一种方法:每次都创建新的对象,在消息处理完后,对象空置,会造成内存资源的浪费

第二种方法:如果有空置的Message对象则获取,没有则创建新的Message对象,节省资源。

2、Message携带信息

message.what=1;  //携带整型数据

message.arg1=2; //携带整型数据

message.arg2=3; //携带整型数据

message.obj=4;  //携带Object对象

3、创建Handler对象,并重写父类处理消息的方法

private Handler mHandler=new Handler() {

@Override

public void handleMessage(Message msg) {

//处理消息

}

};

4、发送Message对象,效果一样

message.sendToTarget();

mHandler.sendMessage(message);

mHandler.sendEmptyMessage(what);


三、Handler 发送 Runnable

1、创建Runnable对象

class MyRunnable implements Runnable {

@Override

public void run() {

// 逻辑处理

}

}

2、发送Runnable对象,按各自需求选择下列方式

mHandler.post(mMyRunnable);

mHandler.postDelayed(mMyRunnable,2000);

mHandler.postAtFrontOfQueue(mMyRunnable);

mHandler.postAtTime(mMyRunnable,1000);


四、非UI线程使用Handler

1、自行开启一个线程(原理)

class MyThread extendsThread {

public Handler handler;

@Override

public void run() {

Looper.prepare();  //手动准备

handler=new Handler() {

@Override

public voidhandleMessage(Message msg) {

Log.e("current thread:", Thread.currentThread().getName());

}

};

Looper.loop();  //手动轮循

}

}

使用方式:

mMyThread=new MyThread();

mMyThread.start();

Thread.sleep(500);  //休眠原因,mMyThread.handler创建需要时间

mMyThread.handler.sendEmptyMessage(1001);


2、HandlerThread的使用(封装原理的类)

mHandlerThread=new HandlerThread("线程名字");

mHandlerThread.start();

mChildHandler=newHandler(mHandlerThread.getLooper()){  //子线程的Handler

@Override

public void handleMessage(Message msg) {

//子线程给主线程发消息

mHandler.sendEmptyMessage(1001);  //主线程的Hanlder

}

};


五、Handler的消息拦截

private Handler mHandler=new Handler(new Handler.Callback() {

@Override

public boolean handleMessage(Message msg) {

return false;    //返回true则拦截消息

}

}) {

@Override

public void handleMessage(Message msg) {

//不拦截的消息在这里处理

}

};

传入Callback解决这个问题(非UI线程使用Handler)

六、移除消息

mHandler.removeCallbacks(Runnable runnable);

mHandler.removeMessages(Message message);

mHandler.removeCallbacksAndMessages(null);


七、在退出页面时,清空未处理的消息,释放资源

@Override

protected voidonDestroy() {

super.onDestroy();

mHandler.removeCallbacksAndMessages(null);

}


八、AsyncQueryHandler

AsyncQueryHandler是一个抽象类,继承自Handler,它用于在ContentProvider上面执行异步的CRUD(增删查改)操作的工具类,CRUD操作会被放到一个单独的子线程中执行,当操作结束获得结果后,将通过消息的方式传递给调用AsyncQueryHandler的线程,通常就是主线程。


九、IntentService

Service的各个生命周期函数都是在主线程运行的,它本身并不是一个异步处理技术。为了能够在Service中实现在子线程中处理耗时任务,Android引入一个Service的子类:IntentService,它提供在后台线程中处理异步任务的机制。注意:IntentService的子类,也需要在AndroidManifest.xml中注册。

基本用法

十、Executor

创建和销毁对象是存在开销的,如果应用中频繁出现线程的创建和销毁,那么会影响到应用的性能,使用Java Executor框架可以通过线程池等机制解决这个问题,改善应用的体验。Executor框架的主要目的是分离任务的创建和它的执行,它提供的能力如下:

1、创建工作线程池,同时通过队列来控制能够在这些线程执行的任务的个数。

2、检测导致线程意外终止的错误。

3、等待线程执行完成并获取执行结果。

4、批量执行线程,并通过固定的顺序获取执行结果。

5、在合适的时机启动后台线程,从而保证线程执行结果

实现自己的Executor类

6、线程池概念

固定大小的线程池:Executors.newFixedThreadPool(5);

可变大小的线程池:Executors.newCachedThreadPool();

单个线程的线程池:Executors.newSingleThreadExecutor();

自定义线程池:new ThreadPoolExecutor(int corePoolSize,int maximumPoolSize,

long keepAliveTime, TimeUnit unit, BlockingQueue<Runnable> workQueue);


十一、AsyncTask

基本用法

1、AsyncTask跟随的三个参数类型分别是传入的参数类型(doInBackground的传参),返回下载的进度单位(onProgressUpdate的传参),返回的结果类型(onPostExecute的传参)。

2、创建AsyncTask后,调用AsyncTask的execute方法启动任务,execute方法传入的参数对应doInBackground的传参。

3、复写onProgressUpdate方法,自定义进度提示,在doInBackground中调用publichProgress(progress) 方法,及时更新界面。

相关文章

  • Android异步处理技术

    Thread HandlerThread AsyncQueryHandler IntentService Exec...

  • Android 异步处理技术

    移动应用开发要求我们需要掌握多线程的应用,耗时的操作应该放到子线程中,避免阻塞主线程,导致 ANR。异步处理技术是...

  • Android异步处理技术

    Handler是Android的异步消息处理机制,常用于更新UI操作。 一、Handler、Looper、Mess...

  • Android异步处理技术

    1.Thread 2.HandlerThread 3.AsyncQueryHandler 4.IntentServ...

  • Android异步处理机制:Handler,Looper,Mes

    Android异步处理机制:Handler,Looper,MessageQueue 异步处理消息概念: 异步消息处...

  • Android异步处理技术(二)

    异步处理技术(二) 写在前面 前文写了adnroid的前三种异步处理技术,而且前文结尾也说了在这篇会总结后面三种技...

  • 六、Android 异步处理技术

    移动应用开发要求我们正确的处理好主线程和子线程之间的关系,耗时的操作应该放到子线程中,避免阻塞主线程,导致ANR。...

  • Android异步处理技术(一)

    异步处理技术(一) 写在前面 本文章为《Android高级进阶》的读书笔记,看过的朋友可以出门转去别的更深度的文章...

  • Android中异步处理技术

    Android应用中各种类型的线程本质上都基于Linux系统的pthreads,在应用层可以分为三种类型的线程1....

  • Android异步处理技术(一)

    移动应用的开发要求我们正确的处理好主线程和子线程之间的关系,耗时的操作应该放到子线程中,避免阻塞主线程,导...

网友评论

      本文标题:Android异步处理技术

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