0

解析用の次のコードがあります

public class XML_Parsing_Sample extends UiApplication{

    //creating a member variable for the MainScreen
    MainScreen _screen= new MainScreen();
    //string variables to store the values of the XML document
    String _node,_element;
    Connection _connectionthread;

    public static void main(String arg[]){
        XML_Parsing_Sample application = new XML_Parsing_Sample();
        //create a new instance of the application
        //and start the application on the event thread
        application.enterEventDispatcher();
    }

    public XML_Parsing_Sample() {
        _screen.setTitle("XML Parsing");//setting title

        _screen.add(new RichTextField("Requesting....."));
        _screen.add(new SeparatorField());
        pushScreen(_screen); // creating a screen
        //creating a connection thread to run in the background
        _connectionthread = new Connection();
        _connectionthread.start();//starting the thread operation
    }

    public void updateField(String node, String element) {

        synchronized (UiApplication.getEventLock()) {
            String title = "My App";
            _screen.add(new RichTextField(node + " : " + element));

            if (node.equals(title)) {
                _screen.add(new SeparatorField());
            }
            }
    }

    private class Connection extends Thread{

        public Connection(){
            super();
        }

        public void run(){
            // define variables later used for parsing
            Document doc;
            StreamConnection conn;

            try{

                conn=(StreamConnection)Connector.open
                  ("http://www.islamicfinder.org/prayer_service.php?" +
                        "country=united_arab_emirates&city=abu_dhabi&state=01&zipcode=&latitude" +
                        "=24.4667&longitude=54.3667&timezone=4&HanfiShafi=1&pmethod=4&fajrTwilight1=" +
                        "10&fajrTwilight2=10&ishaTwilight=10&ishaInterval=30&dhuhrInterval=1&" +
                        "maghribInterval=1&dayLight=0&simpleFormat=xml&monthly=1&month=");

                _screen.add(new RichTextField("connn---"+conn));
                DocumentBuilderFactory docBuilderFactory
                  = DocumentBuilderFactory. newInstance(); 
                DocumentBuilder docBuilder
                  = docBuilderFactory.newDocumentBuilder();
                docBuilder.isValidating();
                doc = docBuilder.parse(conn.openInputStream());
                doc.getDocumentElement ().normalize ();
                NodeList list=doc.getElementsByTagName("prayer");
                _node=new String();
                _element = new String();


                for (int i=0;i<list.getLength();i++){
                    Node value=list.item(i).
                      getChildNodes().item(0);
                    _node=list.item(i).getNodeName();
                    _element=value.getNodeValue();
                    updateField(_node,_element);
                }
            }
            catch (Exception e){
                System.out.println(e.toString());
            }
        }
    }
}

しかし、このアプリケーションを実行しているとき、シミュレーターはラベル付きの空白の画面を表示していますRequesting..

誰でもこれを行うのを手伝ってもらえますか? 私はbb9900シミュレーターを使用しています。

4

1 に答える 1

1

私が見るいくつかの問題があります:

バックグラウンド スレッドでの UI の変更

バックグラウンド スレッドからユーザー インターフェイス (UI) を直接変更することはできません。Fieldこれには、へのオブジェクトの追加が含まれますScreen。しかし、あなたのConnection#run()方法では、これを行います:

 _screen.add(new RichTextField("connn---"+conn));

その行はおそらく例外をスローします:

java.lang.IllegalStateException: イベント ロックを保持せずにアクセスされた UI エンジン。

キャッチハンドラーを入力します。メッセージが出力されているはずですが、Eclipseコンソールウィンドウで気付いていないかもしれません。

その行をrun()メソッドから移動して、画面のコンストラクターに追加します。または、次のような安全なメソッドを作成できます。

public void addTextField(final String message) {
   UiApplication.getUiApplication().invokeLater(new Runnable() {
      public void run() {
          // code in here is run on UI thread, and can safely change the UI
          _screen.add(new RichTextField("connn---"+message));
      }
   });
}

次に、内部からConnection#run()、次のように呼び出します。

addTextField(conn.toString());

さて、それはまだあなたが望むものではないかもしれません. 文字列化されたConnectionオブジェクトの出力はあまり役に立ちません。代わりに URL を印刷したかったのではないでしょうか? とにかく、私はあなたに決めさせます。

URL リクエストにパラメーターがありません

URL の末尾にパラメータがないように見えます。

"http://www.islamicfinder.org/prayer_service.php?" +
  "country=united_arab_emirates&city=abu_dhabi&state=01&zipcode=&latitude" +
  "=24.4667&longitude=54.3667&timezone=4&HanfiShafi=1&pmethod=4&fajrTwilight1=" +
  "10&fajrTwilight2=10&ishaTwilight=10&ishaInterval=30&dhuhrInterval=1&" +
  "maghribInterval=1&dayLight=0&simpleFormat=xml&monthly=1&month="

そのため、サーバーでは、この URL の末尾に月を追加する必要があるかもしれません。

この2つを試してみてください。それはあなたに近づくはずです。

于 2013-05-23T22:22:21.433 に答える