AsyncTask는 이전 글인 [안드로이드]AsyncTask에 대하여...(전체소스포함) 에서 설명을 했으며 Thread에 대해서는 저의 다음블로그에서 자바 스레드(Threads)에 대해(http://blog.daum.net/dayhyub/56)에서 이야기를 했는데 기본적인 안드로이드 Thread의 이야기만 조금만 더 해보고 프로그래스바 구현 두개의 소스로 비교를 해보도록 하겠습니다.

Thread의 정의

● 프로세스보다 작은 단위이기 때문에 프로세스보다 가볍다.

● Thread는 서로의 자원을 공유하면서 동작한다.

● 한꺼번에 여러개의 작업을 동시에 실행할 때 사용된다.

Thread생성방법

● Thread클래스를 상속하는 방법

● Runnable인터페이스를 구현하는 방법

(1) Progressbar구현을 위해 함수 call방법비교

● Thread

startProgressBarThread2(); 

● AsyncTask

new ImageCallTask().execute(limgurl);
(2) Progressbar구현 사전 준비

● Thread

	// 막대형 진행상자//////////////////////////
	public ProgressDialog progressDialog;
	private volatile Thread theProgressBarThread2;
	
	public synchronized void startProgressBarThread2() {
		if (theProgressBarThread2 == null) {
			theProgressBarThread2 = new Thread(null, backgroundTread2,
					"startProgressBarThread2");
			theProgressBarThread2.start();

			progressDialog = new ProgressDialog(act);
			progressDialog.setCanceledOnTouchOutside (false);
			progressDialog.setCancelable(false);
			progressDialog.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL);
			progressDialog.setMessage("최신데이타로 업데이트중입니다.잠시만 기다리십시요 ...");
			progressDialog.incrementProgressBy(1);
			progressDialog.setMax(100);
			progressDialog.setProgress(0);
			progressDialog.show();
		}
	}

● AsyncTask

		private ProgressDialog dialog;
		
		// 이곳에 포함된 code는 AsyncTask가 execute 되자 마자 UI 스레드에서 실행됨.
		// 작업 시작을 UI에 표현하거나
		// background 작업을 위한 ProgressBar를 보여 주는 등의 코드를 작성.
		@Override
		protected void onPreExecute() {
	           // 작업을 시작하기 전 할일
	        dialog = new ProgressDialog(DetailActivity.con);
	        dialog.setTitle("이미지 다운로드중");
	        dialog.setMessage("잠시만 기다리세요...");
	        dialog.setIndeterminate(true);
	        dialog.setCancelable(true);
	        dialog.show();
	        			
			super.onPreExecute();
		}	
(3) Progressbar구현 작업

