2010年3月7日日曜日

第21回 タイムラインの取得を細かく制御する

今回の変更はちょっと小粒かもしれません。
前回までのプログラムを動かした方なら、
起動時に各タイムラインが20個程度しか読み込んでくれないことに気づいたと思います。
twitterのAPIにパラメータを加えてリクエストすることで
取得件数を変えることができます。

取得件数のためにcountパラメータを使います。
ただし、毎回100件とか取得するのも無駄なので、
2回目以降のアクセスにはsince_idを使います。
since_idに前回取得した最新のidを入れておくと
それ以降のIdのつぶやきを取得できます。

ちなみにSearch APIはパラメータが違うので処理を共通化するのが難しいです。
そのため今回は何もせず今まで通り取得します。

というわけで、Twitterの方のタイムラインのためにTimelineクラスから派生したクラスを作ります。
UpdateをvirtualにしてTwitterTimelineクラスで以下のように実装しました。


  public override void Update() {
   RequestParameter[] parameters;
   if (sinceId.HasValue) {
    parameters = new RequestParameter[] {new RequestParameter("since_id", sinceId.Value.ToString())};
   } else {
    parameters = new RequestParameter[] {new RequestParameter("count", _startupReadCount.ToString()) };
   }

   using (var response = WebUtility.GetResponse(_url, "GET", parameters, UserInfo)) {
    var stream = response.GetResponseStream();
    var result = _itemsReader.Read(stream);
    foreach (var item in result) {
     if (!AllItems.Contains(item)) {
      OnReadNewItem(item);
      if (sinceId == null || item.Id > sinceId) {
       sinceId = item.Id;
      }
     }
    }
   }

単純にsinceIdに値が入っていたらそれをパラメータとして
なかったらcountをパラメータとして渡すようにしただけです。

ただサブクラスから親クラスのイベントは呼べないので、
OnReadNewItem()というprotectedメソッドを作って親クラスで処理しています。

ちなみにsinceIdが古すぎたりしたらエラーがでると仕様書にありますが、
前にも書いたとおり、しばらくは、blogが長くなりそうな処理は省いています。

あとはOptionDialogで初期読込数を指定できるように変更指定しています。
XAMLがこんな感じになりました。










表示名



更新間隔




起動時読込数





URL







見栄え(テキストの上下寄せ(Alignment)など)を調整するのに苦労しました。
よく忘れて混乱するのですが、TextBlockのVerticalAlignmentをcenterにしただけでは、
横のTextBoxに対して垂直位置が真ん中に来ません。
言葉で伝わるかどうかはわかりませんが、
TextBlockのVerticalAlignmentはTextBlockが持つ領域の中で
テキストを上下のどこに表示するかです。
デフォルトではTextBlockの領域(高さ)はテキストのちょうどの大きさしか持たないので、
TextBlock自体が下に置かれている状態では、なんの変化もありません。
というわけで、TextBlockの領域が、WrapPanelの1行の高さをすべて使うように
WrapPanelをVerticalAlignment="Stretch"としてTextBlockを広げています。

あとはオプションが増えて折り返しが必要になったのでWrapPanelを使って、
改行されたくないところはStackPanelで囲っています。

ちなみに、どれがどの領域を持っているかはsnoopなどのツールを使うとわかるかもしれません。

最後にTimelineを生成するときにTypeによってはTwitterTimelinを生成するようにしました。

今回のソースコードはこちら。
http://wtwitter.codeplex.com/SourceControl/changeset/view/42546

0 件のコメント:

コメントを投稿