2010년 12월 30일 목요일

android post send

앞서 작성한 글에서 언급한 android에서의 기본적인 POST방식을 언급하지 않으려 했으나...
아무튼 적어보련다.

public HttpResponse sendData(String url, String encoding, Map param){
  HttpResponse response = null;
  try {
   HttpClient httpClient = new DefaultHttpClient();
   HttpPost httpPost = new HttpPost(url);
   List list = new ArrayList();
   Iterator it = param.keySet().iterator();
   while(it.hasNext()){
    String key = (String)it.next();
    list.add(new BasicNameValuePair(key,param.get(key).toString()));
   }
   httpPost.setEntity(new UrlEncodedFormEntity(list, encoding));
   response = httpClient.execute(httpPost);
  } catch (Exception e) {
   Log.e("Error", "sendData", e);
  }

  return response;
 }

앞선 2개의 글을 보신 분이라면 나름 내 스타일을 아실터...ㅋㅋ

사실 너무 간단한 소스라 별로 설명할건 없다.

추가로 response는 어찌할것인가.

public String getResponseContent(HttpResponse response){
  StringBuilder sb = new StringBuilder();
  try {
   if(response!=null){
             BufferedReader br = new BufferedReader(new InputStreamReader(response.getEntity().getContent()));
    String str;
    while((str = br.readLine()) != null){
     sb.append(str).append("\n");
    }
   }
  } catch (Exception e) {
   Log.e("Error", "getResponseContent", e);
  }

  return sb.toString();
 }

response에서 내용을 추출하는 코드다.
내가 이렇게 사용한 이유는 이넘을 다시 JSONArray로 변환하기 위해서다.

만약 일반적인 parameter를 추출하기 원한다면
HttpEntity resEntity = response.getEntity();
이걸 이용해서 send하면서 담을때 처럼 거꾸로 사용하면 될듯하다.
해보지 않아서 어찌 할지는 정확하게 모르겠다.
하지만 일반적으로 XML, JSON을 사용한다면 String만 추출하면되니 문제는 없을듯하다.

#SCMInno #에스씨엠이노 #WEBDeK

android file upload

android에서 파일을 전송하려면 코드는 간단하다.

public String sendFile(String urlServer, String fileName){
  File file = new File(fileName);
  String result = null;
  try {
       HttpClient client = new DefaultHttpClient();
       HttpPost post = new HttpPost(urlServer);
       ContentBody bin = new FileBody(file);
       MultipartEntity reqEntity = new MultipartEntity(HttpMultipartMode.BROWSER_COMPATIBLE); 
       reqEntity.addPart("file", bin);
       post.setEntity(reqEntity); 
       HttpResponse response = client.execute(post); 
       /*
       HttpEntity resEntity = response.getEntity(); 
       if (resEntity != null) {   
        Log.w("RESPONSE",EntityUtils.toString(resEntity));
       }
       */
       if (response != null){
        result = getResponseContent(response);
       }
  } catch (Exception e) {
   Log.e("Error", "sendFile", e);
  }
  return result;
 }

일반적인 POST방식의 전송과 기본을 동일하다.
POST에 담을 entity를
ContentBody bin = new FileBody(file);
       MultipartEntity reqEntity = new MultipartEntity(HttpMultipartMode.BROWSER_COMPATIBLE); 
       reqEntity.addPart("file", bin);
선언한다는게 특이한 점이다.

물론 일반적인 parameter를 추가하고 싶다면 일반적인 POST방식처럼 add하면 된다.
하지만 이 부분에서의 삽질은 사용하려는 class가 android가 지원하는 class가 아니라는점.

httpclient-4.0.3.jar
httpmime-4.0.3.jar
apache-mime4j-0.6.jar

buildpath에 추가해야 한다.
프로젝트 바로 하위에 lib폴더를 만들고 추가했다.
구글링을 해보면
httpclient-4.0.3.jar
httpmime-4.0.3.jar
이것만 필요하다고 나오지만
apache-mime4j-0.6.jar
이게 없으면 절대 않된다.

return받은 response를 활용하는 부분은 기본적인 POST전송방식과 동일하다.

#SCMInno #에스씨엠이노 #WEBDeK

android JSON

쉽게 갈수 있었다...
웹페이지에서 JSON을 사용하고 있어 android도 그냥 붙여 쓰려고 시작했던게 결국 삽질의 시작이 되었고...

