TwitterAPI2010. 2. 5. 18:19
블로그를 방문해 주신 한 개발자 분으로 부터 아래와 같은 질문을 받았다.

twitter = new TwitterFactory().getInstance("아이디", "비밀번호");
Status status;
try {
status = twitter.updateStatus("Test msg1");
Log.e("Test","Successfully updated the status to [Test msg1].");
status = twitter.updateStatus("Test msg2");
Log.e("Test","Successfully updated the status to [Test msg2].");
} catch (TwitterException e) {
e.printStackTrace();
}

위와 같이 코드를 작성하고 updateStatus를 하고나서 메시지를 바꿔서 바로 다른 updateStatus를 하면 TwitterException : -1 이 발생합니다. (만약 3번째 updateStatus를 실행하면 잘 됩니다. 그러나 4번째는 문제발생...)
같은 소스를 일반 Java App로 만들어서 실행하면 문제가 없이 잘 돌아갑니다.

왜 안드로이드에서만 이런 문제가 발생할까요?

물론 답변을 할 수 없는 상태다. 나도 모르기 때문에;;

하지만 한가하던 터라 위와 관련된 내용을 좀 찾아보았다.
그전에, 내가 쓰고 있는 것은 Twitter4J-2.0.10 의 버젼 이었고 
위의 코드는 문제 없이 잘 동작 하였다.
Twitter4J-2.1.0 부터 문제가 발생한 것이다.

