android定时执行异步,android 线程 异步任务

android中常用的异步任务有哪些?

线程之间执行同一个任务怎么共享内存?线程之间执行不同任务怎么共享内存?

AsyncTask,HandlerThread,IntentService,线程池

1 AsyncTask

内部封装了线程池和Handler,主要用于执行异步任务时,将执行的进度和结构post到主线程,方便更新UI

泛型抽象类AsyncTask主要有4个方法需要实现,三个泛型分别表示:任务参数,执行进度,返回结果。四个方法分别为:onPreExecute(),onProgressUpdate(Object... values), doInBackground(Object... objects), onPostExecute(Object o), doInBackground在线程池中执行,其他三个方法在主线程主执行。

注释:asynctask内部含有handler,需要在主线程开启。调用publishProgress,onProgressUpdate方法会被回调。aynctask的excute方法串行执行,excuteOnExcutor并行执行,如果并行执行任务需要注意线程安全问题。

public static final Executor SERIAL_EXECUTOR = new SerialExecutor();

private static volatile Executor sDefaultExecutor = SERIAL_EXECUTOR;

/**

* An {@link Executor} that executes tasks one at a time in serial

* order. This serialization is global to a particular process.

*/

public final AsyncTask execute(Params... params) {

return executeOnExecutor(sDefaultExecutor, params);

}

2 HandlerThread

①封装有消息循环队列线程,可以在其中穿件handler。

注释handlerthread的run方法中由无线循环,终止线程的调用quit或者quitSafely。

3 IntentService

①内部封装了HandlerThread和handler主要用于执行后台任务②提高任务的进程优先级,不容易被系统杀死

abstract IntentService中的方法

private final class ServiceHandler extends Handler {

public ServiceHandler(Looper looper) {

super(looper);

}

@Override

public void handleMessage(Message msg) {

onHandleIntent((Intent)msg.obj);

stopSelf(msg.arg1);

}

}

public void onCreate() {

// TODO: It would be nice to have an option to hold a partial wakelock

// during processing, and to have a static startService(Context, Intent)

// method that would launch the service & hand off a wakelock.

super.onCreate();

HandlerThread thread = new HandlerThread("IntentService[" + mName + "]");

thread.start();

mServiceLooper = thread.getLooper();

mServiceHandler = new ServiceHandler(mServiceLooper);

}

@Override

public void onStart(@Nullable Intent intent, int startId) {

Message msg = mServiceHandler.obtainMessage();

msg.arg1 = startId;

msg.obj = intent;

mServiceHandler.sendMessage(msg);

}

4 线程,线程池

①线程之间怎么共享变量?

如果执行相同的任务可以将共享变量封装到runnable中,如果不同任务,可以将共享变量封装到类中,将对象传递给不同的线程访问。

②线程池的作用?

②①可以重用线程,减少线程创建和销毁所消耗的性能。

②②可以对线程进行管理,(如控制最大并发数,避免大量线程争夺系统资源。控制线程定时和间隔执行。)

③线程池

线程池的接口Executor,实现类是ThreadPoolExecutor

public ThreadPoolExecutor(int corePoolSize,
int maximumPoolSize, long keepAliveTime,

TimeUnit unit,
BlockingQueueworkQueue, ThreadFactory

threadFactory,RejectedExecutionHandler handler)

corePoolSize:核心线程数,线程任务到来时,如果线程数量没有达到核心线程数量,则创建新线程,如果达到,加入任务队列;如果allowCoreThreadTimeOut属性为true,空闲核心线程超过keepAliveTime时间会销毁,

maximumPoolSize:设定线程池所允许创建的最大线程数。

keepAliveTime:非核心空闲线程存活存活时间,如果allowCoreThreadTimeOut属性为true,同时也作用于核心线程。

unit:keepAliveTime存活时间单位。

workQueue:任务队列,提交的runnable任务存储到该队列中。

threadFactory:threadFactory为借口,需要实现其方法newThread来创建线程。

handler:RejectedExecutionHandler为接口,有四个实现类AbortPolicy ,CallerRunsPolicy ,DiscardOldestPolicy, DiscardPolicy,默认为AbortPolicy,当线程数量达到maximumPoolSize时,由handler抛出RejectedExecutionException异常。

④线程池运行时所遵循的规则:

④①有任务时,线程数未达到核心线程数,则创建新线程执行任务,达到或超出最大核心线程数,则加入任务队列

④②如果任务队列已满,则创建非核心线程来执行任务。

④③如果非核心线程数量达到最大值,默认抛出RejectedExecutionException异常。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值