PROGRAMMING WORKSHOP

Android|
SrcollView | ImageView | Thread

Java언어 페이지를 언어 그자체를 이야기 하려니 별로 흥미가 덜한다
Android를 계속하면서 Java언어를 자연스럽게 챙겨나가는 것이 좋을 것같다
그래서 Android 하던 것
ListView만들기를 좀더 확장 해가면서 계속 진행하도록 하자
이번에는 Java언어의 중요한 기능중의 하나인 Thread개체를 활용하도록 해본다
본래 안드로이드의 Activity는 하나의 Thread로 진행한다
즉 프로세스를 진행하는 창구가 하나 인 것이다
예를 들어서 버튼을 크릭하면 저어기 멀리 웹싸이트에서 갖여 오는 것인데..
이것을 갖여 오는데는 시간이 많이 걸릴수 있다
어떤 조치를 해 주지 않으면 화면이 Freezing이 된다
다른 작업하지 않고 , 멀거니 웹에서 정보가 넘어오기를 넋놓고 기다리다가
지쳐서 화면이 얼어 버리던가 다운 되어 버리는 것이다
반드시 알지 못하면 안드로이드는 더 이상진행못하는 기능이다
Thread는 창구를 더 만들어 주는 역활을 한다
본래 하던 창구는 자기 하던 대로 일을 보도록 하면서
다른 창구를 하나 임시 만들어서 시간걸리는 작업을
별도의 라인에서 진행하게 하는 것이다
소위 말하는 멀티타스킹(Multi-tasking)을 하는 셈이다
아래의 그림과 같이 FaceBook에 이런 저런 것을 올리면서
그림화일을 올린다



이것을 그림만 정리하여 안드로이드 폰에서 볼수 있게 하고 싶다
그런데 이 그림이 저장된 곳은 FaceBook이다
이 써버에서 갖여 오려니까..시간이 조금은 걸린다
이 시간이 걸리는 것을 버벅대지 않고 갖고 오려니까..
Thread개체라는 것을 사용하게 된다
아무튼 아래의 그림과 같이 갖여 오게 한다



그림을 갖여 오려면 그림화일의 URL이 있어야 한다
어느 웹서버에 어떤 경로로 저장되어있는지 이것을 실은 DB로
꾸며서 하여야 할 것이나, 번거롭고
코드상에 아래와 같이 하드 코딩을 하고 해보자

String pic[]={"https://fbcdn-sphotos-b-a.akamaihd.net/hphotos-ak-ash3/1010947_451792478250734_80782951_n.jpg", "https://fbcdn-sphotos-f-a.akamaihd.net/hphotos-ak-prn1/1016637_451927204903928_430808946_n.jpg", "https://fbcdn-sphotos-f-a.akamaihd.net/hphotos-ak-frc1/1005282_452499541513361_610038892_n.jpg", "https://fbcdn-sphotos-h-a.akamaihd.net/hphotos-ak-ash4/1044966_453835208046461_1944694212_n.jpg", "https://fbcdn-sphotos-g-a.akamaihd.net/hphotos-ak-ash3/1012783_452804644816184_259116531_n.jpg", "https://fbcdn-sphotos-d-a.akamaihd.net/hphotos-ak-ash4/421911_453924168037565_1858252645_n.jpg", "https://www.facebook.com/uno.sdher#!/uno.sdher/photos"};

쟈바의 배열의 선언의 여러방법중 하나의 방법은

String pic[]={"","",""}

라고 하면 된다
이것은 VB.Net의 배열만드는 것과 흡사하니,
이렇게 익히면 VB.Net도 같이 감각이 생긴다
그림화일의 경로는 웹에서 해당 사진을 오른쪽마우스로 크릭하여 나타나는 메뉴의
속성창을 열어서 주소(URL) 문자열 값을 복사하여 붙여 넣으면 된다
갖여 오는 동안 메시지박스를 띄워서 진행중임을 보여주도록 한다



