mumanです。
ある企画で、twitterAPIを使用するandroidアプリを作っています。
プログラム作ってたころはPHPやASPばかりやってたせいか、javaらしいオブジェクト指向のプログラムにならず、色々と不都合が出てきたので、書きなおしてます。
twitterログインセッションを保持するため、パラメータ引き回すなど、javaプログラマの先輩方に怒られそうなコーディングでしたので・・・
頭で「オブジェクト指向」を理解しているつもりでも、実際意識して書かないとべたーとしたプログラムになるものですね。
まずは、twitterインスタンスの扱いについて、見直しました。
一度twitterAPI(実際はAPIをラップしたtwitter4jを使用)で生成したtwitterインスタンスが、不細工なパラメータ渡しで使用されていたため、TwitterInstanceクラスを準備し、そのクラスを介してオブジェクト参照する方法にしました。
「これ以外の方法があるのかも?」と少々不安ですが、オブジェクト指向にはなってると思います。
(流れ)
・メインのActivityでOAuth。
・メインActivityでOAuth後にtwitterインスタンスを生成。
・このログインセッションを他のActivityでも使用できるように、TwitterInstanceクラスにtwitterインスタンスを以下のメソッドにて静的変数で格納。
TwitterInstance 任意の変数名 = new TwitterInstance();
任意の変数名.putInstance(twitterインスタンス);
・twitterインスタンスを使う際は、以下のメソッドを発行すればTwitter型でtwitterインスタンスがリターンされる。
Twitter 任意の変数名 = new TwitterInstance().getInstance();
以下の「TwitterInstanceクラス」はメインのActivityで作成したTwitterインスタンスを静的変数として保持するためのクラスです。
//TwitterInstanceクラス
import twitter4j.Twitter; ← twitter4jライブラリのTwitterクラスをインポート
public class TwitterInstance {
//オブジェクト生成時に同じインスタンスを使用できるよう、静的変数にした
static Twitter mtwitter = null;
//twitterインスタンスを格納するメソッド
void putInstance(Twitter twitter) {
mtwitter = twitter;
}
//twitterインスタンスを提供するメソッド
Twitter getInstance() {
return mtwitter;
}
}
----
以下は、メインのActivityの関連箇所です(oauth、twitter4jのライブラリを使用してます)。
上記のクラスを実際に使用してます。
import oauth.signpost.OAuthProvider;
import oauth.signpost.basic.DefaultOAuthProvider;
import oauth.signpost.commonshttp.CommonsHttpOAuthConsumer;
import twitter4j.Twitter;
import twitter4j.TwitterFactory;
import twitter4j.conf.Configuration;
import twitter4j.conf.ConfigurationBuilder;
import twitter4j.http.AccessToken;
public class ~Tweet extends Activity {
//ここまで色々省略してますが、OAuthのメソッド
private void submitOAuthConsumer(){
try{
// twitter社より払いだされたOAuthの為の情報を用いて、OAuth処理
consumer = new CommonsHttpOAuthConsumer(CONSUMER_KEY, CONSUMER_SECRET);
provider = new DefaultOAuthProvider(
"http://twitter.com/oauth/request_token",
"http://twitter.com/oauth/access_token",
"http://twitter.com/oauth/authorize"
);
String authUrl = provider.retrieveRequestToken(consumer, callbackurl);
Toast.makeText(this, "ブラウザからログインしてください。", Toast.LENGTH_LONG).show();
// OAuth認証URLをアクセス先に指定して、ブラウザをインテント起動
this.startActivity(new Intent(Intent.ACTION_VIEW, Uri.parse(authUrl)));
}catch(Exception e){
Log.e(APP, e.getMessage());
Toast.makeText(this, e.getMessage(), Toast.LENGTH_LONG).show();
}
//Twitterインスタンス生成メソッド
private Twitter createTwitterInstance(){
// Twitterインスタンス生成
ConfigurationBuilder cbuilder = new ConfigurationBuilder();
cbuilder.setOAuthConsumerKey(CONSUMER_KEY);
cbuilder.setOAuthConsumerSecret(CONSUMER_SECRET);
cbuilder.setOAuthAccessToken(token);
cbuilder.setOAuthAccessTokenSecret(tokenSecret);
Configuration mConf = cbuilder.build();
TwitterFactory twitterFactory = new TwitterFactory(mConf);
Twitter twitter = twitterFactory.getInstance();
return twitter;
}
----
submitOAuthConsumer(); ← OAuthのメソッド実行
・
・
twitterins = new TwitterInstance(); ← twitterinsオブジェクト作成
twitterins.putInstance(createTwitterInstance()); ← Twitterインスタンス生成メソッド実行結果をTwitterInstanceの静的変数に格納
・・・で、以後は以下の形でtwitterインスタンスを使うことが出来ます。
Twitter 任意の変数名3 = new TwitterInstance().getInstance();
連休中はプログラム三昧か・・・・・