adobeAIRのHTTPServiceについて質問です。


指定したキーワードについて、google、yahooの検索結果を取得するプログラムをAIRで構築しています。
HTTPServiceのsendプロパティを用い、google検索結果ページにアクセスします。その返り値をHTTPServiceのresultプロパティで設定した関数で受け取りDataGridに反映します。

その後、上記の動きをyahoo検索結果ページにもするのですが、DataGridに直ぐに反映されず、DataGridの右の上下する部分を動かすと反映されます。

私としては直ぐ反映されるようなシステムを作りたいのですが、無理なのでしょうか?

又、2つ,3つのサイトにアクセスし、取得したデータを1つのDataGridに表示するという方法はあまりやらないのでしょうか?

サンプルのソースはこちらです。
http://d.hatena.ne.jp/camelmasa/20080628/1214636980

宜しくお願いします。

回答の条件
  • URL必須
  • 1人2回まで
  • 登録:2008/06/28 16:12:21
  • 終了:2008/06/30 09:51:10

ベストアンサー

id:tdomey No.1

tdomey回答回数1ベストアンサー獲得回数12008/06/30 00:41:51

ポイント100pt

GoogleとYahooの結果を別々にDataGridに設定するのではなく、一度にまとめて設定するのではダメでしょうか?

サンプルコードを少し変更してみました。

<?xml version="1.0" encoding="utf-8"?>
  <mx:WindowedApplication xmlns:mx="http://www.adobe.com/2006/mxml"
    layout="absolute"
    verticalAlign="middle" width="582" height="334">

    <mx:Script>
      <![CDATA[
      	import mx.collections.ArrayCollection; 
        import mx.rpc.events.ResultEvent;
        import mx.rpc.events.FaultEvent;
        import mx.controls.Alert;
        
        //追加
        private var matchStrGoogle:Array;
        private var matchStrYahoo:Array;

        //google検索
        public function SearchGoogle():void
        {
          var uv:URLVariables = new URLVariables();
          
          if(!q.text){
            Alert.show("キーワードを入力して下さい。");
          	return;
          }
          
          uv.q = q.text;//検索文字
          uv.num = "50";//検索結果数
          
          googlesearch.request = uv;
          googlesearch.send();
        }

        //yahoo検索
        public function SearchYahoo():void
        {
          var uv:URLVariables = new URLVariables();
          
          uv.p = q.text;//検索文字
          uv.n = "100";//検索結果数
          
          yahoosearch.request = uv;
          yahoosearch.send();
        }
        
        //googleへの通信成功
        public function GoogleResponce(event:ResultEvent):void
        {
          var str:String = event.result.toString();//レスポンス
          var grid:Array = new Array();
          
          var pattern:RegExp = /<h2\sclass=r><a\shref="((https?|ftp):\/\/[-_.!~*\'()a-zA-Z0-9;\/?:\@&=+\$,%#]+)"/g;
          var URLpattern:RegExp = /(https?|ftp):\/\/[-_.!~*\'()a-zA-Z0-9;\/?:\@&=+\$,%#]+/;
          
          var hit:RegExp = /<b>([0-9,]+)<\/b>/;
          
          matchStrGoogle = str.match(pattern);//google検索結果からURLを抽出
          
          /* --コメントアウト--
          //Objectを埋める
          for(var i:int=0; i<50; i++){
               var obj:Object = new Object();
               obj.id = "";
               obj.googleurl = "";
               grid[i] = obj;
          }
          
          datagrid.dataProvider = grid;
          
          for(var j:int=0; j<matchStr.length; j++){
            var word:Array;
            
            word = matchStr[j].match(URLpattern);
            if(!word[0].match(/^http:\/\/news.google.co.jp/)){
              datagrid.dataProvider[j].id = j+1;
              datagrid.dataProvider[j].googleurl = word[0];
            }
          }
          */
          
          SearchYahoo();
        }
        
        //yahooへの通信成功
        public function YahooResponce(event:ResultEvent):void
        {
          var str:String = event.result.toString();//レスポンス
          
          var pattern:RegExp = /<em\sclass="yschurl">[-_.!~*\'()a-zA-Z0-9;\/?:\@&=+\$,%#<>]+<\/em>/g;
          
          matchStrYahoo = str.match(pattern);//yahoo検索結果からURLを抽出
          
          /* --コメントアウト--
          for(var j:int=0; j<50; j++){
            var word:Array;
            var url:String = matchStr[j];
            datagrid.dataProvider[j].yahoourl = url;
          }
          */
          
          //追加
          var result:ArrayCollection = new ArrayCollection();
          for (var i:int=0; i<50; i++) {
          	result.addItem({id:i+1, googleurl:matchStrGoogle[i], yahoourl:matchStrYahoo[i]});
          }
          
          datagrid.dataProvider = result;
          
        }

        //HTTP通信失敗
        public function Fault(event:FaultEvent):void
        {
          Alert.show(event.fault.faultString, "Error");
        }
		]]> 
    </mx:Script>
    <mx:HTTPService
      id="googlesearch"
      method="GET"
      result="GoogleResponce(event)" 
      fault="Fault(event)"
      url="http://www.google.co.jp/search"
      resultFormat="text" />
      
    <mx:HTTPService
      id="yahoosearch"
      method="GET"
      result="YahooResponce(event)" 
      fault="Fault(event)"
      url="http://search.yahoo.co.jp/search"
      resultFormat="text" />
	
    <mx:ApplicationControlBar x="10" y="10" width="560" height="312" cornerRadius="4">
    </mx:ApplicationControlBar>
    
    <mx:TextInput id="q" 
      x="22" y="37" 
      width="334" height="22" />
    <mx:Button x="364" y="37" 
      label="検索" 
      click="SearchGoogle()" 
      width="74" height="22" />
      
    <mx:DataGrid id="datagrid" width="539" height="229" y="67" x="22">
      <mx:columns>
        <mx:DataGridColumn headerText="順位" dataField="id" width="40"/>
        <mx:DataGridColumn headerText="google検索結果URL" dataField="googleurl" width="130" />
        <mx:DataGridColumn headerText="yahoo検索結果URL" dataField="yahoourl" width="130" />
      </mx:columns>
    </mx:DataGrid>
    
  </mx:WindowedApplication>

<h2 class=r>など余計な文字列は取り除いていませんが、GoogleもYahooも同時に表示されると思います。

(コードの使わない部分はコメントアウトしました)

ちなみに、なぜYahooの結果がすぐに表示されないのかはよくわかりません。

元のコードをデバッガにかけて動かしてみましたが、きちんとデータは取れていました。

id:camelmasa

一度に表示する方法が適切なのかもしれないですね!

使わない部分も指摘いて頂いて…。嬉しいです。

有り難う御座います!

2008/06/30 09:50:34

コメントはまだありません

この質問への反応(ブックマークコメント)

トラックバック

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

絞り込み :
はてなココの「ともだち」を表示します。
回答リクエストを送信したユーザーはいません