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)が動く.