AsyncTask,ThreadPoolExcutor,Service的简单使用和适用范围
来源:互联网 发布:rds sql审计 编辑:程序博客网 时间:2024/05/21 14:56
AsyncTask,ThreadPoolExcutor,Service的简单使用和适用范围
AsyncTask是Google封装的一个异步处理类,通过实现内部的doInBackGround方法就能实现子线程进行耗时操作
AsyncTask的简单实现
public class multiThreadTask extends AsyncTask<Void,Void,Void>{ //不必须执行,在UI线程调用,执行耗时操作之前的方法,例如用于显示Progressbar提示用户正在进行耗时操作 @Override protected void onPreExecute() { super.onPreExecute(); } //必须实现,在子线程中调用,耗时操作放在次方法内部 @Override protected Void doInBackground(Void... voids) { //your method //需要进行耗时操作的方法(例如操作联网获取数据,操作数据库) return null; } //不必须实现,在UI线程中调用,用于更新状态,例如更新进度条 @Override protected void onProgressUpdate(Void... values) { super.onProgressUpdate(values); } //不必须实现,在UI线程中调用,当完成耗时操作后会调用该方法,例如用于通知用户已经完成耗时操作 @Override protected void onPostExecute(Void aVoid) { super.onPostExecute(aVoid); } }
这是一个最简单的AsyncTask实现类,在需要进行耗时操作的地方进行调用即可,Google已经帮我们封装好了这样的一个类,可以直接进行使用,但是有优点就会有缺点,AsyncTask用的是核心机制是线程池机制,最多同时运行5个core线程,剩下的排队,就是如果同时有超过5个耗时操作使用了AsyncTak就会导致其余的任务会有线程阻塞的风险。
另外还有一点需要注意的特殊情况:
The transfer is on a thread whose lifetime is tied to UI component
传输在线程上发生,而该线程的生命期与UI组件(通常是activity)明确关联,因此此时屏幕旋转,或者activity调用了onDestory的生命周期,这个子线程也会跟着死亡。
由于这个问题的存在,Google给出的解决办法是使用 SERVICE
Service简介
service可以说是一个在后台运行的Activity,它不是一个单独的进程,它只需要应用告诉它要在后台做什么就可以了,它要实现和用户的交互的话需要通过通知栏或则是发送广播,UI去接收显示。它的应用十分广泛,尤其是在框架层,应用更多的是对系统服务的调用。它用于处理一些不干扰用户使用的后台操作。如下载,网络获取。播放音乐,他可以通过INTENT来开启,同时也可以绑定到宿主对象(调用者例如ACTIVITY上)来使用。服务是一个应用程序组件代表应用程序执行一个长时间操作的行为,虽然不与用户交互或供应功能供其它应用程序使用。每个服务类必须有一个相应的包的AndroidManifest.xml中 声明。服务可以通过Context.startService()和Context.bindService()开始工作。它和其他的应用对象一样,在他的宿主进程的主线程中运行。
public class MyService extends Service { @Override public void onCreate() { } @Override public int onStartCommand(Intent intent, int flags, int startId) { //进行耗时操作,可以调用Service.stopSelf() 或 Service.stopSelfResult()来自己停止 return START_STICKY; } @Override public void onDestroy() { }}
在需要进行耗时操作的地方调用context.startService();
我们拿服务来进行一个后台长时间的动作,为了不阻塞线程,然而,Thread就可以达到这个效果,为什么不直接使用Thread去代替服务呢?
Service 是android的一种机制,当它运行的时候如果是Local Service,那么对应的 Service 是运行在主进程的 main 线程上的。如:onCreate,onStart 这些函数在被系统调用的时候都是在主进程的 main 线程上运行的。如果是Remote Service,那么对应的 Service 则是运行在独立进程的 main 线程上。因此请不要把 Service 理解成线程。
ThreadPoolExecutor
ThreadPoolExecutor是Java的多线程处理方法
public class ThreadPool { private int corePoolSize;// 核心线程数 private int maximumPoolSize;// 最大线程数 private long keepAliveTime;// 休息时间 private ThreadPoolExecutor executor; private ThreadPool(int corePoolSize, int maximumPoolSize, long keepAliveTime) { this.corePoolSize = corePoolSize; this.maximumPoolSize = maximumPoolSize; this.keepAliveTime = keepAliveTime; } public void execute(Runnable r) { if (executor == null) { executor = new ThreadPoolExecutor( corePoolSize, maximumPoolSize, TimeUnit.SECONDS, new LinkedBlockingQueue<Runnable>(), Executors.defaultThreadFactory(), new AbortPolicy()); // 参1:核心线程数; // 参2:最大线程数; // 参3:线程休眠时间; // 参4:时间单位; // 参5:线程队列; // 参6:生产线程的工厂; // 参7:线程异常处理策略 } // 线程池执行一个Runnable对象, 具体运行时机线程池说了算 executor.execute(r); } // 取消任务 public void cancel(Runnable r) { if (executor != null) { // 从线程队列中移除对象 executor.getQueue().remove(r); } }
在需要进行耗时操作的地方调用thread.execute(Runnabler)方法,会开启一个子线程,并用线程池管理(关于线程池不是此处的讨论范围)
总结:
既然三种都是可以进行异步操作的方法,那么到底该用哪个?
AsyncTask:适用于数据轻量且需要及时在主线程刷新UI的时候
Service:适用于没有UI操作,有大量数据需要同步到本地的###时候,(例如同步用户数据,聊天数据)
Thread:一般的长任务(如加载数据到界面)
0 0
- AsyncTask,ThreadPoolExcutor,Service的简单使用和适用范围
- Android中对ThreadPoolExcutor的简单使用
- Service使用方法 | AsyncTask的使用和原理 | 定时器触发线程
- Service使用方法 | AsyncTask的使用和原理 | 定时器触发线程
- AsyncTask的简单使用
- AsyncTask的简单使用
- AsyncTask的简单使用
- AsyncTask的简单使用
- AsyncTask的简单使用
- AsyncTask的简单使用
- AsyncTask的简单使用
- AsyncTask的简单使用
- AsyncTask的简单使用
- AsyncTask的简单使用
- AsyncTask的简单使用
- AsyncTask的简单使用
- HashMap,LinkHashMap和TreeMap的区别及适用范围简单记录
- 几种神经网络的简单区别和适用范围
- Lucene中文切分原理及其他常见切分算法
- Java关键字之final用法
- 字符串截取
- WEB服务器与应用服务器的区别
- dpi 、 dip 、分辨率、屏幕尺寸、px、density 关系以及换算
- AsyncTask,ThreadPoolExcutor,Service的简单使用和适用范围
- HDU-5801 可持久化Trie树
- poj2356——Find a multiple(抽屉原理)
- HBase Configuration过程
- Mac系统下利用ADB命令连接android手机并进行文件操作
- getWidth()和getMeasuredWidth()的区别
- 打开微信代码
- mysql反向生成hbm.xml后,由hibernate向sql写数据中文出现乱码问题
- 极小化极大算法