본문 바로가기

Daily Sample

[Day24] Asynctask로 연동되는 Androday Twitter App 소스

TITLE : Androday Twitter App 
Date : 2011/06/01 
Description : 
This is Source that Androday twitter App by Authorized by Asyntask
Download Link :
 
과거에 트위터API가 XML,Json, OAuth등 다양한 인증을 제공했었다.
하지만,  최근 트위터 API를 악용하는 경우가 많아서 직접 인증페이지에 접근해서 토큰을 가져오게 강제하였다.
이렇게 변경되면서 보안은 강화되었지만, 연동방식이 2번의 CallBack 구조로 바뀌었기때문에 연동하기 무척 복잡해졌다.
이번에 프로젝트를 진행하면서 트위터 토큰을 StartActivityForResult의 결과값으로  구현하여 사용하기 용이하게 하였는데 여기서 소개한다.
(설명이 읽기 귀찮다면 트위터 클래스만 복사해서 써도 무방하다.)
 
네트워크의 CallBack은 쓰레드와 헨들러로 구현해도 되지만, Asynctask로 간단하게 구현해 보았다.
AsyncTask는 말그대로 쓰레드로 처리하는 비동기작업을 수행하기 위한 최적의 클래스다.
 

(AsyncTask는 비동기작업이기 때문에  UI 변경 시  Handler / onPreExecute / onPostExecute 등 핸들메세지를 통해서 UI에 반영한다.)
아이러니 하게도 이 강좌에서 AsyncTask는 동기적으로 작동한다. (다만, 네트워크 CallBack 구조를 위한 다이얼로그 처리를 위해서 썻다.)  
 
Twitter연동을 위해서 총 3개의 AsyncTask 클래스를 소개하면 다음과 같다.
 RequestTokenAsyncTask.class – 트위터 인증페이지와 PinCode를 가져오기 위한 사전 네트워크 처리 (CallBack구조)
 OAuthTokenAsyncTask.class – 트위터 글쓰기를 위한 token 과 tokenSecret를 가져오기 위한 사전 네트워크 처리 (CallBack구조)
RegistAsyncTask.class – token 과 tokenSecret으로 글을 쓴다. 에러날 경우 글쓰기 실패.
 
1. Auth 버튼을 누룰경우 startActivityForResult로 TwitterActivity를시작하면 RequestTokenAsyncTask로 비동기작업을 시작한고 결과값은 mHandler로 반환된다.
(Consumer key 와 Consumer secret 은 본인의 APP으로 인증 받는다.) 
 //Consumer key
  String consumerKey = STATICVALUES.consumerKey;
  //Consumer secret  
  String consumerSecret = STATICVALUES.consumerSecret; 
  
  RequestTokenAsyncTask requestTokenAsyncTask = new RequestTokenAsyncTask(this,twitter, mHandler);   
  requestTokenAsyncTask.execute(consumerKey,consumerSecret);

   
2. 인증페이지가 정상적으로 로드되면 Webview에서 onPageStarted()가 호출되고 핀번호를 가져오는 자바스크립트가 실행된다.
public void onPageFinished(WebView view, String url) {
   super.onPageFinished(view, url); 
   view.loadUrl(“javascript:window.GETPINNUMBER.showHTML(document.getElementById(‘oauth_pin’).innerHTML);”);   
  }
 
 
3. 자바스크립트 수행결과 ‘oauth_pin’ 값이 검출될 경우 OAuthTokenAsyncTask로  비동기작업을 시작한고 결과값은 mHandler로 반환된다.
(원칙적으로 AsyncTask는 MainUI에서 실행해야 되기때문에 runOnUiThread로 실행한다.)
 runOnUiThread(new Runnable() {
      public void run() {       
       OAuthTokenAsyncTask oAuthTokenAsyncTask = new OAuthTokenAsyncTask(TwitterActivity.this, twitter ,mHandler);        
       oAuthTokenAsyncTask.execute(requestToken.getToken(),requestToken.getTokenSecret(), realpin );
      }
     });  
 

4. mHandler로 반환된 결과값이 case2번 일 경우 token, tokenSecret값과 -1을 반환하고 TwitterActivity를 종료한다.
case 2:        
    accessToken = (AccessToken)msg.obj;         
       Intent intent = getIntent();       
       intent.putExtra(“token”, accessToken.getToken());
       intent.putExtra(“tokenSecret”, accessToken.getTokenSecret());
       intent.putExtra(“nick”, accessToken.getScreenName());                    
       setResult(-1 ,intent);              
       finish();    
    break;
 
 
 5. 반환된 token, tokenSecret값을 사용해서 RegistAsyncTask를 비동기작업으로 시작하고 등록실패 시 TwitterException이 발생한다.
 
 
<P.S> 소스에 첨부된 Consumer key/Consumer secret 는 언제든지 삭제될수 있으므로, 본인의 인증키를 발급 받도록 한다. 
 
 Creative Commons License
이 저작물은 크리에이티브 커먼즈 저작자표시 3.0 Unported 라이선스에 따라 이용할 수 있습니다.