多線程和同步之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);




發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章