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

Bài Viết Liên Quan

  • IDE Là Gì

    IDE viết tắt của cụm từ Integrated Development Environment là phần mềm cung cấp cho các lập trình vi...
  • Hello World với Java

    Java là ngôn ngữ lập trình hướng đối tượng được phát triển bởi công ty Oracle. Java là một trong nhữ...

  • Nên chọn học .NET, PHP hay Java

    Với rất nhiều lập trình viên mới bắt đầu vào nghề hay ngay cả với các lập trình viên đã có một vài n...