「android.os.NetworkOnMainThreadException」を修正するにはどうすればいいですか? 質問する

「android.os.NetworkOnMainThreadException」を修正するにはどうすればいいですか? 質問する

RssReader 用の Android プロジェクトを実行中にエラーが発生しました。

コード:

URL url = new URL(urlToRssFeed);
SAXParserFactory factory = SAXParserFactory.newInstance();
SAXParser parser = factory.newSAXParser();
XMLReader xmlreader = parser.getXMLReader();
RssHandler theRSSHandler = new RssHandler();
xmlreader.setContentHandler(theRSSHandler);
InputSource is = new InputSource(url.openStream());
xmlreader.parse(is);
return theRSSHandler.getFeed();

そして、以下のエラーが表示されます:

android.os.NetworkOnMainThreadException

この問題を解決するにはどうすればいいでしょうか?

ベストアンサー1

注意: AsyncTask は API レベル 30 で非推奨になりました。
AsyncTask | Android 開発者

この例外は、アプリケーションがメインスレッドでネットワーク操作を実行しようとしたときにスローされます。コードを実行するには、AsyncTask:

class RetrieveFeedTask extends AsyncTask<String, Void, RSSFeed> {

    private Exception exception;

    protected RSSFeed doInBackground(String... urls) {
        try {
            URL url = new URL(urls[0]);
            SAXParserFactory factory = SAXParserFactory.newInstance();
            SAXParser parser = factory.newSAXParser();
            XMLReader xmlreader = parser.getXMLReader();
            RssHandler theRSSHandler = new RssHandler();
            xmlreader.setContentHandler(theRSSHandler);
            InputSource is = new InputSource(url.openStream());
            xmlreader.parse(is);

            return theRSSHandler.getFeed();
        } catch (Exception e) {
            this.exception = e;

            return null;
        } finally {
            is.close();
        }
    }

    protected void onPostExecute(RSSFeed feed) {
        // TODO: check this.exception
        // TODO: do something with the feed
    }
}

タスクの実行方法:

ファイル内でメソッドMainActivity.java内にこの行を追加できますoncreate()

new RetrieveFeedTask().execute(urlToRssFeed);

AndroidManifest.xmlこれをファイルに追加することを忘れないでください:

<uses-permission android:name="android.permission.INTERNET"/>

おすすめ記事