多线程和同步之AsyncTask的使用(二)

很多情况下,应用处理顺序是:

1.在UI线程收到事件

2.在非UI线程中处理相应的事件

3.UI根据处理结果进行刷新

AyncTask类可以让应用执行后台操作,并通知UI线程操作结果。为简单起见,对用户隐藏Thread、Runnable以及其他相关对象:

    // 下载多个文件
</pre><pre name="code" class="java">	AsyncTask<String, Object, Void> task = new AsyncTask<String, Object, Void>() {

		private ByteArrayBuffer downloadFile(String urlString, byte[] buffer) {
			try {
				URL url = new URL(urlString);
				URLConnection con = url.openConnection();
				InputStream inStream = con.getInputStream();
				ByteArrayBuffer baf = new ByteArrayBuffer(640 * 1024);
				int len;
				while ((len = inStream.read()) != -1) {
					baf.append(buffer, 0, len);
				}

				return baf;
			} catch (MalformedURLException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
				return null;
			} catch (IOException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
				return null;
			}
		}

		@Override
		protected Void doInBackground(String... params) {
			// TODO Auto-generated method stub
			if (params != null && params.length > 0) {
                 byte[] buffer=new byte[4*1024];
                 for(String url:params){
                	 long time=System.currentTimeMillis();
                	 ByteArrayBuffer baf=downloadFile(url, buffer);
                	 time=System.currentTimeMillis()-time;
                	 publishProgress(url,baf,time);
                 }
			}else{
				publishProgress(null,null);
			}
			return null;
		}

		@Override
		protected void onPreExecute() {
			// TODO Auto-generated method stub
			super.onPreExecute();
		}

		@Override
		protected void onPostExecute(Void result) {
			// TODO Auto-generated method stub
			super.onPostExecute(result);
		}

		@Override
		protected void onProgressUpdate(Object... values) {
			// TODO Auto-generated method stub
			super.onProgressUpdate(values);
			String url=(String) values[0];
			ByteArrayBuffer buffer=(ByteArrayBuffer) values[1];
			if(buffer!=null){
				long time=(Long) values[2];
				Log.i("TAG", "Download"+url+"("+buffer.length()+"byte)in"+time+"s");
			}else{
				
			}
			//可以直接在这儿更新UI
		}

		@Override
		protected void onCancelled(Void result) {
			// TODO Auto-generated method stub
			super.onCancelled(result);
		}

		@Override
		protected void onCancelled() {
			// TODO Auto-generated method stub
			super.onCancelled();
		}

	};

	//以下是无效地址,仅供参考
	String url1="http://yinyueshiting.baidu.com/data2/music/240330837";
	String url2="http://yinyueshiting.baidu.com/data2/music/240330888";
	
	task.execute(url1,url2);




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值