M.C.P.C.

―むり・くり―プラスコミュニケーション(更新終了)


| トップページ |

2012年1月 9日 21:17

Titanium MobileでRSSを読むアプリサンプルを書きなおしてみた

このエントリーをはてなブックマークに追加 mixiチェック

昨日書いたTitanium Mobileで生成できるRSS表示するアプリサンプルを、オブジェクトにまとめて書きなおしてみました。

でも、Titanium Mobileで想定している分割とは違うみたいです。そろそろ、サンプルアプリのKitchenSinkを参考にする時かな……

// feed  を取得して、TableViewに表示する
var FeedReader = function(feedUrl) {
  this.feedItems = []; // 画面表示されている全てのfeedアイテム
  this.feedUrl = feedUrl; // 読み込むfeedのURL
  this.offset = 1; // YQLで読み込むfeedの位置
  this.limit = 3; // YQLで一度に読み込むfeedの数
  this.tableView = Titanium.UI.createTableView({  data: [] });
  this.win = Titanium.UI.createWindow({ title: 'news', });
  this.win.add( this.tableView );
  this.tab = Titanium.UI.createTab({
    window: this.win,
    icon: 'KS_nav_ui.png',
    title: '最新情報',
  });
  this.setEvent();
  this.feedGet();
};
FeedReader.prototype = {
  getTab: function() {
    return this.tab;
  },
  feedGet : function() {
    var self = this;
    // RSS を取得して、TableViewに表示する
    var query = 'SELECT * FROM rss WHERE url="'
     + this.feedUrl + '" limit '
     + this.limit + ' offset '
     + this.offset;
    // alert(query);
    Titanium.Yahoo.yql(query, function ( e ) {
      if ( self.feedItems.length > 0 ) {
        // tableView1の最後の項目を消す
        self.tableView.deleteRow( self.tableView.data[0].rowCount - 1 );
      }
      if ( !( e.data ) ) {
      // YQLのレスポンスが失敗の時
        alert( 'YQLのレスポンスエラー。エラーメッセージ:' + e.message );
      }
      else {
      // YQLのレスポンスが成功の時
        var rssitems = e.data.item; 
        rssitems.forEach ( function( item ){
          self.feedItems.push( item );
          self._appendRow( item );
          self.offset++;
        });
        self._appendRowReadNext();
      }
    });
  },
  // feed項目をtableViewに追加する
  _appendRow: function( item ) {
    var row = Titanium.UI.createTableViewRow();
    row.className = 'entry';
    row.height = 'auto';
    row.layout = 'vertical';
    row.add(Titanium.UI.createLabel({
      text: item.title,
      top:    '4dp',
      left:   '4dp',
      right:  '4dp',
      height: 'auto',
      color:  'white',
      font: { fontWeight: 'bold',
          fontSize: '15dp',
      },
    }));
    row.add(Titanium.UI.createLabel({
      text: item.description.slice( 0, 50 ) + '……',
      top:    '0dp',
      left:   '4dp',
      right:  '4dp',
      height: 'auto',
      font: { fontSize: '13dp', },
    }));
    row.add(Titanium.UI.createLabel({
      text: item.date.replace( 'T', ' ' )
             .replace( '+09:00', '' ),
      left:   '4dp',
      height: 'auto',
    }));
    this.tableView.appendRow( row );
    return;
  },
  // 「続きを読む」項目をtableViewに追加する
  _appendRowReadNext: function () {
    var row = Titanium.UI.createTableViewRow();
    row.className = 'entry';
    row.height = 'auto';
    row.layout = 'vertical';
    row.add(Titanium.UI.createLabel({
      text: '続きを読む',
      textAlign: 'center',
      top:    '4dp',
      left:   '4dp',
      right:  '4dp',
      height: '42dp',
      color:  'white',
      font: { fontWeight: 'bold',
          fontSize: '15dp',
      },
    }));
    this.tableView.appendRow( row );
    return;
  },
  // TableView1内がタップされたときの動作を定義する
  setEvent: function() {
    var self = this;
    this.tableView.addEventListener(
      'click',
      function( e ) {
        if (e.index < ( self.tableView.data[0].rowCount - 1) ) { 
          var entryWindow;
          var entryView;
          // 新しくWindowを作ってWebViewを表示します
          entryWindow = Titanium.UI.createWindow({
            title: self.feedItems[ e.index ].title
          });
          entryView = Titanium.UI.createWebView({
            url: self.feedItems[ e.index ].link
          });
          entryWindow.add( entryView );
          // 現在のTabでWebViewのWindowを表示
          self.tab.open( entryWindow );
        }
        else {
          self.feedGet();
        }
      }
    );
    return;
  },  
};
 
var feedReader = new FeedReader('http://feeds.feedburner.com/MCPC');
// TabGroupを作る
var tabGroup = Titanium.UI.createTabGroup();
// tabGroupにtabを追加
tabGroup.addTab( feedReader.getTab() );
// TabGroupを表示
tabGroup.open();

投稿 大野 義貴 [Web] | |

トラックバック(0)

トラックバックURL: http://blog.dtpwiki.jp/MTOS/mt-tb.cgi/3826

コメント(2)

こんにちは
TitaniumでRSSリーダーを開発しているものです。

上記コードをそのままapp.jsに書いてビルドしてみたところ、iPhoneでしたら問題なかったのですが、androidの実機にビルドしようとすると
"YQLのレスポンスエラー。エラーメッセージ:undefined"と出てしまいます。

YQLでRSSを読み込むコードをいろんなサイトから引っ張って来て試しましたが、Androidだとどうもうまく動きません。
・プロジェクトのクリーンを行っても変わらずでした。
・AndroidはXPERIA(SO-02C)、Android2.3.4です。
・Androidエミュレーターでは問題なく動いております。

何かヒントなどありますでしょうか。
よろしくお願いします。

COさん:

当方でも以前のエントリ
http://blog.dtpwiki.jp/dtp/2012/01/yqltitanium-mob.html
にて書いている通り、Androidエミュレータ上で同様の
エラーメッセージが表示されることが何回かありました。

その場合、Androidエミュレータを立ち上げなおすことで問題が回
復していました。

YQLは汎用のAPIですが、Titaniumに実装されているYQL取り
扱いオブジェクトの挙動があまり信用できないような印象があり
ます。

汎用のRSSリーダを作るのであれば、上記以前のエントリでも書い
てあるとおり、YQLに頼らず自前でRSSのパースエンジンを用意し
たほうがいいのかもしれません。

コメントする