Twitter4J 非同期処理は、常に TwitterListener を作成して、AsyncTwitter からの実行を リスナー側で受けるという形になります。( 今回の場合、searched(QueryResult queryResult) で受けて、search(Query query) で呼び出す ) 関連する記事 Android Studio で Twitter4J で画像付きツイート 注意する事
1) トークンの保存場所が、app\src\main\resources の twitter4j.properties 2) TwitterListener で受けたところから画面にアクセスするには、UI スレッドに対する考慮が必要 ( runOnUiThread メソッドが簡単 ) 3) ライブラリは twitter4j-core-4.0.4.jar と twitter4j-async-4.0.4.jar をコピーして core のみ Gradle に登録MainActivity
public class MainActivity extends AppCompatActivity {
// リストビュー
private MyArrayAdapter adapter;
private ListView listview;
// 日付データ用
private Calendar cal;
private SimpleDateFormat sf;
// Twitter 用
private TwitterListener listener;
private AsyncTwitter asyncTwitter;
private ArrayList<TwitterData> twitterData;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
// アダプタを作成
adapter = new MyArrayAdapter(MainActivity.this,R.layout.list_item);
// リストビューの取得
listview = (ListView) MainActivity.this.findViewById(R.id.listView);
// リストビューにデータを表示
listview.setAdapter(adapter);
Button buttonSearch = (Button) MainActivity.this.findViewById(R.id.buttonSearch);
buttonSearch.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
adapter.clear();
loadDataList();
}
});
cal = Calendar.getInstance();
sf = new SimpleDateFormat("yyyy/MM/dd HH:mm:ss");
// リスナーを作成する
listener = new TwitterAdapter() {
@Override
public void searched(QueryResult queryResult) {
twitterData = new ArrayList<TwitterData>();
List<Status> list = queryResult.getTweets();
Iterator<Status> it = list.iterator();
while( it.hasNext() ) {
Status statudData = it.next();
twitterData.add(new TwitterData(
// ScreenName と Name
String.format("%s : %s", statudData.getUser().getScreenName(), statudData.getUser().getName()),
sf.format(statudData.getCreatedAt()),
statudData.getText()));
}
// UI スレッドで アダプタにデータをセット
MainActivity.this.runOnUiThread(new Runnable() {
@Override
public void run() {
adapter.addAll(twitterData);
}
});
}
@Override
public void onException(TwitterException te, TwitterMethod method) {
Log.i("lightbox", "onException");
te.printStackTrace();
}
};
// リスナーを登録する
AsyncTwitterFactory factory = new AsyncTwitterFactory();
asyncTwitter = factory.getInstance();
asyncTwitter.addListener(listener);
}
// *****************************************
// Twitter から リストビューにデータを表示
// *****************************************
public void loadDataList() {
EditText editSearch = (EditText) MainActivity.this.findViewById(R.id.editSearch);
String searchString = editSearch.getText().toString();
Query query = new Query(searchString);
asyncTwitter.search(query);
}
}
MyArrayAdapter
public class MyArrayAdapter extends ArrayAdapter<TwitterData> {
// コンストラクタで渡された画面の保存
private int mResource;
// 画面作成用
LayoutInflater mInflater;
public MyArrayAdapter(Context context, int resource) {
super(context, resource);
// ArrayAdapter でも、このようにして保存して利用してます
mResource = resource;
mInflater = LayoutInflater.from(context);
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
if (convertView == null) {
convertView = mInflater.inflate(mResource, parent, false);
}
// アダプターより行データを取得
TwitterData twitterData = MyArrayAdapter.this.getItem(position);
// 画面にデータをセット
TextView tv;
// キー
tv = (TextView) convertView.findViewById(R.id.textKey);
tv.setText(twitterData.getScreenName());
tv = (TextView) convertView.findViewById(R.id.textItem1);
tv.setText(twitterData.getStringDate());
tv = (TextView) convertView.findViewById(R.id.textItem2);
tv.setText(twitterData.getText());
// 行の画面をシステムに返す
return convertView;
}
}
TwitterData
public class TwitterData {
private String stringDate;
private String screenName;
private String text;
public TwitterData(String screenName, String stringDate, String text) {
this.screenName = screenName;
this.stringDate = stringDate;
this.text = text;
}
public String getScreenName() {
return screenName;
}
public void setScreenName(String screenName) {
this.screenName = screenName;
}
public String getStringDate() {
return stringDate;
}
public void setStringDate(String stringDate) {
this.stringDate = stringDate;
}
public String getText() {
return text;
}
public void setText(String text) {
this.text = text;
}
}
|
|
【2016 Android Studioの最新記事】
- Android Studio で Twitter4J で画像付きツイート
- 内部ストレージを起点とした画像データの処理 / Android
- カメラを起点とした画像データの処理 / Android
- バグ : Android Studio 2.2.2 で、spinnerMode を dialog に設定すると app:spinnerMode となってしまいます
- ListView + カスタム ArrayAdapter + ViewSwitcher + Firebase API + Data Binding : 更新処理 / Android Studio
- Firebase storage に画像をアップロードする。1) ギャラリーから、2) 実行中の画面 / Android
- Android : 画像関連のテスト用カメラアプリ
- Firebase storage の画像を ファイルとしてダウンロードして ギャラリーに保存する( ImageView にも表示する ) / Android
- Firebase storage の画像の URL を取得して、通常と同様に Stream でダウンロードして ImageView に表示する / Android
- Firebase storage の画像をメモリに直接ダウンロードして ImageView に表示する / Android
- Android : Firebase の データを REST API の PUT コマンドで更新する
- Firebase API + Android Studio : Database のデータを Java に取得する方法は3通りあります。(orderByChild 使う場合は、getChildren ..
- Android : Data Binding + Firebase API で ListView にデータを表示する
- Firebase API + Android Studio : Database 処理の基本設定
- Android Studio 2.2 で新規プロジェクトを作成すると『Could not reserve enough space for 1572864KB object heap』というエラーが出..
- Firebase API + Android Studio : Database にデータを保存は単純で、DatabaseReference の setValue メソッドを使用します