두개의 Activity 개체로 만든다
하나는 목록이 나타나게 할 ListActivity
다른 하나는 목록에서 선택받으면 응답할 Activity, 달랑 2개만 준비한다
그리고 XML화일로 Layout, 인터페이스는 없이 간단하게 java 코딩으로만 한다
ListActivity Class는 아래와 같이 작성

package com.example.android1_11;

import android.os.Bundle;
import android.app.ListActivity;
import android.content.Intent;
import android.view.View;
import android.widget.ArrayAdapter;
import android.widget.ListView;

public class MainActivity_11 extends ListActivity {
	String list[]={
			"Delinquent Boy",
			"Unruly Child",
			"Dependent Kid",
			"Neglected Kid",
			"Sexually Bbused Girl",
			"Wisdom and Knowledge",
			"Motivation",
			"Health",
			"Black and White",
			"Happiness",
			"Nobody Likes Anybody",
			"She Is In Labor",
			"Paradigm",
			"Just Do It"
			};
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        this.setListAdapter(new ArrayAdapter(this,android.R.layout.simple_spinner_dropdown_item, list));
    }
	@Override
	protected void onListItemClick(ListView l, View v, int position, long id) {
		super.onListItemClick(l, v, position, id);
		
		Intent intent = new Intent(MainActivity_11.this,ResponseActivity_11.class);  
        Bundle b = new Bundle(); 
        b.putInt("name", position);
        intent.putExtras(b);
        startActivity(intent);  
	}
}

그리고 위의 Activity에서 목록의 아이템을 선택하면 바뀌는 Activity

 
package com.example.android1_11;

import java.io.IOException;
import java.io.InputStream;
import java.net.URL;
import android.R.style;
import android.app.Activity;
import android.app.ProgressDialog;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.os.Bundle;
import android.os.Handler;
import android.widget.ImageView;

public class ResponseActivity_11 extends Activity{


	String pic[]={
			"https://fbcdn-sphotos-e-a.akamaihd.net/hphotos-ak-ash3/946867_454864257943556_551949583_n.jpg",
			"https://www.facebook.com/photo.php?fbid=454864551276860&set=pcb.454866137943368&type=1&theater",
			"https://fbcdn-sphotos-d-a.akamaihd.net/hphotos-ak-ash3/1013193_454864977943484_1771052908_n.jpg",
			"https://fbcdn-sphotos-g-a.akamaihd.net/hphotos-ak-frc3/1045243_454865287943453_1701677892_n.jpg",
			"https://fbcdn-sphotos-a-a.akamaihd.net/hphotos-ak-prn1/1016545_454865777943404_1614126099_n.jpg",
			"https://fbcdn-sphotos-c-a.akamaihd.net/hphotos-ak-frc3/p480x480/993056_454590671304248_237068631_n.jpg",
			"https://fbcdn-sphotos-h-a.akamaihd.net/hphotos-ak-ash4/q71/s320x320/1044966_453835208046461_1944694212_n.jpg",
			"https://fbcdn-sphotos-b-a.akamaihd.net/hphotos-ak-ash4/q71/s320x320/998185_453835278046454_1289578018_n.jpg",
			"https://fbcdn-sphotos-g-a.akamaihd.net/hphotos-ak-ash3/p480x480/1012783_452804644816184_259116531_n.jpg",
			"https://fbcdn-sphotos-f-a.akamaihd.net/hphotos-ak-frc1/p480x480/1005282_452499541513361_610038892_n.jpg",
			"https://fbcdn-sphotos-b-a.akamaihd.net/hphotos-ak-ash3/q71/s320x320/1010947_451792478250734_80782951_n.jpg",
			"https://fbcdn-sphotos-d-a.akamaihd.net/hphotos-ak-prn1/q71/s320x320/1017597_450737931689522_2035794797_n.jpg",
			"https://fbcdn-sphotos-b-a.akamaihd.net/hphotos-ak-prn1/p480x480/1013974_448423985254250_1928493910_n.jpg",
			"https://fbcdn-sphotos-b-a.akamaihd.net/hphotos-ak-prn1/p480x480/936817_427444230685559_468136492_n.jpg"
			};
	
