Hướng Dẫn Fix Lỗi "android.os.NetworkOnMainThreadException" Trên Android

Nam Nguyễn

Hướng Dẫn Cách Fix Lỗi

Khi sử dụng RssReader trong dựa án Android với đoạn code như sau:

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();

Nhưng khi chạy máy báo về lỗi android.os.NetworkOnMainThreadException.

Hai câu hỏi được đặt ra ở đây là nguyên nhân của lỗi trên là gì và làm thế nào để fix lỗi trên?

Nguyên Nhân Gây Ra Lỗi android.os.NetworkOnMainThreadException

android.os.NetworkOnMainThreadException là một trong những lỗi phổ biến khhi lập trình Andoid và nguyên nhân gay ra lỗi đó là bởi vì chúng ta thực hiện cá tác vụ liên quan tới network trong main thread của ứng dụng.

Cách Fix Lỗi android.os.NetworkOnMainThreadException

Để fix lỗi trên chúng ta sẽ cần thực hiện tác vụ liên quan tới network sử dụng AsyncTask thay vì main thread. Sử dụng AsyncTask thì đoạn code trên sẽ được viết lại như sau:

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;
        }
    }

    protected void onPostExecute(RSSFeed feed) {
        // Code: kiểm tra và xử lý "this.exception:
        // Code ....
    }
}

Ở trên bạn có thể thêm code xử lý lỗi trả về trong method onPostExecute().

Bây giờ để chạy đoạn code trên thì trong tập tin MainActivity.java bạn tìm tới method oncreate() và thêm vào đoạn code sau:

new RetrieveFeedTask().execute(urlToRssFeed);

Một bước quan trọng để hoàn tất việc khắc phục lỗi android.os.NetworkOnMainThreadException đó là bạn cần thêm Internet permision trong tập tin AndroidManifest.xml:

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

Tới đây chúng ta đã kết thúc việc tìm hiểu cách fix lỗi android.os.NetworkOnMainThreadException gặp phải trong dự án Android. Chúc bạn thành công!

Thêm Phản Hồi