구글링에서 많은 내용들이 나오지만 결국 한글이 깨지는 난관이 있었다.
미국 애들은 utf-8에 민감하지 않은지라 관련 내용이 별로 없고, 있다해도 적용해보면 결국 깨진다...ㅡㅡ;;;

일단 android에는 기본적으로 JSON을 지원한다.
이유는 간단할것이다.
Ajax에서 가장 문제인 XML의 큰 덩치를 Android가 모를리 없기 때문.

org.json.JSONArray, org.json.JSONObject 이넘들의 사용법은 생략한다.

결론은
sendJSONData("http://....", "UTF-8" ,parma);

public HttpResponse sendJSONData(String url, String encoding, Map param){
  HttpClient client = new DefaultHttpClient();
        HttpConnectionParams.setConnectionTimeout(client.getParams(), 10000);
        HttpResponse response = null;
        try{
            HttpPost post = new HttpPost(url);
            post.setHeader(HTTP.CONTENT_TYPE,"application/json");
           
            String jsonString = null;
            if(param != null){
             jsonString = jutil.getJSONObjectString(param);
         
            StringEntity se = new StringEntity(jsonString, encoding);
                post.setEntity(se);    
            }          
          
            response = client.execute(post);           
        }catch(Exception e){
         Log.e("Error", "sendJSONData", e);
        } 
       
        return response;
 }

일단 일반적인 POST전송 방식과 약간의 차이는
StringEntity se = new StringEntity(jsonString, encoding);
이거다.
사실 삽질해서 찾은 완벽한 결과물도 이부분이다.

UTF-8을 맞추기 위해 HttpPost, HttpClient이부분만 열심히 건드렸다.
사실 구글링으로 검색된 결과도 이부분에 encoding을 설정하는데 완전 잘못이다.
결국 post.setEntity(se)를 하면서 encoding에 맞춰 바이너리를 생성하는듯하다.

역시 기초가 약한 개발자의 한계로 무한 삽질끝에 알아낸 사실이죠.

XML을 쓰는것보다 가벼워진다는 장점도 있지만 특히 좋은 점은,
결과를 받을때...
XML의 경우 컬럼명을 일일이 알아야 꺼내기 때문에 공통함수에 추출할 컬럼명을 명시하지만(이해가 안가는 분은 패스~~~) JSON은 Iterator함수를 이용해 Map에 바로 담을 수 있다는 장점이있다.

#SCMInno #에스씨엠이노 #WEBDeK

android ListView divider

android ListView divider 영역 제거하기

디자인 없이 ListView를 사용하면 모르겠지만 배경을 깔고 쓰면 ListView의 Row간 1Pixel정도의 간격이 생긴다.
이놈의 1Pixel은 웹 할때도 골치더니 여기까지 따라다닌다.

구글링을 하면 여러가지 방법이 나오지만 내가 성공한 확실한 방법은

ListView의 setDivider(null);
layout상의 xml에 속성을 아무리 false를 해도 절대 사라지지 않는다.

여기서 팁하나더.
Activity를 extends ListActivity한 경우. 즉, 자신이 스스로 List인 경우(<ListView android:id="@android:id/list")는

this.getListView().setDivider(null);

이렇게 해주면 된다.

#SCMInno #에스씨엠이노 #WEBDeK

Android 개발을 시작하다...

만 2년전 개발을 그만하겠다고 PM의 길을 들어섰건만...
다시 또 개발이다.
나름 새로운 개발을 시작하니 재미도 있군요...ㅋㅋ
Android 개발을 쉽게 적응하는데 Web, Swing, Network, Thread를 접해본 경험이 주요했다.
요즘처럼 학원에서 Web위주로만 교육받은 개발자는 처음에 접근하는데 어려움이 있을듯...
머 그래도 이바닦에 않되는건 없다.
Android에 적응하면 아이폰도 시작해야 한다는...ㅡㅡ;;;

Android는 정작 중요한 기술은 검색해도 잘 나오지 않고,
나온다 하더라도 적용하면 잘 않된다.
여러가지 책들은 특정 부분을 조금씩 가져다 쓰기는 좋은나 하나의 책만으로는 부족하다.

그래서 JAVA개발할때 절대 하지 않던 글쓰기를 한번 해볼까 한다.
얼마나 갈지는...ㅋㅋㅋ

#SCMInno #에스씨엠이노 #WEBDeK