اذهب إلى المحتوى

السؤال

نشر

لدي تطبيق يقوم بعرض RSS Feed من موقع معين، يظهر لي الخطأ التالي عند تشغيل التطبيق:

android.os.NetworkOnMainThreadException

هذا هو الكود التي تحصل فيه المشكلة:

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

 

Recommended Posts

  • 0
نشر

مشكلة تتعلق بالاتصال بالانترنت من MainThread  (هي مسلك مسؤول عن الواجهة الرسومية ولا يجب الاعتماد عليه بتنفيذ أي شيى آخر ليكون الأداء جيد ولا يحدث توقف في عمل البرنامج)

أولا يجب التأكد من إعطاء سماحية الوصول للانترنت في AndroidMainfest:

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

وضمن MainActivity.java يجب إضافة التالي للدالة OnCreate : ليتم تنفيذ المهمة التي سوف نكتبها الحقا:

new RetrieveFeedTask().execute(urlToRssFeed);

سنقوم بتنفيذ المهمة في مسلك منفضل / سوف نعمل على التوازي/ كالتالي:

حيث قمنا بتعريف RetrieveFeedTask كـ 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
    }
}

في Android الإصدار API 30 تم التخلي عن AsyncTask فعلينا عندها استخدام تعريف المسلك Threads كالتلي:

Thread thread = new Thread(new Runnable() {

    @Override
    public void run() {
        try  {


            //Your code goes here //  هنا نكتب الدالة السابقة


        } catch (Exception e) {
            e.printStackTrace();
        }
    }
});

thread.start(); 

 

انضم إلى النقاش

يمكنك أن تنشر الآن وتسجل لاحقًا. إذا كان لديك حساب، فسجل الدخول الآن لتنشر باسم حسابك.

زائر
أجب على هذا السؤال...

×   لقد أضفت محتوى بخط أو تنسيق مختلف.   Restore formatting

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   جرى استعادة المحتوى السابق..   امسح المحرر

×   You cannot paste images directly. Upload or insert images from URL.

  • إعلانات

  • تابعنا على



×
×
  • أضف...