1

私はいつも助けを求めることはありません.私はいつも自分の研究を行い、自分で解決策を見つけようとしています. ..だから、私がやろうとしているのは、動的レイアウトを持ち、特定のホスト上の XML ファイルからロードするアプリケーションです。私の最初の問題は明らかに、メイン スレッドから XML を読み取ることができないことです。そのため、スレッドと Asynctaks について学ぶ必要がありました。単純なスレッドを使用して、作成したいくつかのグローバル変数に値を格納することにしました。 、しかしうまくいきません... XMLパーサーにSAXも使用しようとしましたが、DOMの方が好きです。私はこれを3日以上やろうとしています.これに少し腹を立てています.誰かが私を助けてくれることを願っています.ここに私のコードがあります.

これは、変数を定義するクラスです。それらはすべて、スレッドで使用するために XML の URL を格納する XML を除いて、複数の値を処理することになっています。

public class Info {
        public static String Param1[];
        public static String Param2[];
        public static String Param3[];
        public static String Param4[];
        public static String Param5[];
        public static String Param6[];
        public static String XML;
}

そして、ここに私のメインスレッドがあります:

//Create the basic layout
ScrollView sv = new ScrollView(this);
    LinearLayout ll = new LinearLayout(this);
    ll.setOrientation(LinearLayout.VERTICAL);
    sv.addView(ll);
Info.XML="mylink";
Thread thread = new Thread()
{
    @Override
    public void run() {
        try {
            URL url = new URL(Info.XML);
            DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
            DocumentBuilder db = dbf.newDocumentBuilder();
            Document doc = db.parse(new InputSource(url.openStream()));
            doc.getDocumentElement().normalize();
            NodeList ActionContainers = doc.getElementsByTagName("ActionContainer");
            Node mainContainer = ActionContainers.item(0);
            Element Container = (Element) mainContainer;
            NodeList Actions = Container.getElementsByTagName("Action");
            for (int i = 0; i < Actions.getLength(); i++) {
                Node mainAction = Actions.item(i);
                Element Action = (Element) mainAction;
                Info.Param1[i]=Action.getAttribute("Param1");
                Info.Param2[i]=Action.getAttribute("Param2");
                Info.Param3[i]=Action.getAttribute("Param3");
                Info.Param4[i]=Action.getAttribute("Param4");
                Info.Param5[i]=Action.getAttribute("Param5");
                Info.Param6[i]=Action.getAttribute("Param6");
            }
        } catch (Exception e) {
            Info.XML="Erro";
        }
    }
};
try{
    thread.start();
} catch(Exception e){
    Info.XML="Erro";
}

    EditText et = new EditText(this);
        et.setText(Info.XML);
        ll.addView(et);
        setContentView(sv);

例外は検出されません。単純に xml 情報が返されません。誰かがここで少し助けてくれることを願っています。

ありがとう

編集:

XML は次のとおりです。

<appname Version="yyy" WrittenOn="yyy">
<Config>
    <Page Id="yyy">
        <ActionContainer Id="yyy">
            <Action Param1="xxx" Param2="xxx" Param3="xxx" Param4="xxx" Param5="xxx" Param6="xxx"></Action>
            <Action Param1="xxx" Param2="xxx" Param3="xxx" Param4="xxx" Param5="xxx" Param6="xxx"></Action>
            <Action Param1="xxx" Param2="xxx" Param3="xxx" Param4="xxx" Param5="xxx" Param6="xxx"></Action>
            <Action Param1="xxx" Param2="xxx" Param3="xxx" Param4="xxx" Param5="xxx" Param6="xxx"></Action>
            ...
        </ActionContainer>
    </Page>
</Config>

すべての xxx が必要です。可能であれば、それらを複数の配列に配置したいと考えています。

4

2 に答える 2

0

代わりにThreadを使用してみてくださいAsyncTask。ここを参照してください:

スレッドに関する公式のAndroidページは非常に優れてい ますhttp://developer.android.com/resources/articles/painless-threading.html

http://developer.android.com/reference/android/os/AsyncTask.html

これも非常によく説明されています http://labs.makemachine.net/2010/05/android-asynctask-example/

XML解析に関して、私のアプリはHTTPリクエストから取得した多くのXMLに依存しており、SAXパーサーは非常に優れていて使いやすいと思います。

SAXの例については、作成してから長い時間が経ちましたが、ブックマークにこの例が役立つことを願っています。SAXパーツを読むだけです http://www.ibm.com/developerworks/xml/library/x-android/

それが役立つことを願っています

于 2012-06-01T03:45:59.813 に答える
0

まだいくつかのコードが不足していると思いますが、混乱しないように、間違っている可能性のあるいくつかの点を次に示します。

  • 「ErrNo」を無視して、スレッドが完了する前にet.setText(Info.XML);実行される可能性があるため、実際には例外を取得しない場合があります。これに関する私のメモ:
    • XML ファイルへの URL が間違っている可能性があります (リモート ドキュメントの場合はINTERNET、アプリで権限を取得する必要があることに注意してください)。
    • 投稿した XML が無効です:<appname>が閉じられていないか、ルート要素がありません。
    • Info.ParamXどこにも配列を初期化していないようです。その結果NullPointerException
    • それらを初期化しても、のサイズを考慮していないため、または同様Actions.getLength()の結果になる可能性があります。ArrayIndexOutOfBoundsExceptionつまり、ループInfo.ParamX = new String[Actions.getLength()];の前に含めます。for
    • それ以外は、解析コードは正常に機能しているようです。コードを適切にデバッグするには、 ADTでDebug オプションを使用するかSystem.out.println()、 catch 句で例外を出力して LogCat で調べます
  • このコードはどこにありますか? onCreate()アクティビティに含まれていない場合は、そこに配置します。

また、いくつかの小さな問題:

  • Java フィールドと変数にcamelBack表記を使用してみてください。これにより、Java プログラマーにとってコードが読みやすくなります。
  • を使い捨てアプリに使用するThreadことは問題ありませんが、一般的には使用を避ける必要がAsyncTaskあります。

PS。ではParamXXもちろん、1 から 6 までのすべての整数です。

于 2012-06-01T00:40:13.250 に答える