あれこれ備忘録@はてなブログ

勉強したことやニュースや出来事を備忘録として書いていきます

このブログには広告が含まれます

Threadを作ってタブ要素を追加 Twitter4j

ホームのタイムラインやフォローしているユーザごとにタイムラインを別のタブで表示させたいとき、テキストとユーザのプロフィール画像をtwitter4jを使って読み取り、JLabelにセットし、それをJListに追加する方法を取りました。

そうすると、以前に書いたようにJListに文字列意外を表示させるためにレンダラーを設定する必要があるのと、発言ごとにユーザの情報を読み込んでJLabelに情報を書き込まないといけないので、少なくとも各タブの要素であるJListへのセット処理はスレッドで並列にさせたい。

となったときに簡単な処理なら

Thread thread = new Thread(new Runnable() {

public void run() {

//何か処理

}

});

で行けるのですが、各タブを追加するメソッドの中でこの方法を用いようとして

public void method(int var1, Object obj) {

Thread thread = new Thread(new Runnable() {

public void run() {

//var1とかobjを使った処理

}

});

}

は使えない。

new Thread()の中にいろいろ書いたものはインナークラスの一つで無名クラスというもの。

class A {

int varA = 1;

class b {

//varAを使った処理

}

}

が内部クラス。

内部クラスは大元のクラス(例ではA)のメソッドやクラス変数に簡単にアクセスができる。

無名クラスも内部クラスの一つだから同じようにできます。

しかし、先程のThreadの例ではメソッドの中で引数として定義された変数なのでこれにアクセスすることができない。

List friendsStatuses = twitter.getFriendsStatuses(-1);

if(friendsStatuses != null) {

for(User user: friendsStatuses) {

Thread thread = new Thread(new Runnable() {

public void run() {

//twitter.getUserTimeline(user.getId())を使った処理

}

});

}

}

がそれぞれのユーザごとのタイムラインをスレッドで別処理するのに書きたいコード。

だけどこれはuserへアクセス出来ないので無理。

仕方が無いので内部クラスとしてThreadを継承した別のクラスを作って

for(User user: friendsStatuses) {

WorkerThread thread = new WorkerThread(twitter.getUserTimeline(user.getId()));

thread.start();

}

のようにすることでなんとかしてみました。