	Handler handler= new Handler();
	Handler handler_ = new Handler();
	
	String currentimage;
	Bitmap downloadedBitmap;
	ImageView imageview;
	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		
		
		Bundle extras = getIntent().getExtras();
          int position=extras.getInt("name");
          currentimage=pic[position];
		  
		  imageview = new ImageView(this);

		  final ProgressDialog pd = new ProgressDialog(this);
		  pd.setMessage("UNO21.COM - Load Image");
		  pd.setProgressStyle(style.Animation);
		  
		   Thread thread = new Thread(new Runnable(){

			public void run() {
				handler.post(new Runnable(){
					public void run() {
						pd.show();
						
					}
					
				});
				
				try {
					
					downloadedBitmap = DownloadBMP(currentimage);
				} catch (IOException e1) {
					e1.printStackTrace();
				}
				
				handler.post(new Runnable(){  
		            public void run(){  
						imageview.setImageBitmap(downloadedBitmap);
						pd.dismiss();
		            }  
		        });  
				
			}
			
	});
	thread.start();
	this.setTitle("UNO21.COM -FaceBook Stuff");
	this.setContentView(imageview);
	pd.dismiss();
		
}
	   private Bitmap DownloadBMP(String url) throws IOException {  
	           URL location = new URL(url);    
	           InputStream is = location.openStream();    
	           Bitmap returnedBMP = BitmapFactory.decodeStream(is);  
	           is.close();  
	           return returnedBMP;  
	       }  
	
}


자원정보를 모두 배열로 하드코딩하였지만 실제로 여러분들이
활용하려고 한다면, 써버등에 그림화일 목록이나 기타 정보를 보관하고
이것을 불러 들여서 작업을 하게 될 것이다
여기에서는 목록에서 선택하면 해당 선택된 제목에 해당하는 그림화일명을
그림을 나타낼 Activity의 배열에서 찾아내어
이것을 인터넷의 웹써버상(Facebook 서버)에서 갖여 오는 것이고
이때 사용되는 URL개체, 그리고 URL개체를 통하여 문자열정보로
줄줄이 불러온 정보가 InputStream 개체로 들어가고 이것을
그림을 만드는 BitmapFactory개체의 decodeStream 메소드에 전달하여
Bitmap개체(그림개체)를 만들고 이것을
ImageView개체의 setImageBitmap메소드에 전달하여 그림이 구현되게 하고
이것을 해당 Activity의 setContentView의 매개변수로 전달하여
최종 화면에 나타나게 하는 것
이때 URL개체를 통하여 그림을 갖여 오는 과정이 시간이 걸리는 작업이
될수 있으므로 이때 Thread개체와 Runable개체들을 사용하고
기다리는 동안 작업중이라는 표시를 ProgressDialog개체를 사용하여
나타나게 하다가, 그림이 완료되는 순간 ProgressDialog개체를
없애 버린다

중요한 것은 Thread개체에 대하여 좀 정리하여 다시 보도록 하여야 할 것 같다
위의 내용으로 설명하기에는 Runnable개체, Handler개체등이 요소,요소에
박혀있어서 설명도 그렇고, 이해하기도 그렇다
다음 페이지에서 이것을 다른 예를 들어서 기초부터 해보도록 하자
앞의 Java만을 위한 페이지를 대신하여
결국은 Android를 하면서 Java를 익히는 것이니 Java의 연속성으로
보시면 될 것이다

아래의 첨부화일에서 Bin디렉토리의 apk화일을 그냥 안드로이드에
실행하셔도 되고, 소스코드를 디버깅하면서 실행하셔도 좋고
AndroidManifest.xml화일에 두개의 Activity개체를 어떻게 정리해 놓았는지
쏘스 화일에서 보시고..

***[LOG-IN]***