Twitterクライアント製作記その5 複数アカウント対応+会話を表示

複数アカウント対応しました(仮)

アカウントごとに,認証して得られるOAuthTokenのTokenとTokenSecretをデータベースに保存するようにした.

ただ,色々動作が怪しすぎてデバッグしきれない(`;ω;´)

アカウントの削除はボタンだけ用意してあるけどまだ消せない.

リストはユーザーIDでデータベースから情報を引っ張ってこれる形にしたので,アカウントを切り替えた時にリストの状態も切り替わります.素敵.

会話を表示するのは,AsyncTaskでInRepyToStatusIDを追っていけば余裕だろうと思っていたけど,1つを使いまわすと恐ろしいことになった.

2つAsyncTaskを使うメソッドを用意して,順番に回すとうまく行った.これでいいのかはわからないけど.

そして,EGitが使えるようになった!というか元々入ってた!

追記

AsyncTaskの使い方が悪かったみたい.こういう感じに書けばリプライを順番に追えた.

AsyncTask<Void, Void, Status> loadTask;
private class LoadConversationTask extends AsyncTask<Void, Void, Status> {
	@Override
	protected void onPreExecute() {
		//プログレスバーを表示したりする
	}
	@Override
	protected twitter4j.Status doInBackground(Void... params) {
		return nextTweet(nextId);//nextIdのツイートを持ってくる
	}
	@Override
	protected void onPostExecute(twitter4j.Status result) {
		if (result != null) {
			mAdapter.add(result);
			mAdapter.notifyDataSetChanged();
			nextId = result.getInReplyToStatusId();
			Log.d(TAG, "nextId:" + nextId);
			if (nextId > 0) {
				loadTask = new LoadConversationTask();
				loadTask.execute();
			} else {
				Log.d(TAG, "正常終了");
			}
		} else {
			//取得できなかった時の処理をかく
		}
	}
		@Override
	protected void onCancelled() {
		super.onCancelled();
		Log.d(TAG, "onCancelled()");
		setFooterViewStandby();
	}
}
	void loadPrevious() {
	if (loadTask != null && loadTask.getStatus() == AsyncTask.Status.RUNNING) {
		Log.d(TAG, "loadPrevious() return : loadTask is running.");
		return;
	}
	loadTask = new LoadConversationTask();
	loadTask.execute();
}
private twitter4j.Status nextTweet(long id) {
	try {
		return mTwitter.showStatus(nextId);
	} catch (TwitterException e) {
		e.printStackTrace();
	}
	return null;
}

適当なタイミングでloadPrevious()を呼べば,ツイートが読み込み終わるたびにリプライ先を読みこんでくれる.

読み込み中に会話を表示するアクティビティが死んでも,loadTaskは走り続けるので,onPauseの時に,loadTask.cancel(true);を書いておく

trueだとdoInbackGroudの処理が直ちにとまってonCancel()に移り,falseだとが終わるまで待ってonCancel(Object)が動く.