● Thread

	private Runnable backgroundTread2 = new Runnable() {
		@Override
		public void run() {
			if (Thread.currentThread() == theProgressBarThread2) {
				int prate= (int)(100/AString.length);
			    for(int i =0; i < AString.length;i++){
					DataInfo[] datainfo3 = new DataInfo[PublicCall.datacnt];
					String url="http://openapi.seoul.go.kr:8088/6461656879756232303536/xml/ListLostArticleService/1/"+DATACALL+"/"+AString[i];
					datainfo3 = PublicCall.publiccall(url,DATACALL);
					InsertCall.insertcall(datainfo3);
					//Log.d(TAG,"InsertCall :["+i+"]prate=["+prate+"]");
					if(i == (AString.length-1)) progressrate = 100;
					else progressrate = (int)(prate*(i+1));
					progressBarHandle2.sendMessage(progressBarHandle2
							.obtainMessage());					
				}	
			}
		}

● AsyncTask

				@Override
		protected Bitmap doInBackground(String... urls) {
			/* http://snowbora.com/417 참고 
			 * http://android-developers.blogspot.kr/2010/07/multithreading-for-performance.html
			 * */
			final HttpClient client			= AndroidHttpClient.newInstance("Android");
	        final HttpGet getRequest 		= new HttpGet(urls[0]);
	        final int IMAGE_MAX_SIZE 		= 1280;
	        
	        try 
	        {
	            HttpResponse response = client.execute(getRequest);
	            final int statusCode = response.getStatusLine().getStatusCode();
	            
	            if (statusCode != HttpStatus.SC_OK) 
	            {
	                return null;
	            }

	            final HttpEntity entity = response.getEntity();
	            
	            if (entity != null) 
	            {
	                InputStream inputStream = null;
	                
	                try 
	                {
	                	inputStream = entity.getContent();
	                	
	                	BitmapFactory.Options bfo 	= new BitmapFactory.Options();
	                	bfo.inJustDecodeBounds 		= true;

	                    BitmapFactory.decodeStream(new FlushedInputStream(inputStream), null, bfo);
	                    
	                    if(bfo.outHeight * bfo.outWidth >= IMAGE_MAX_SIZE * IMAGE_MAX_SIZE)
	                    {
	                    	bfo.inSampleSize = (int)Math.pow(2, (int)Math.round(Math.log(IMAGE_MAX_SIZE / (double) Math.max(bfo.outHeight, bfo.outWidth)) / Math.log(0.5)));
	                    }
	                    bfo.inJustDecodeBounds = false;
	                    
	                    response = client.execute(getRequest);
	                    final int nRetryStatusCode = response.getStatusLine().getStatusCode();
	                    
	                    if (nRetryStatusCode != HttpStatus.SC_OK) 
	                    {
	                        return null;
	                    }
	                    
	                    final HttpEntity reEntity = response.getEntity();
	                    
	                    if (reEntity != null)
	                    {
	                    	InputStream reInputStream = null;
	                    	
	                    	try
	                    	{
	                    		reInputStream = reEntity.getContent();
	                    		final Bitmap imgBitmap = BitmapFactory.decodeStream(new FlushedInputStream(reInputStream), null, bfo);
	                            
	                            return imgBitmap;
	                    	}
	                    	finally 
	                        {
	                    		 if (reInputStream != null) 
	                             {
	                    			 reInputStream.close();
	                             }
	                    		 
	                    		 reEntity.consumeContent();
	                        }
	                    }
	                } 
	                finally 
	                {
	                    if (inputStream != null) 
	                    {
	                        inputStream.close();
	                    }
	                    
	                    entity.consumeContent();
	                }
	            }
	        } 
	        catch (IOException e) 
	        {
	            getRequest.abort();
	        } 
	        catch (IllegalStateException e) 
	        {
	            getRequest.abort();
	        } 
	        catch (Exception e) 
	        {
	            getRequest.abort();
	        } 
	        finally 
	        {
	            if ((client instanceof AndroidHttpClient)) 
	            {
	                ((AndroidHttpClient)client).close();
	            }
	        }
	        
	        return null;
	        
	    }	
(4) Progressbar작업진행상태 표시

● Thread

Handler progressBarHandle2 = new Handler() {
			@Override
			public void handleMessage(Message msg) {
				
				progressDialog.setProgress(progressrate);
				progressDialog.setMessage("데이타를 저장중입니다.잠시만 기다리십시요 ..."
						+ progressrate + "%");
				if (progressrate == 100) {
					stopProgressBarThread2();
					datainfo = selectData();
					appendRowFirst(datainfo);					
				}
			}
		};

● AsyncTask

// onInBackground(...)에서 publishProgress(...)를 사용하면
		protected void onProgressUpdate(Integer... progress) {
			Log.d("LOST","onProgressUpdate:["+progress[0]+"]");
			dialog.setProgress(progress[0]);
		}
		
(5) Progressbar작업 완료 작업

● Thread

public synchronized void stopProgressBarThread2() {
		if (theProgressBarThread2 != null) {
			Thread tmpThread = theProgressBarThread2;
			theProgressBarThread2 = null;
			tmpThread.interrupt();
		}
		if (progressDialog != null)
			progressDialog.dismiss();
	}

● AsyncTask

// onInBackground(...)가 완료되면 자동으로 실행되는 callback
		// 이곳에서 onInBackground가 리턴한 정보를 UI위젯에 표시 하는 등의 작업을 수행함.
		// (예제에서는 작업에 걸린 총 시간을 UI위젯 중 TextView에 표시함)
		@Override
		protected void onPostExecute(Bitmap imgBitmap) {
			if (imgBitmap != null)
			{
				imgView.setImageBitmap(imgBitmap);
				imgView.setVisibility(ImageView.VISIBLE);
				textview.setVisibility(TextView.GONE);
			}else{
				//textview = (TextView)findViewById(R.id.textView1);
				textview.setText("등록된 사진이 없습니다.");
				textview.setTextSize(20);
				textview.setGravity(Gravity.CENTER_VERTICAL | Gravity.CENTER_HORIZONTAL);
				textview.setVisibility(TextView.VISIBLE);
				imgView.setVisibility(ImageView.GONE);
			}
		
			dialog.dismiss();
		}

+ Recent posts