2011년 4월 26일 화요일

Hello JSON(2) : 본격 JSON

출처 : http://springjjeon.blog.me/70096404278


본격적으로 JSON에 대해서 알아보겠습니다.
비트박스에 북치기와 박치기만 있으면 된다면, JSON에서는 []와 {}만 알고 계시면 되겠습니다.
네, 눈치가 있으신분이라면, (1)편에서 말씀드린 색인배열과 연관배열을 떠올리시겠네요. ^^
먼저 용법을 한번 보겠습니다.
[10, 20, 30, '가나다',40]


네, 위 JSON식은 []로 엮여 있기 때문에, 색인배열이 되겠습니다.
실제 스크립트에서 사용방법은
<script type='text/javascript'>
var array = eval([10, 20, 30, '가나다',40]);
alert(array[3]);
</script>


JSON 의 기본 사용방법에 대해서 설명을 드리지 않고 예제가 나와 당황스러우실 것 같네요.
JSON는 문자열 형식으로 나타내도록 되어있습니다. (script에서 데이터 전송을 목적으로 하다보니, 어쩌면 당연할수도 있겠네요 ^^)
[10, 20, 30, '가나다',40] 이 부분이 JSON이 되겠구요. javascript에서는 eval 함수를 통해서 JSON을 해석한 객체를 생성해 줍니다.
alert창의 array[3] 용법을 통해 4번째 인수를 메시지창으로 보여주는 소스입니다.
색인배열을 보셨으니, 연관배열을 보셔야겠습니다. ^^
<script type='text/javascript'>
var array = eval({"KOR": 10, "ENG":20, "MATH": 30});
alert(array['KOR']);
alert(array.KOR);
</script>


색인배열은 HashTable 처럼 키와 값이 쌍을 이루는 구조로 되어 있기 때문에, 키:값을 쌍으로 정의해주게 됩니다.
array 에는 KOR, END, MATH 의 배열키를 가지고 각각의 값을 저장하고 있습니다.
접근은 색인배열처럼 Index로 접근하는 것이 아니라, 키값을 가지고 접근하게 됩니다.
array['KOR'] 과 array.KOR 으로 두 번 호출하였는데요. Javascript는 자체 객체관리구조를 색인배열의 형태를 이용하고 있습니다.
그래서 [‘KOR’]로 하거나 .KOR로 하거나 동일한 접근으로 인식해서 사용할 수 있습니다. ( (1)에서 말씀드렸네요 ^^)
자. 이제 JSON을 마스터 하셨습니다. (응??)
응용으로 좀 섞어서 써볼까요?
<script type='text/javascript'>
var array = eval(
[
{
"NAME" : "김선기",
"NUM" : 23,
"SCORE" : {"KOR": 10, "ENG":20, "MATH": 30},
"HIS" : [2,4,5]
},
{
"NAME" : "박동휘",
"NUM" : 24,
"SCORE" : {"KOR": 30, "ENG":40, "MATH": 50},
"HIS" : [7,3,7]
},
{
"NAME" : "박종훈",
"NUM" : 25,
"SCORE" : {"KOR": 1, "ENG":2, "MATH": 1},
"HIS" : [9,9,9]
},
]
);

alert(array[1].NAME);
alert(array[1].SCORE.KOR);
alert(array[1]['HIS'][1]);

</script>


