那么面试时对于AsyncTask一般会提什么问题呢?下面我们来了解一下。
当我们用它来做异步操作的时候,它有两个接口可以使用
· execute(Params …)
· executeOnExecutor(Executor exec, Params …)
这两个方法有什么区别呢?
其实当我们用它来做单个的异步任务操作时没什么区别,意思就是说,比较当前更新UI只需要请求某个网络接口,或者只需要读某个单个文件,这时候用哪个都行。
但是当需要多个异步操作同时进行时,就只能用第二个接口了。
原因:
AsyncTask在默认情况下是串行操作的,也就是说它会执行完当前任务结束后才进行下一个任务。
其实这个限制是在3.0以后才有的,2.3的时候呢默认是会用5个线程进行并发操作。
明白了上面的区别,那么当我们需要多个异步操作同时进行时怎么办呢。这时候我们就需要用 executeOnExecutor(),
第一个参数可以指定不同的线程池方式,
1 无限制线程池的方式(但其实数量是有上限的,可以尝试一下)
new AsyncTask<String, Integer, String>() {
@Override
protected String doInBackground(String... strings) {
return null;
}
}.executeOnExecutor(Executors.newCachedThreadPool(),"");
2 限制为n个线程同时进行
new AsyncTask<String, Integer, String>() {
@Override
protected String doInBackground(String... strings) {
return null;
}
}.executeOnExecutor(Executors.newFixedThreadPool(n),"");
所以面试时对于AsyncTask的问题应该有把握了吧,
· 首先它在3.0之后默认情况下是串行进行的
· 2.3的时候它默认5个线程并发进行
· 如果需要应对多个任务并发的时候,就需要用executeOnExecutor指定线程池的实现方式