私はRSSリーダーアプリに取り組んでいます。これまで、Web から xml データを解析し、必要なデータを表示する方法を学びました。Busy Coder's Guide と Derek Banas のチュートリアルを使用してこのトピックを学習し、株価情報リーダーを作成しました。
とにかく、どこかのニュース Web サイトからフィードを読み取るための RSS リーダーを作成したかったのです。問題は (私が理解している限り)、このページから RSS リンクをクリックすると、Web ページが xml 自体をレンダリングすることです (この時点で間違っている場合は修正してください)。そこで、右クリックして「ソースの表示」を使用して、ソースコードからxmlを取得しました
いくつかのコードを編集し、チュートリアルのリンクを試してプログラムが正しく動作することを確認した後、新しいビュー ソース URL を使用しましたが、アプリが動作しなくなりました。
doInBackground の try-catch ブロックを通じて、「java.net.MalformedURLException: Unknown protocol: view=source」という例外が発生します。
では、この例外を処理してパーサーに xml ファイルを読み取らせる方法はありますか? ありがとう、これは CricketActivity からの私のコードです。MainActivity でボタンが押されたときに呼び出されます。
package com.example.try_rssfeed;
public class CricketActivity extends ListActivity {
private static final String TAG = "CRICKET"; // For Logcat
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
Log.d(TAG, "onCreate");
setListAdapter(new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1, new ArrayList<String>()));
final String cricketURL = "view-source:http://timesofindia.feedsportal.com/c/33039/f/533920/index.rss";
ConnectivityManager connMgr = (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE);
NetworkInfo networkInfo = connMgr.getActiveNetworkInfo();
if (networkInfo != null && networkInfo.isConnected()) {
new MyAsyncTask().execute(cricketURL);
} else {
Log.d(TAG, "No network connection available.");
}
}
private class MyAsyncTask extends AsyncTask<String, String, Void> {
@Override
protected Void doInBackground(String... args) {
Log.d(TAG, "In doBackground ");
try {
XmlPullParserFactory factory = XmlPullParserFactory.newInstance();
factory.setNamespaceAware(true);
XmlPullParser xpp = factory.newPullParser();
InputStream streamUrl = loadXmlFromNetwork(args[0]);
Log.d(TAG, "stream " + streamUrl.toString());
xpp.setInput(streamUrl, null);
Log.d(TAG, "After setInput " + xpp.getEventType());
int count = 1; // For Logcat
do {
Log.d(TAG, "in While " + count);
if (xpp.getEventType() == XmlPullParser.START_TAG && xpp.getName().equals("title")) {
xpp.next();
Log.d(TAG, xpp.getEventType() + "____" + count++);
publishProgress(xpp.getText());
}
xpp.next();
} while (xpp.getEventType() != XmlPullParser.END_DOCUMENT);
} catch (Throwable t) {
Log.d(TAG, t.toString()); // <-------------- THIS THROWS EXCEPTION
}
return null;
}
private InputStream loadXmlFromNetwork(String urlString) throws XmlPullParserException, IOException {
Log.d(TAG, "LoadXML");
InputStream stream = null;
try {
Log.d(TAG, "LoadXML Try " + urlString);
URL url = new URL(urlString);
HttpURLConnection conn = (HttpURLConnection) url.openConnection();
conn.setReadTimeout(10000 /* milliseconds */);
conn.setConnectTimeout(15000 /* milliseconds */);
conn.setRequestMethod("GET");
conn.setDoInput(true);
// Starts the query
conn.connect();
stream = conn.getInputStream();
// Log.d(TAG, "stream "+stream.toString());
} finally {
}
return stream;
}
protected void onProgressUpdate(String... values) {
Log.d(TAG, "In ProgressUpdate");
((ArrayAdapter<String>) getListAdapter()).add(values[0]);
}
@Override
protected void onPostExecute(Void result) {
Log.d(TAG, "===================");
Log.d(TAG, "DONE DONE DONE DONE");
}
}
}