Project site(http://twitter4j.org/jira/browse/TFJ)를 검색해보니
많은 Android 개발자들이 Twitter4J 사용시 위와 같은 문제로 고민하고 있음을 알게 되었다.

다음은 검색 결과 중 주요 내용만 뽑아보았다.
31.  Yusuke Yamamoto   1월29일, 오후3시10분
Hi, 
I haven't managed to look into it yet. 
I have no idea why adding "Connection: close" to the request header doesn't work for the issue. 
http://java.sun.com/j2se/1.5.0/docs/guide/net/http-keepalive.html 
This can be a Dalvik/Harmony side issue as Miyuuu indicated. 
http://stackoverflow.com/questions/1440957/httpurlconnection-getrespo... 
Does any have any idea how to workaround the problem? 
I've just filed an Jira issue to track the problem. 
http://twitter4j.org/jira/browse/TFJ-296 
Thanks, 
-- 
Yusuke Yamamoto 
yus...@mac.com 

그렇다..
결론은 아직 해결이 되지 않았다 --;;

http client를 이용해서 server와 connection을 한 후 두번째 connection을 할 경우 fail이 발생을 한다.
android 의 경우 성능을 높이기 위해서 최초 연결이 된 경우 connection을 계속해서 유지하고 있도록 동작을 하고
이것 또한 Twitter4J가 위와 같은 exception이 발생하게 한다고 한다.
그래서 Twitter4J를 그냥 JVM에서 돌아가도록 하면 이런 문제는 또 발생하지 않는다.
DALVIK 에서 구동 될때만 문제가 생긴다는 것이다. (http://code.google.com/p/android/issues/detail?id=2800)


문제를 해결하기 위해서 여러 곳에서 움직임이 있는데
그중 하나만 관심을 가지고 지켜본다면 해결 된 때를 알 수 있을 것 같다.

Stackoverflow

Twitter4J

Twitter4J Group
http://groups.google.com/group/twitter4j/browse_frm/thread/4319a99a2a656275?tvc=1
Posted by ekwang
TwitterAPI2009. 11. 19. 10:02
Twitter4J를 이용하여 간단한 예제를 작성해보도록 하자.

오늘 살펴볼 예제는 
에 있는 첫번째 예제인
id, password 를 이용해 Twitter 인스턴스를 생성하고
updateStatus 메소드를 이용해서 입력한 스트링을 보내는 코드이다.

1. Updating status

You can update "What are you doing?" via Twitter.updateStatus() method.
See also twitter4j.examples.Update.java for detail. 


Twitter twitter = new Twitter(twitterID,twitterPassword);
Status status = twitter.updateStatus(latestStatus);
System.out.println("Successfully updated the status to [" + status.getText() + "].");


위의 예제를 간단한 Android application으로 만들어 보자.
결과 화면은 아래와 같다.


먼저 사용할 Twitter4J class를 import해준다.
import twitter4j.Twitter;
import twitter4j.Status;
import twitter4j.TwitterException;


3개의 EditText와 하나의 Button을 이용하여 위와 같은 화면을 구성할 수있다.
final EditText input_id = (EditText)findViewById(R.id.user_id);
final EditText input_pw = (EditText)findViewById(R.id.password);
final EditText input_text = (EditText)findViewById(R.id.input_text);
Button signin = (Button)findViewById(R.id.sign_in_button);

이후 Update Button에 OnClickListener를 붙여서 onClick 발생시 
signin.setOnClickListener(new View.OnClickListener() {
    public void onClick(View v){
      //TODO : Below code will be inserted here
    }
});


user_id EditText와 password EditText에 입력된 값으로 Twitter 객체를 생성하도록 해준다.
그 후 updateStatus 메소드를 이용하여 글을 올리고 결과를 Toast를 이용해 출력 한다.
Twitter twitter = new Twitter(username, password);
Status status;
try {
  status = twitter.updateStatus(update_text);
  Toast.makeText(getApplicationContext(), "Successfully updated the status to [" + status.getText() + "].",   Toast.LENGTH_LONG).show();
  } catch (TwitterException e) {
    Toast.makeText(getApplicationContext(), "Fail to update text [" + e + "].", Toast.LENGTH_LONG).show();
  }

위와 같은 간단한 코드 만으로 Twitter에 로그인 하고 글을 올리는 것이 가능한 application을 만들 수 있다.

프로젝트 파일을 압축해서 첨부하였으니 참고.
다음에는 자신의 timeline을 얻어와 list로 출력 하는 예제를 살펴볼 예정이다.

'TwitterAPI' 카테고리의 다른 글

[Twitter4J] OAuth support  (0) 2011.02.10
Twitter4J TwitterException -1 발생  (1) 2010.02.05
Twitter4J를 사용하기 위한 JAVA CLASSPATH 설정  (0) 2009.10.22
Posted by ekwang
Android/Application2009. 11. 5. 18:18

SNS서비스의 이용이 많아지면서 당연 Twitter에도 많은 사람들이 관심을 가지게 되었다.
S/W 개발자라면 TweetAPI를 이용해서 Twitter Client Application을 개발하는데 관심을 가져볼만하다.

간단한 방법만 소개해보겠다.
우선 Twitter는 TwitterAPI라고 하여 Twitter server에 있는 여러 data들을 자유롭게 접근하여 사용할 수 있도록
API를 오픈하고 있다.
물론 완전히 자유롭게는 아니고 약간의 제약이 있긴하다. (이러한 내용은 Twitter API wiki를 통해 확인하도록 하자.)

아무튼 Twitter API는 html base이다.
C, JAVA등에 익숙한 나같은 사람은 html로 application을 개발 할 능력이 없다.(사실 JAVA에도 무뇌한이지만..)
그래서 TwitterAPI를 다양한 언어로 wrapping해놓은 다양한 라이브러리등이 존재한다.

그중 JAVA를 써서 개발한 Twitter4J를 사용한다면 개발이 한결 쉬울 것이다.
사이트로 가서 압축된 파일을 받기만 하면 준비는 끝이다.
그리고 간단한 sample code를 몇개만 보게된다면 당신은 twitter client 프로그램을 손쉽게 개발 할 수 있을것이다!!!

개발과정을 잠깐보고 간단한 예제코드를 Android에 적용해보자.

1. Twitter4J library Add
아래사진과 같이 Package Explore에서 해당 package를 선택 후 Alt+Enter를 누르면 Properties 화면이 뜬다.
여기서 Java Builder Path 메뉴의 Libraries로 이동, Add External JARs를 눌러서
Twitter4J\twitter4j-2.0.10\twitter4j-2.0.10.jar 를 추가하면 준비는 끝이다.

2. 필요한 class를 import.
이런 식으로 import해 주고 Twitter4J의 class, method들을 호출하여 app개발을 하면 된다.
import twitter4j.Twitter;
import twitter4j.Status;
import twitter4j.TwitterException;
import twitter4j.User;


Twitter4J를 이용한 Twitter 로그인, Tweet 보내기 예제는 다음번에 꼭 포스팅하도록 하겠다.
Posted by ekwang
TwitterAPI2009. 10. 22. 20:32

Window에서 Twitter4J API 사용을 위해서는
twitter4j-2.0.10 이하에 존재하는 jar 파일의 위치를 CLASSPATH 환경 변수 값에 등록을 해주어야 한다.
그래야 Twitter4j class 들을 import한 java파일을 javac를 이용하여 정상적으로 빌드 할 수 있다. 

즉, 아래의 jar파일들이 CLASSPATH 환경 변수에 포함되어야만
어떤 경로에서든 Twitter4j 를 import한 java파일이 빌드가 되는 것이다.
Twitter4J 의 jar파일이 아니더라도 빌드하고자 하는 파일의 import 에 새로운 class가 추가될 경우에는
필요한 jar파일들이 있는 경로를 CLASSPATH로 추가해 주어야 한다.

twitter4j-2.0.10\twitter4j-2.0.10.jar
twitter4j-2.0.10\twitter4j-2.0.10-javadoc.jar
twitter4j-2.0.10\twitter4j-2.0.10-sources.jar
twitter4j-2.0.10\lib\jdom.jar
twitter4j-2.0.10\lib\junit.jar
twitter4j-2.0.10\lib\logback-classic-0.9.6.jar
twitter4j-2.0.10\lib\logback-core-0.9.6.jar
twitter4j-2.0.10\lib\rome-0.9.jar
twitter4j-2.0.10\lib\slf4j-api-1.5.0.jar


아래와 같이 배치파일을 생성하여 CLASSPATH에 추가를 쉽게 한다.
setEvn.cmd 라는 파일을 생성하여 아래와 같이 코드를 넣자.(Window 환경용 임)

set JAVA_HOME=C:\Program Files\Java\jdk1.6.0_03
for %%i in (D:\SFF\Twitter\Twitter4J\twitter4j-2.0.10\lib\*.jar) do set CLASSPATH=!CLASSPATH!;%%i
for %%i in (D:\SFF\Twitter\Twitter4J\twitter4j-2.0.10\*.jar) do set CLASSPATH=!CLASSPATH!;%%i
set CLASSPATH=%CLASSPATH%;.
set MEM_ARGS=-Xms10m -Xmx10m


위의 JAVA_HOME의 값과 같이 강조처리한 경로명에 대해서는
본인의 경로에 맞도로 변경을 하도록 한다.
setEnv.cmd를 cmd창에서 실행하면 아래와 같이 CLASSPATH값이 변경되었음을 확인 할 수 있다.

CLASSPATH=!CLASSPATH!;D:\SFF\Twitter\Twitter4J\twitter4j-2.0.10\twitter4j-2.0.10.jar;.


그리고 CLASSPATH에 현재경로를 알려주는 . 을 등록하지 않게되면
아래와 같은 Error를 보게 된니 반드시 . 경로(현재폴더를 지정하는 것임)도 추가 하도록 한다( set CLASSPATH=%CLASSPATH%;.)

D:\SFF\Project\Java>java t4j_Update
Exception in thread "main" java.lang.NoClassDefFoundError: t4j_Update


CLASSPATH가 정상적으로 설정되었다면
아래와 같이 컴파일 및 실행을 해볼 수 있다.(setEnv.cmd 는 이미 실행한 상태임)

  

 이 글은 스프링노트에서 작성되었습니다.

'TwitterAPI' 카테고리의 다른 글

[Twitter4J] OAuth support  (0) 2011.02.10
Twitter4J TwitterException -1 발생  (1) 2010.02.05
Twitter4J를 이용한 Android Twitter Application 예제 1  (5) 2009.11.19
Posted by ekwang