zoukankan      html  css  js  c++  java
  • AsyncTask还要知道的一些知识

    在之前的博客中,对AsyncTask做过详细分析,而且也以小案例的形式,介绍如何基本的使用它。今天再来探讨它,更多的认识,尤其在面试中以下面方式回答,可能印象分更多一些。

    面试题:讲一讲您对AsyncTask的理解:

    可以简单介绍之前文章的内容详解Android中AsyncTask的使用,再介绍一下下面的几点。

    首先AsyncTask的几个基本方法:

    protected void onPreExecute()
    protected abstract Result doInBackground(Params... params)
    protected void onPostExecute(Result result)
    protected void onProgressUpdate(Progress... values)
    

    AsyncTask源码分析

    private static final int CORE_POOL_SIZE = 5;        //核心线程数
    private static final int MAXIMUM_POOL_SIZE = 128;   //最大线程数
    private static final int KEEP_ALIVE = 1;            //超时时间,当线程数超过核心线程数时,超过这个时间的空线程就会被销毁,直到线程数等于核心线程 
    

    AsyncTask缺陷

    • 1.同时只有5个线程去访问网络-->这个是重点
    • 2.线程数目超过128,会抛异常-->这个情况其实还好;

    AsyncTask版本差异

    • COREPOOLSIZE MAXIMUM_POOLSIZE KEEPALIVE在不同的版本上.值是不一样;
    • 1.5前是串行执行的.每次执行1个任务
    • 1.6-2.3之前的版本.是并行执行的.每次执行5个任务
    • 3.0后提供串行和并行,默认情况是串行
    • 5.0后,最大核心数与核心线程数根据CPU来计算。
    • 串行、并行的修改代码如下:

      executeOnExecutor(AsyncTask.SERIAL_EXECUTOR, null);//串行
      executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR, null);//并行。我们想要并行执行,在启动AsyncTask的时候就要这样调用
      

    AsyncTask简单封装

    实际开发我们会去继承Asynctask

    例如:

    abstract class BaseTask extends AsyncTask<Void, Void, Void>{}

    然后不同的任务,让孩子继承自BaseTask

    那么接下来,打印log日志,理解一下版本差异问题。

    安卓sdk不同的版本,线程池中维护的核心线程数目不一样。下面,下面以3.0-5.0之间版本做测试。

    在活动中,创建如下的代码:

    public class MainActivity extends BaseActivity {
    
    	@Override
    	protected void onCreate(Bundle savedInstanceState) {
    		super.onCreate(savedInstanceState);
    		setContentView(R.layout.activity_main);
    		
    
    		findViewById(R.id.btn1).setOnClickListener(new OnClickListener() {
    
    			@Override
    			public void onClick(View v) {
    				
    				new MyTask().execute();
    				new MyTask().execute();
    				new MyTask().execute();
    				new MyTask().execute();
    				new MyTask().execute();
    			}
    		});
    
    	}
    
    	class MyTask extends AsyncTask<Void, Void, Void> {
    
    		@Override
    		protected Void doInBackground(Void... params) {
    			SystemClock.sleep(1000);
    			System.out.println("===doInBackground===");
    			return null;
    		}
    
    	}
    }
    

    点击按钮,执行AsyncTask任务,如果在doInBackground中一次性输出5行日志(3.0-5.0之间核心线程数为5个),就说明此AsyncTask版本是并行执行的,如果隔1秒一行行的执行,则说明是串行的。

    运行截图:


    我们看日志,结果是一行行的执行,显然默认是串行执行。

    但是,这样的话效率就显得低下,我们喜欢的并行执行。这时候手动改为并行。代码:

    findViewById(R.id.btn1).setOnClickListener(new OnClickListener() {
    
    			@Override
    			public void onClick(View v) {
    				new MyTask().executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR, null);
    				new MyTask().executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR, null);
    				new MyTask().executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR, null);
    				new MyTask().executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR, null);
    				new MyTask().executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR, null);
    
    				new MyTask().executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR, null);
    				new MyTask().executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR, null);
    				new MyTask().executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR, null);
    				new MyTask().executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR, null);
    				new MyTask().executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR, null);
    
    				new MyTask().executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR, null);
    				new MyTask().executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR, null);
    				new MyTask().executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR, null);
    				new MyTask().executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR, null);
    				new MyTask().executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR, null);
    
    			}
    		});
    new MyTask().executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR, null);改为了并行,这时候再运行,发现1秒打印5行日志(核心线程数为5)


    喜欢我的朋友可以关注我哦~

    也可以扫描下方的二维码,或搜索公众号  Android程序员开发指南  去微信每日阅读一篇安卓开发文章。



    长按上方二维码,关注本公众号一起交流Android开发技术。



  • 相关阅读:
    php实现qq授权登录
    lnmp环境下上传文件过大出现 <服务器IO错误> 问题解决方案
    matpb画图_折线图.ipynb
    垂直条形图——plot.bar
    将博客搬至CSDN
    pandas的函数应用二——排序
    pandas的函数应用一
    pandas的数据对齐
    将一个二维数组的行和列分别进行逆向
    numpy——深拷贝和浅拷贝和不拷贝
  • 原文地址:https://www.cnblogs.com/wanghang/p/6299500.html
Copyright © 2011-2022 走看看