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(); }
'프로그래밍 > 안드로이드' 카테고리의 다른 글
[제1강]2절.안드로이드의 아키텍처와 구성요소 (0) | 2013.09.17 |
---|---|
[제1강] 1절.안드로이드의 특징과 장단점 (0) | 2013.09.16 |
[안드로이드]AsyncTask에 대하여...(전체소스포함) (0) | 2013.04.13 |
프래그먼트에서 생성된 view size아는 방법 (0) | 2013.04.11 |
[안드로이드]프로그먼트(fragment) (0) | 2013.04.11 |