보기 편하게 좀 들여쓰기를 해 보았습니다.
Array 의 색인배열에는 각각 학생의 데이터를 관리하는 연관배열이 들어있고,
학생의 데이터의 연관배열에는 이름, 번호, 점수를 가지고 있는 연관배열을 가지고 있고, 과거석차(?)를 의미하는 HIS 색인배열을 가지고 있습니다.
array[1].NAME 는 2번째 학생의 이름을 가져온 것이고,
array[1].SCORE.KOR 는 2번째 학생의 점수 연관배열에서 국어점수를 가져온 것이고,
array[1]['HIS'][1] 는 2번째 학생의 과거석차 기록 색인배열에서 2번째 값을 가져온 것입니다.
쉽게 이해 되시죠?
이제 정말 JSON을 마스터 하셨습니다.
JSON은 비동기로 데이터를 주고 받을 때, 사용하면 특히 편리합니다.
웹서비스로 데이터를 요청하여 받아올 때, 그것을 클라이언트에서 뿌려줄 때. 특히 편리합니다.
데이터를 보내주는 쪽에서도 몇 개의 반복문만 사용하면 쉽게 만들 수 있구요. ^^
XML로 주고 받을 수 도 있지만, 스크립트 언어에서 사용하긴 매우 귀찮을 수 있죠. ^^
이상으로 매우 허접한 JSON강좌를 마치겠습니다.
감사합니다. 

Hello JSON(1) : javascript의 배열

출처 : http://springjjeon.blog.me/70079792274


JSON(JavaScript Object Notation)은 web에서 데이터를 주고받을 때 사용하는 표현 방법입니다.
약자에서도 알수 있듯이 javascript에 기반하고 있습니다.


그렇기 때문에 우선 자바스크립트의 배열구조를 간단히 알아보도록 하겠습니다.
우리가 흔히 프로그래밍 코드에서 배열을 선언 할때는 인덱스([])를 사용해서 표현합니다.
javascript또한 마찬가지 입니다.
var array = new Array();
array[0] = 10;
array[1] = 20;
var arr = [10,20];


이런 코드가 가능합니다. 이는 색인배열이라고 부릅니다.
색인배열은 Index로 접근하게되며, 자바스크립트 특성답게 길이는 별도로 선언하지 않아도 됩니다.
배열의 길이가 자동으로 늘어나고, 자동으로 줄어들게 되기 때문입니다.
또한 맨아래 코드와 같이 한번에 선언해 줄 수 있습니다.
색인배열과 다른 배열이 있습니다. 배열이라고 생각하지 못한 경우도 있을텐데요.
var array = {};
array[“kor”] = 10;
array[“eng”] = 20;
array.jpn = 30;
var arr = {kor:10, eng:20, jpn:30};


사용법을 보면, hashtable과 유사한 느낌이 들 수 있습니다.
이를 연관배열이라고 칭합니다.
위 예제에서 jpn과 eng는 용법이 다르지만, 실제로는 똑같이 동작합니다.
그리고 맨 아래와 같이 한줄로 선언 할 수도 있습니다.
array와 arr는 똑 같은 내용을 가지게 됩니다.
한가지 특이점은 자바스크립트의 모든 객체들은 연관배열을 기초로 구성되어 있습니다.
그렇기 때문에document.location 과 document[“location”] 은 똑같이 작동합니다.
배열하면 제일 먼저 생각나는 것이 반복자(반복문, loop)를 생각하시게 될 겁니다.
색인배열이야 별 무리 없겠지만, 연관배열은 생소하신 분도 있으시겠습니다.
for(var key in array)
{
alert(array[key]);
}


마치 foreach와 비슷하게 동작하는걸 볼 수 있습니다.
연관배열과 색인배열과의 가장 큰 차이점은 length의 지원 유무입니다.
연관배열은 별도로 길이를 선언하는 로직이 없는 만큽, 길이를 검사할 수 있는 로직도 없습니다,
그러나 색인 배열은 length를 지원하고 있습니다.
JSON에 대해서 쓰려했는데 js의 배열이야기만 했네요. ;;
다음 포스팅에 JSON에 대해서, 알아보도록 하겠습니다.

2011년 3월 24일 목요일

Android : AsyncTask

출처 : http://blog.naver.com/schweine7/40112690238

AsyncTask

  : 백그라운드 작업을 하는데 만드는 쓰레드, 핸들러 등을 대신 만들어주는 도우미 클래스


Params : 실행시에 전달할 인수 타입.
Progress : 매 작업 단계마다 진행 상태를 표기하기 위한 타입
Result : 작업 결과로 리턴될 타입


