android.os.NetworkOnMainThreadException nasıl düzeltilir?

android.os.NetworkOnMainThreadException nasıl düzeltilir?

Android ortamında uygulama geliştiriyorsunuz ve projenizi RssReader için çalıştırırken bir aşağıdaki gibi bir hata mesajı alıyorsanız:

android.os.NetworkOnMainThreadException

Bir uygulama, ana iş parçacığı üzerinde bir ağ işlemi gerçekleştirmeye çalıştığında bu istisna atılır.
Örneğin aşağıdaki gibi bir kod parçacığı yukarıdaki hatayı bize döndürür.

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

Kodumuzu aşağıdaki örnekteki gibi AsyncTask’da çalıştırırsak hatanın önüne geçmiş oluruz.
Android uygulamalarında uzun sürecek işlemlerin arka planda yapılmasının sebebi Main Thread’in uzun süre engellenmemesidir. Ana akışı uzun süre bloke ederseniz uygulamanızın ana ekranı donacak ve kullanıcı uygulamanızın bozulduğunu düşünecektir. Android bize AsyncTask adındaki sınıf içinde yer alan metodlar yardımıyla arka planda farklı bir Thread üzerinde gerçekleştirilen işlemin kolayca ön yüzü etkileyen Main Thread entegre edilmesini sağlar. Bu nedenle yukarıdaki hatanın önüne geçmek için AsyncTask sınıfı kullanılmalıdır.

public class BackgroundTask extends AsyncTask<Void, Void, Void> { }

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 dosyasına aşağıdaki satırı oncreate() metodunuza eklemelisiniz;

new RetrieveFeedTask().execute(urlToRssFeed);
Bunu AndroidManifest.xml dosyasına eklemeyi unutmayın. Aşağıdaki kod ile ekleyebilirsiniz:
<uses-permission android:name="android.permission.INTERNET"/>
Share

Bir yanıt yazın

E-posta adresiniz yayınlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir