0

ネットで何時間も検索しましたが、行き詰まりました。

xmlを解析するためのチュートリアルを使用しましたが、DOMxmlパーサーを使用するのが最善であるという結論に達しました。主に、解析するコンテンツに30個のアイテムしか含まれていないことが原因です。

xmlは次のように見えます:

<?xml version="1.0" encoding="UTF-8"?>
<sliderlist>
<item>
<urlslide>http://www.google.com</urlslide>
</item>
<item>
<urlslide>http://www.stackoverflow.com</urlslide>
</item>
</sliderlist>

DOMパーサー(ほとんどはチュートリアルから):

TextView urlslide[];


        try {

            URL url = new URL("http://www.mydomain.com/my.xml");
            DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
            DocumentBuilder db = dbf.newDocumentBuilder();
            Document doc = db.parse(new InputSource(url.openStream()));
            doc.getDocumentElement().normalize();

            NodeList nodeList = doc.getElementsByTagName("item");

            /** Assign textview array lenght by arraylist size */
            urlslide = new TextView[nodeList.getLength()];


            for (int i = 0; i < nodeList.getLength(); i++) {

                Node node = nodeList.item(i);

                urlslide[i] = new TextView(this);


                Element fstElmnt = (Element) node;
                NodeList nameList = fstElmnt.getElementsByTagName("urlslide");
                Element nameElement = (Element) nameList.item(0);
                nameList = nameElement.getChildNodes();
                urlslide[i].setText(((Node) nameList.item(0)).getNodeValue());


                //layout.addView(urlslide[i]);


            }
        } catch (Exception e) {
            System.out.println("XML Pasing Excpetion = " + e);
        }

そして、解析されたコンテンツが必要な部分は、配列を埋めます(values / resフォルダー内のxmlを使用するもの):

        mTimer=new CountDownTimer(15000, 1000) {

    String[] myArray = getResources().getStringArray(R.array.testArray);
    //String[] myArray={"http://www.upc.nl/","http://www.google.com","http://www.flyerwall.nl"};    
     //<- String should be read from landingpage.


        int currentIndex=0; 
        public void onTick(long millisUntilFinished) {
             //if (currentIndex<myArray.length) {
                //number.setText("seconds remaining: " +  millisUntilFinished / 1000);
                //currentIndex++;
             //}
        }

        public void onFinish() {
            if (currentIndex<myArray.length) {
                //number.setText("done!");
                mWebView.loadUrl(myArray[currentIndex]);
                currentIndex++;
            } else {
                currentIndex=0;//reset current url to 0
                if (currentIndex<myArray.length)
                //number.setText("done!");
                mWebView.loadUrl(myArray[currentIndex]);
                currentIndex++;
                mTimer.start(); //activate the loop
            }

                mTimer.start();//first time start

        }
     };

私はあまりにも多くのサンプルコードに行ったので、もう手がかりが得られませんでしたが、私の内臓は、それを完了するのはとても簡単なはずだと言います。

4

3 に答える 3

1

XML の解析と UI 要素の構築の両方を 1 回の実行で試みるのではなく、これを別々のステップに分割する必要があります。これにより問題が単純化される (分割統治) だけでなく、ネットワーク リクエストと XML ドキュメントの解析をバックグラウンド スレッドで実行し、すべての UI 操作をアプリのメイン ( UI) スレッド。

残念ながら、具体的にどの手順で問題が発生しているのかは完全にはわかりません。XML ドキュメントから実際のデータを収集している場合は、コードにブレークポイントを設定し、一度に 1 ステップずつ実行して、どこで問題が発生しているかを正確に確認する必要があります。ただし、このステップを簡素化する機会がいくつかあります。

例: 要素のリストを取得する代わりに、関心のある要素を<item>...</item>取得するだけです。<urlslide>...</urlslide>

NodeList nodeList = doc.getElementsByTagName("urlslide");
List<String> urlList = new ArrayList<String>();

// iterating over nodes omitted... simply add the value of each node to the list
urlList.add(nodeList.item(i).getValue());

NodeListこれにより、「urlslide」要素のみを含むが得られるはずです。最終的には URL のリストが必要になると思います。そのためList<String>、ノードの値を入力するなどを作成することをお勧めします。前述のように、長時間実行される可能性のあるタスクをメイン スレッドで実行することは望ましくありません。これは、ユーザー インタラクションをブロックし、悪名高い Android Not Responding (ANR) メッセージが発生する可能性が非常に高いためです。したがって、このロジックを のようなものにラップすることをお勧めしますAsyncTask

URL を取得したので、あとはそれらをリストとしてユーザーに表示するだけです。これが本当にあなたが求めているものなら、ListViewウィジェットは完璧にマッチします. TextViewコードが現在示しているように、URLごとに個別に作成しないことを強くお勧めします。を使用する利点は、バックグラウンド作業が完了AsyncTaskすると自動的に呼び出されることです。これは、解析されたデータonPostExecute(...)を に入力するための正確な時点です。ListView

などの使用方法を示す多数の例 (ここ SO と API ドキュメントの両方) があります。さらにヘルプが必要な場合はAsyncTaskListView何が問題なのかをできるだけ具体的に教えてください。

于 2012-06-24T23:57:41.537 に答える
0

代わりに、ドキュメントをこの関数に渡すだけです

private List<string> getSlidesFromDocument(Document doc)
{
    NodeList nodeList = doc.getElementsByTagName("urlslide");
    List<String> slides = new ArrayList<String>();

    for(Node node : nodelist) slides.add(node.getValue());

    return slides;
}
于 2012-06-26T22:02:31.837 に答える
0

最後に私はそれを理解しました:

try {

    URL url = new URL("http://www.mydomain.com/my.xml");
    DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
    DocumentBuilder db = dbf.newDocumentBuilder();
    Document doc = db.parse(new InputSource(url.openStream()));
    doc.getDocumentElement().normalize();

    NodeList nodeList = doc.getElementsByTagName("item");

    final List<String> urlList = new ArrayList<String>();

    for (int i = 0; i < nodeList.getLength(); i++) {

    Node node = nodeList.item(i);



    Element fstElmnt = (Element) node;
    NodeList nameList = fstElmnt.getElementsByTagName("urlslide");
    Element nameElement = (Element) nameList.item(0);
    nameList = nameElement.getChildNodes();

    urlList.add(((Node) nameList.item(0)).getNodeValue());


    }


    mTimer=new CountDownTimer(15000, 1000) {

    Object[] myArray = urlList.toArray();
    .........more code


    };//CountDownTimer ENDS
    } catch (Exception e) {
        System.out.println("XML Pasing Exception = " + e);
        }
于 2012-06-30T23:04:05.900 に答える