zoukankan      html  css  js  c++  java
  • AsyncTask測试多任务

    本人进行过模拟測试,发现AsyncTask并不适合多任务,以及长期的异步任务,由于每次仅仅能执行一个AsyncTask,假设执行多个其他任务将会等待

    以下通过一个代码样例和日志打印得到证实。

    以下扩展了2个AsyncTask,分别调用了2次,一共调用了四次。


    public class MainActivity extends Activity {
    
    
    	@Override
    	protected void onCreate(Bundle savedInstanceState) {
    		super.onCreate(savedInstanceState);
    		setContentView(R.layout.activity_main);
    		// 4个异步一起运行,2个不同的实现对象
    		new MyTask().execute("http://www.baidu.com/img/bdlogo.png");
    		new MyTask2().execute("http://www.baidu.com/img/bdlogo.png");
    		new MyTask2().execute("http://www.baidu.com/img/bdlogo.png");
    		new MyTask().execute("http://www.baidu.com/img/bdlogo.png");
    	}
    
    	public class MyTask2 extends AsyncTask<String, Integer, Bitmap> {
    
    		public MyTask2() {
    			super();
    
    		}
    
    		@Override
    		protected void onPostExecute(Bitmap result) {
    			Log.d("MainActivity", "onPostExecute");
    			updateImageView(result);
    		}
    
    		@Override
    		protected void onPreExecute() {
    			Log.d("MainActivity", "onPreExecute");
    		}
    
    		@Override
    		protected Bitmap doInBackground(String... args) {
    			Log.e("MainActivity", "MyTask2:" + THREAD_POOL_EXECUTOR); // static对象都一样,运行的线程池
    																		
    			Log.e("MainActivity", "MyTask2:" + SERIAL_EXECUTOR); // static对象都一样,运行任务的
    																	
    			String website = args[0];
    			HttpURLConnection conn = null;
    			InputStream ins = null;
    			try {
    				for (int i = 0; i < 10; i++) {
    					Thread.sleep((int) (Math.random() * 100 + 800));  <span style="font-family: Arial, Helvetica, sans-serif;">//有益休眠</span>
    					Log.d("MainActivity", "MyTask2:" + i + " " + Thread.currentThread().getName() + " id:"
    							+ Thread.currentThread().getId());
    				}
    				URL url = new URL(website);
    				conn = (HttpURLConnection) url.openConnection();
    				conn.setConnectTimeout(5000);
    				conn.setDoInput(true);
    				if (conn.getResponseCode() == 200) {
    					Log.d("MainActivity", "MyTask2:" + "get image is ok");
    					ins = conn.getInputStream();
    					return BitmapFactory.decodeStream(ins);
    				}
    			} catch (MalformedURLException e) {
    				e.printStackTrace();
    			} catch (IOException e) {
    				e.printStackTrace();
    			} catch (InterruptedException e) {
    				// TODO Auto-generated catch block
    				e.printStackTrace();
    			} finally {
    				if (ins != null) {
    					try {
    						ins.close();
    					} catch (IOException e) {
    						e.printStackTrace();
    					}
    				}
    			}
    			return null;
    		}
    
    	}
    
    	public class MyTask extends AsyncTask<String, Integer, Bitmap> {
    
    		public MyTask() {
    			super();
    
    		}
    
    		@Override
    		protected void onPostExecute(Bitmap result) {
    			Log.d("MainActivity", "onPostExecute");
    			updateImageView(result);
    		}
    
    		@Override
    		protected void onPreExecute() {
    			Log.d("MainActivity", "onPreExecute");
    		}
    
    		@Override
    		protected Bitmap doInBackground(String... args) {
    			Log.e("MainActivity", "MyTask:" + THREAD_POOL_EXECUTOR);
    			Log.e("MainActivity", "MyTask:" + SERIAL_EXECUTOR);
    
    			for (int i = 0; i < 10; i++) {
    				try {
    					Thread.sleep((int) (Math.random() * 100 + 600));//有益休眠
    				} catch (InterruptedException e) {
    
    					e.printStackTrace();
    				}
    				Log.d("MainActivity", "MyTask:" + i + " " + Thread.currentThread().getName() + " id:"
    						+ Thread.currentThread().getId());
    			}
    			String website = args[0];
    			HttpURLConnection conn = null;
    			InputStream ins = null;
    			try {
    				URL url = new URL(website);
    				conn = (HttpURLConnection) url.openConnection();
    				conn.setConnectTimeout(5000);
    				conn.setDoInput(true);
    				if (conn.getResponseCode() == 200) {
    					Log.d("MainActivity", "get image is ok");
    					ins = conn.getInputStream();
    					return BitmapFactory.decodeStream(ins);
    				}
    			} catch (MalformedURLException e) {
    				e.printStackTrace();
    			} catch (IOException e) {
    				e.printStackTrace();
    			} finally {
    				if (ins != null) {
    					try {
    						ins.close();
    					} catch (IOException e) {
    						e.printStackTrace();
    					}
    				}
    			}
    			return null;
    		}
    
    	}
    
    	boolean f = false;
    
    	public void updateImageView(Bitmap result) {
    		if (result != null) {
    			ImageView img = (ImageView) findViewById(R.id.img);
    			img.setImageBitmap(result);
    
    		}
    
    	}
    
    }


    4个异步执行发现,第一个必须执行完才干执行下一个? 仅仅是我理解不正确,还是使用方法有问题,假设有朋友知道请指正。


    打印日志例如以下:


    12-17 05:24:57.665: D/MainActivity(25755): onPreExecute
    12-17 05:24:57.665: D/dalvikvm(25755): create interp thread : stack size=32KB
    12-17 05:24:57.665: D/dalvikvm(25755): create new thread
    12-17 05:24:57.666: D/dalvikvm(25755): new thread created
    12-17 05:24:57.666: D/dalvikvm(25755): update thread list
    12-17 05:24:57.666: D/dalvikvm(25755): threadid=16: interp stack at 0x5e677000
    12-17 05:24:57.666: D/dalvikvm(25755): threadid=16: created from interp
    12-17 05:24:57.666: D/dalvikvm(25755): start new thread
    12-17 05:24:57.666: D/dalvikvm(25755): threadid=16: notify debugger
    12-17 05:24:57.666: D/dalvikvm(25755): threadid=16 (AsyncTask #5): calling run()
    12-17 05:24:57.666: D/MainActivity(25755): onPreExecute
    <span style="color:#ff0000;">12-17 05:24:57.666: E/MainActivity(25755): MyTask:java.util.concurrent.ThreadPoolExecutor@42258eb8[Running, pool size = 5, active threads = 1, queued tasks = 0, completed tasks = 4]
    12-17 05:24:57.666: E/MainActivity(25755): MyTask:android.os.AsyncTask$SerialExecutor@42258fc8</span>
    12-17 05:24:57.669: D/MainActivity(25755): onPreExecute
    12-17 05:24:57.669: D/MainActivity(25755): onPreExecute
    12-17 05:24:57.731: V/InputMethodManager(25755): onWindowFocus: null softInputMode=288 first=true flags=#1810100
    12-17 05:24:57.731: V/InputMethodManager(25755): START INPUT: com.android.internal.policy.impl.PhoneWindow$DecorView{422f7c58 V.E..... R.....ID 0,0-1080,1920} ic=null tba=android.view.inputmethod.EditorInfo@422fe938 controlFlags=#104
    12-17 05:24:57.733: V/InputMethodManager(25755): Starting input: Bind result=InputBindResult{com.android.internal.view.IInputMethodSession$Stub$Proxy@42301bb0 com.android.inputmethod.latin/.LatinIME #609}
    12-17 05:24:58.281: D/MainActivity(25755): MyTask:0 AsyncTask #5 id:4784
    12-17 05:24:58.966: D/MainActivity(25755): MyTask:1 AsyncTask #5 id:4784
    12-17 05:24:59.643: D/MainActivity(25755): MyTask:2 AsyncTask #5 id:4784
    12-17 05:25:00.276: D/MainActivity(25755): MyTask:3 AsyncTask #5 id:4784
    12-17 05:25:00.946: D/MainActivity(25755): MyTask:4 AsyncTask #5 id:4784
    12-17 05:25:01.589: D/MainActivity(25755): MyTask:5 AsyncTask #5 id:4784
    12-17 05:25:02.224: D/MainActivity(25755): MyTask:6 AsyncTask #5 id:4784
    12-17 05:25:02.842: D/MainActivity(25755): MyTask:7 AsyncTask #5 id:4784
    12-17 05:25:03.464: D/MainActivity(25755): MyTask:8 AsyncTask #5 id:4784
    12-17 05:25:04.120: D/MainActivity(25755): MyTask:9 AsyncTask #5 id:4784
    12-17 05:25:04.123: I/System.out(25755): [CDS]rx timeout:0
    12-17 05:25:04.125: I/System.out(25755): [CDS]close[48692]
    12-17 05:25:04.126: I/System.out(25755): close [socket][/0.0.0.0:48692]
    12-17 05:25:04.430: D/libc-netbsd(25755): getaddrinfo: www.baidu.com get result from proxy >>
    12-17 05:25:04.430: I/System.out(25755): propertyValue:true
    12-17 05:25:04.431: I/System.out(25755): [socket][1] connection www.baidu.com/180.97.33.107:80;LocalPort=38503(5000)
    12-17 05:25:04.431: I/System.out(25755): [CDS]connect[www.baidu.com/180.97.33.107:80] tm:5
    12-17 05:25:04.432: D/Posix(25755): [Posix_connect Debug]Process com.example.asynctaskdemo :80 
    12-17 05:25:04.547: I/System.out(25755): [socket][/192.168.2.122:38503] connected
    12-17 05:25:04.547: I/System.out(25755): [CDS]rx timeout:0
    12-17 05:25:04.613: D/MainActivity(25755): get image is ok
    12-17 05:25:04.643: D/dalvikvm(25755): GC_FOR_ALLOC freed 677K (925), 32% free 3736K/5484K, paused 23ms, total 28ms
    12-17 05:25:04.646: D/skia(25755): Flag is not 10
    12-17 05:25:04.647: D/MainActivity(25755): onPostExecute
    <span style="color:#ff0000;">12-17 05:25:04.648: E/MainActivity(25755): MyTask2:java.util.concurrent.ThreadPoolExecutor@42258eb8[Running, pool size = 5, active threads = 1, queued tasks = 0, completed tasks = 5]
    12-17 05:25:04.648: E/MainActivity(25755): MyTask2:android.os.AsyncTask$SerialExecutor@42258fc8</span>
    12-17 05:25:04.668: I/SurfaceTextureClient(25755): [STC::queueBuffer] (this:0x5eee0028) fps:0.14, dur:6910.24, max:6910.24, min:6910.24
    12-17 05:25:04.668: I/SurfaceTextureClient(25755): [STC::queueBuffer] this:0x5eee0028, api:1, last queue time elapsed:6910.24
    12-17 05:25:05.485: D/MainActivity(25755): MyTask2:0 AsyncTask #5 id:4784
    12-17 05:25:06.323: D/MainActivity(25755): MyTask2:1 AsyncTask #5 id:4784
    12-17 05:25:07.217: D/MainActivity(25755): MyTask2:2 AsyncTask #5 id:4784
    12-17 05:25:08.107: D/MainActivity(25755): MyTask2:3 AsyncTask #5 id:4784
    12-17 05:25:09.002: D/MainActivity(25755): MyTask2:4 AsyncTask #5 id:4784
    12-17 05:25:09.881: D/MainActivity(25755): MyTask2:5 AsyncTask #5 id:4784
    12-17 05:25:10.771: D/MainActivity(25755): MyTask2:6 AsyncTask #5 id:4784
    12-17 05:25:11.579: D/MainActivity(25755): MyTask2:7 AsyncTask #5 id:4784
    12-17 05:25:12.445: D/MainActivity(25755): MyTask2:8 AsyncTask #5 id:4784
    12-17 05:25:13.299: D/MainActivity(25755): MyTask2:9 AsyncTask #5 id:4784
    12-17 05:25:13.300: I/System.out(25755): [CDS]rx timeout:0
    12-17 05:25:13.586: D/MainActivity(25755): MyTask2:get image is ok
    12-17 05:25:13.610: D/dalvikvm(25755): GC_FOR_ALLOC freed 688K (1136), 33% free 3689K/5484K, paused 21ms, total 21ms
    12-17 05:25:13.613: D/skia(25755): Flag is not 10
    12-17 05:25:13.613: D/MainActivity(25755): onPostExecute
    <span style="color:#ff6666;">12-17 05:25:13.615: E/MainActivity(25755): MyTask2:java.util.concurrent.ThreadPoolExecutor@42258eb8[Running, pool size = 5, active threads = 1, queued tasks = 0, completed tasks = 6]
    12-17 05:25:13.615: E/MainActivity(25755): MyTask2:android.os.AsyncTask$SerialExecutor@42258fc8</span>
    12-17 05:25:13.630: I/SurfaceTextureClient(25755): [STC::queueBuffer] (this:0x5eee0028) fps:0.11, dur:8961.83, max:8961.83, min:8961.83
    12-17 05:25:13.630: I/SurfaceTextureClient(25755): [STC::queueBuffer] this:0x5eee0028, api:1, last queue time elapsed:8961.83
    12-17 05:25:14.455: D/MainActivity(25755): MyTask2:0 AsyncTask #5 id:4784
    12-17 05:25:15.304: D/MainActivity(25755): MyTask2:1 AsyncTask #5 id:4784
    12-17 05:25:16.104: D/MainActivity(25755): MyTask2:2 AsyncTask #5 id:4784
    12-17 05:25:17.008: D/MainActivity(25755): MyTask2:3 AsyncTask #5 id:4784
    12-17 05:25:17.887: D/MainActivity(25755): MyTask2:4 AsyncTask #5 id:4784
    12-17 05:25:18.737: D/MainActivity(25755): MyTask2:5 AsyncTask #5 id:4784
    12-17 05:25:19.584: D/MainActivity(25755): MyTask2:6 AsyncTask #5 id:4784
    12-17 05:25:20.399: D/MainActivity(25755): MyTask2:7 AsyncTask #5 id:4784
    12-17 05:25:21.281: D/MainActivity(25755): MyTask2:8 AsyncTask #5 id:4784
    12-17 05:25:22.130: D/MainActivity(25755): MyTask2:9 AsyncTask #5 id:4784
    12-17 05:25:22.132: I/System.out(25755): [CDS]rx timeout:0
    12-17 05:25:22.178: D/MainActivity(25755): MyTask2:get image is ok
    12-17 05:25:22.202: D/dalvikvm(25755): GC_FOR_ALLOC freed 641K (300), 33% free 3689K/5484K, paused 21ms, total 22ms
    12-17 05:25:22.208: D/skia(25755): Flag is not 10
    12-17 05:25:22.209: D/MainActivity(25755): onPostExecute
    <span style="color:#ff0000;">12-17 05:25:22.211: E/MainActivity(25755): MyTask:java.util.concurrent.ThreadPoolExecutor@42258eb8[Running, pool size = 5, active threads = 1, queued tasks = 0, completed tasks = 7]
    12-17 05:25:22.211: E/MainActivity(25755): MyTask:android.os.AsyncTask$SerialExecutor@42258fc8</span>
    12-17 05:25:22.219: I/SurfaceTextureClient(25755): [STC::queueBuffer] (this:0x5eee0028) fps:0.12, dur:8589.36, max:8589.36, min:8589.36
    12-17 05:25:22.219: I/SurfaceTextureClient(25755): [STC::queueBuffer] this:0x5eee0028, api:1, last queue time elapsed:8589.36
    12-17 05:25:22.839: D/MainActivity(25755): MyTask:0 AsyncTask #5 id:4784
    12-17 05:25:23.519: D/MainActivity(25755): MyTask:1 AsyncTask #5 id:4784
    12-17 05:25:24.176: D/MainActivity(25755): MyTask:2 AsyncTask #5 id:4784
    12-17 05:25:24.786: D/MainActivity(25755): MyTask:3 AsyncTask #5 id:4784
    12-17 05:25:25.440: D/MainActivity(25755): MyTask:4 AsyncTask #5 id:4784
    12-17 05:25:26.134: D/MainActivity(25755): MyTask:5 AsyncTask #5 id:4784
    12-17 05:25:26.740: D/MainActivity(25755): MyTask:6 AsyncTask #5 id:4784
    12-17 05:25:27.367: D/MainActivity(25755): MyTask:7 AsyncTask #5 id:4784
    12-17 05:25:27.988: D/MainActivity(25755): MyTask:8 AsyncTask #5 id:4784
    12-17 05:25:28.617: D/MainActivity(25755): MyTask:9 AsyncTask #5 id:4784
    12-17 05:25:28.618: I/System.out(25755): [CDS]rx timeout:0
    12-17 05:25:28.658: D/MainActivity(25755): get image is ok
    12-17 05:25:28.681: D/dalvikvm(25755): GC_FOR_ALLOC freed 641K (299), 33% free 3689K/5484K, paused 20ms, total 21ms
    12-17 05:25:28.683: D/skia(25755): Flag is not 10
    12-17 05:25:28.684: D/MainActivity(25755): onPostExecute
    12-17 05:25:28.694: I/SurfaceTextureClient(25755): [STC::queueBuffer] (this:0x5eee0028) fps:0.15, dur:6474.71, max:6474.71, min:6474.71
    12-17 05:25:28.694: I/SurfaceTextureClient(25755): [STC::queueBuffer] this:0x5eee0028, api:1, last queue time elapsed:6474.71


    发现ThreadPool每次仅仅有1个线程在执行,一个时刻仅仅能执行一次。上面执行的情况是线程被反复利用了,

    手机上执行线程NAME和ID都是一样,在模拟器上执行ID和NAME即便是不一样 也是顺序执行的,并没有同一时候执行多个任务的情况发现。

    个人经过測试发现,AsyncTask 仅仅能用一次,假设实例化多个AsyncTask 并不能提高执行效率,不能利用多任务的情况。不知道是不是这样,google设计这个AsyncTask的目的仅仅是用来执行一次异步任务,和UI更新? 如有朋友知道详细理由请指出,,谢谢。


  • 相关阅读:
    Day08_固化命令、grep、sed及awk命令
    Day07_网络管理、SSH、shell及元字符
    Day06_nginx及反向代理、共享存储nfs
    安装Apache所踩的的坑
    使用JS制作小游戏贪吃蛇
    清除浮动的几种方式
    纯CSS3图片反转
    在JAVASCRIPT中,为什么document.getElementById不可以再全局(函数外)使用?
    关于钉钉开发,心得
    javascript计算两个时间差
  • 原文地址:https://www.cnblogs.com/zfyouxi/p/4361021.html
Copyright © 2011-2022 走看看