5

奇妙な問題があります。強制終了の原因となる次のエラーが発生します。

org.apache.harmony.xml.ExpatParser $ ParseException:1行目0列目:org.apache.harmony.xmlのorg.apache.harmony.xml.ExpatParser.parseFragment(ExpatParser.java:508)に要素が見つかりません。 ExpatParser.parseDocument(ExpatParser.java:467)at org.apache.harmony.xml.ExpatReader.parse(ExpatReader.java:329)at org.apache.harmony.xml.ExpatReader.parse(ExpatReader.java:286)

[強制終了]ボタンをクリックすると、アクティビティが再作成され、問題なく解析が完了します。AsyncTaskのdoInBackground内で次のコードスニペットを使用しています。

URL serverAddress = new URL(url[0]);

HttpURLConnection connection = (HttpURLConnection) serverAddress.openConnection();
connection.setRequestMethod("GET");
connection.setDoOutput(true);
connection.setReadTimeout(10000);
connection.connect();

InputStream stream = connection.getInputStream();

SAXParserFactory spf = SAXParserFactory.newInstance();
SAXParser sp = spf.newSAXParser();

XMLReader xr = sp.getXMLReader();

xr.parse(new InputSource(stream));  // The line that throws the exception

アクティビティが強制終了され、直後に問題なく実行されるのはなぜですか?BufferedInputStreamは何か違いがありますか?私は困惑しています。:(

みなさん、ありがとうございました。

更新:HttpURLConnection.getResponseCode()が頻繁に-1を返すことが判明したため、InputStreamが正しく設定されていない可能性があります。

4

6 に答える 6

6
HTTPURLConnection connection = (HttpURLConnection) serverAddress.openConnection();
connection.setRequestMethod("GET");
connection.setDoOutput(true);

それらの線は少し奇妙です。それHTTPURLConnectionですかHttpURLConnection?デフォルトのリクエストメソッドはすでにGETです。ただし、setDoOutput(true)は強制的にPOST

これらの行をすべて次のように置き換えます

URLConnection connection = serverAddress.openConnection();

そして再試行してください。POST強制的に出力(リクエスト本文)に何も書き込まなかったために、エラーが返される場合があります。ちなみに、これconnection.connect()はすでに暗黙的にによって呼び出されてconnection.getInputStream()いるため、行も不要です。

更新:テスト目的で以下は機能しますか?

BufferedReader reader = new BufferedReader(new InputStreamReader(stream, "UTF-8"));
for (String line; (line = reader.readLine()) != null;) {
    System.out.println(line);
}
reader.close();
于 2010-04-26T19:13:31.153 に答える
2

これを修正したかどうかはわかりませんが、同じ問題が発生しました。それは奇妙で、エミュレーターでは問題なく動作しましたが、電話では常にxr.parse()エラーが発生していました。印刷した場合でもInputStream、xmlドキュメントの正当な出力が得られます。問題はInputSourceオブジェクトの作成にあるようでした

InputStreamこれが私がそれを修正した方法です:あなたを作成するために使用する代わりに、InputSource私はURL文字列から直接入力ソースを作成しました。

InputSource a =  new InputSource(url_string);   

ここで、url_stringは、URLを含む単なる文字列です。なぜそれが機能するのか私に聞かないでください...タイムアウトなどをチェックする方法がないので、私はそれが本当に好きではありません。しかし、それは機能します、それがどうなるか教えてください!

于 2010-04-27T17:48:14.510 に答える
1

javadocごとInputStreamに、メソッドはデータが利用可能になるかEOFが検出されるまでブロックします。したがって、Socketの反対側はそれを閉じる必要があります-そうすると、inStream.read()呼び出しが返されます。

を使用するBufferedReaderと、行ごとに読み取ることができます。このreadLine()メソッドは、HTTP応答からの行が読み取られるとすぐに戻ります。

于 2010-04-26T19:07:53.413 に答える
1

関連するデザインノートでは、URLのコンテンツをロードしても、アクティビティを強制的に閉じることはできません。これをすべてAsyncTask実装に入れて、GUIスレッドに戻った後でレポートまたは再試行することをお勧めします。

于 2010-04-26T20:06:15.760 に答える
1

私も同じ問題に直面しました。私は最初にその内容を印刷するためInputStreamにinを使用していました。Scannerそして、それをXMLパーサーに渡そうとします。

Scanner問題は、オブジェクトを閉じていなかったことです。そしてInputstream、パーサーで使用します。

スキャナーオブジェクトを閉じた後、私はこの問題に取り組むことができました。

于 2016-12-08T06:01:27.340 に答える
0

私は同じ問題に遭遇し、InputSourceから直接解析していたため、それを理解できませんでした。xmlが解析される前に結果を文字列にプルするようにコードを変更したところ、問題は単にスペルミスのあるWebサービスのメソッド名であり、そのサービスによって報告されたエラーメッセージがキラーであることがわかりました。

于 2010-09-17T18:12:47.113 に答える