void onPreExecute ()
  -> 작업 시작되기 전 호출. UI 스레드에서 실행. 보통 초기화작업

Result doInBackground (Params ... params)
  -> 배경 작업을 수행. 분리된 스레드에서 실행.
       execute 메서드로 전달한 작업거리가 params 인수로 전달됨. (배열 타입으로)
       하나의 인수만 필요하면 params[0]만 사용
       작업 중에 publishProgress 메서드를 호출하여 작업 경과를 UI 스레드로 보고 가능

void onProgressUpdate (Progress ...values)
  -> doInBackground에서 publicProgress 메서드를 호출할 때 작업 경과 표시를 위해
     호출되며 UI 스레드에서 실행. 프로그래스 바에 진행 상태를 표시하는 역할

void onPostExecute (Result result)
  -> 백그라운드 작업이 끝난 후 UI 스레드에서 실행. 인수로 작업 결과 전달.
      취소되거나 예외 발생시 null 전달

void onCancelled ()
  -> cancel 메서드로 작업 취소했을 때 호출되며 UI 스레드에서 실행



작업 시작할 때는 AsyncTask 객체를 UI 스레드에서 생성한 후 다음 메서드 호출
!! 반드시 UI 스레드에서 호출 !!

AsyncTask <Params, Progress, Result> execute (Params... params)


boolean cancel (boolean mayInterruptIfRunning)
boolean isCancelled()
   -> 작업을 취소하라고 지시.
       작업 시작 전에는 취소 성공한 것으로 return 됨.

Result get([long timeout, TimeUnit unit])
  -> 작업 완료되기까지 대기하며 작업 결과를 돌려 받는다. 타임아웃값 지정 가능

AsyncTask.Status getStatus()
  -> 작업의 현재 상태 조사. 시작되지 않은 상태면 PENDING 리턴. 이미 실행중이면 RUNNING,
      완료되었다면 FINISHED가 리턴




 메인 스레드
작업 스레드 
 execute

onPrepareExecute()
 // 작업 스레드 작동



onProgressUpdate()
// 메인에서 한번 작동

onPostExecute()
// 메인에서 한번 작동

작업 완료

doInBackground(){
   while(){
     //To do
     publishProgress()

   }
   return result;



==================================  ex  ============================================
ProgressDialog mProgress;
new AccumulateTask().execute(100);

class AccumulateTask extends AsyncTask<Integer, Integer, Integer> {
   protected void onPreExecute(){
      mValue = 0;
      mProgress = new ProgressDialog(.this);
      mProgress.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL);
      mProgress.setTitle("updating");
      mProgress.setMessage("Wait...");
      mProgress.setCancelable(false);
      mProgress.setProgress(0);
      mProgress.setButton("Cancel", new DialogInterface.OnClickListener(){
         public void onClick(DialogInterface dialog, int whichButton){
            cancel(true);
         }
      });
      mProgress.show();
   }

   protected Integer doInBackground(Integer... arg0){
      while (isCancelled() == false){
         mValue++;
         if (mValue <= 100){
            publishProgress(mValue);
         }
         else{
            break;
         }
         try { Thread.sleep(50); } catch (InterruptedException e) { ; }
      }
      return mValue;
   }

   protected void onProgressUpdate(Integer... progress){
      mProgress.setProgress(progress[0]);
      mText.setText(Integer.toString(progress[0]));
   }
  
   protected void onPostExecute(Integer result){
      mProgress.dismiss();
   }

   protected void onCancelled(){
      mProgress.dismiss();
   }
}
=====================================================================================

2011년 3월 17일 목요일

Android : Source 상에서 Margin 값 적용하기

private MarginLayoutParams margin;
margin = new ViewGroup.MarginLayoutParams(/*this.getLayoutParams()*/new LinearLayout.LayoutParams(140, 50));
//setMargins(int left, int top, int right, int bottom)
margin.setMargins( 10, 10, 10,10 );
super.addView(view , new LinearLayout.LayoutParams(margin));

출처 : http://blog.naver.com/lowmans/100123263572