كيفية التعامل مع RSS Feed في Android Studio

Rami Shalahمنذ 7 سنوات

السلام عليكم و رحمة الله و بركاته.


في هذه المقالة سنتعلم كيفية التعامل مع RSS Feed عن طريق تحميلها و قرائتها بالإضافة الى استخراجها في الـAndroid  Studio.

في البداية، ما هي RSS ؟

خدمة RSS هي خدمة لمتابعة آخر الأخبار بشكل مباشر وبدون الحاجة إلى زيارة الموقع ، ستقدم لك خدمة RSS  الكثير من المعلومات منها: عنوان الخبر ، ومختصر لنص الخبر ، ووصلة أو رابط لنص الخبر الكامل على الموقع ، و صورة عن الخبر، بالإضافة إلى عدد التعليقات الموجودة ... الخ.

و الآن ننتقل الى التطبيق في الـ Android Studio...

في البداية نقوم بفتح Android Studio ثم نقوم بالضغط على Start a new Android Studio project و نبقي الخيارات الافتراضية على حالها و نقوم بتسميته و حفظه.

 

و الآن حتى يتم تحميل XML file  يجب علينا:

  • انشاء thread منفصل و لحسن الحظ يتوفر على الـ Android Studio كلاس يسمى بالـ AsyncTask يقوم باغلب المهام.
  • نقوم بانشاء Inner class  في MainActivity.java و الذي بدوره يقوم بـ AsyncTask class" extends"، ثم نضيف الmethods وهي onPostExecute ،doInBackground كما هو موضح ادناه:

 


public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
    }


    private class DownloadData extends AsyncTask<String, Void, String> {
        private static final String TAG = "DownloadData";
        @Override
        protected void onPostExecute(String s) {
            super.onPostExecute(s);

        }
        @Override
        protected String doInBackground(String... params) {
            return null;
        }

 

الآن نقوم بانشاء method في داخل DownloadData كلاس ونسميها على سبيل المثال downloadXML و التي بدورها سوف تقوم بتحميل ملف XML  كاملا حيث سيتم استدعاء هذه الـmethod في doInBackround


 @Override
        protected String doInBackground(String... params) {
            String rssFeed = downloadXML(params[0]);
            if (rssFeed == null) {
                Log.e(TAG, "doInBackground: Error downloading");
            }
            return rssFeed;
        }
        private String downloadXML(String urlPath) {

            StringBuilder XMLResult = new StringBuilder();

            try {
                URL url = new URL(urlPath);
                HttpURLConnection connection = (HttpURLConnection) url.openConnection();
                int response = connection.getResponseCode();
                BufferedReader reader = new BufferedReader(new InputStreamReader(connection.getInputStream()));

                int charRead;
                char[] inputBuffer = new char[500];

                while (true) {
                    charRead = reader.read(inputBuffer);
                    if (charRead < 0) {
                        break;
                    }
                    if (charRead > 0) {
                        XMLResult.append(String.copyValueOf(inputBuffer, 0, charRead));
                    }
                }
                reader.close();

                return XMLResult.toString();

            } catch (MalformedURLException e) {
                Log.e(TAG, "downloadXML: Invalid URL " + e.getMessage());
            } catch (IOException e) {
                Log.e(TAG, "downloadXML: IO Exception reading Data: " + e.getMessage());
            } catch (SecurityException e) {
                Log.e(TAG, "downloadXML: Permesion denied. " + e.getMessage());
            }
            return null;
        }

 

كم هو موضح أعلاه الـ downloadXML تتلقى parameter و الذي هو عبارة عن URL لملف XML. 

ملاحظة: سوف يتم استخدام RSS Feed  الموجودة في apple.com  و المتعلقة Top10FreeApps.

و لقد قمنا بعمل التالي:

  • انشاء StringBuilder object حتى يتم الحاق كامل ملف XML بهذا object.
  • انشاء الإتصال بالإنترنت.
  • قراءة كامل ملف XML  عن طريق BufferReader و يمكن أن تتساءل ما الفائدة من المتغير response؟ عن طريقه يمكن معرفة نجاح الاتصال بالانترنت او فشله. حيث انه اذا ظهر لك المتغير response  بقيمة 200 هذا يعني نجاح الاتصال، غير ذلك يعني فشله.
  • قراءة عدد الأحرف الموجودة في ملف XML كما هو موضح أعلاه و إلحاقها بالمتغير XMLResult  حيث أن الـloop سوف تنتهى عند انتهاء ملف XML.
  • أحطنا الـ code بـ try and catch حتى نتعامل مع الأخطاء المحتملة منها: فقدان الاتصال بالانترنت، او خطأ في عنوان الرابط.. الخ.
  • بالنهاية اذا حصل خطأ نقوم بـreturn null.

 

قبل أن نبدأ باستخراج المعلومات أود أن نلقي نظرة عن ماهية ملف XML المتعلق ب Top10FreeApp. باستخدام موقع code beautify يمكننا أن نرى التكوين الداخلي لملف XML.
Entry.png

كما نلاحظ أعلاه، ال Entry TAG يحتوي على  name TAG ,summary TAG , artist TAG و التي تمثل بعضا من المعلومات الممكن استخراجها.

ننتقل الآن الى كيفية استخراج المعلومات المطلوبة من ملف XML.

في البداية يجب علينا عمل التالي:

  • انشاء كلاس يحتوي على fields و التي سوف تخزن بها المعلومات المطلوبة من ملف XML.
  • ننشئ كلاس ونسميه FeedEntry و الذي يحتوي على متغيرات: name, Artist, Summary.
  • إضافة getters and setters  لهذه المتغيرات.

 


public class FeedEntry {
    private String name;
    private String artist;
    private String summary;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getArtist() {
        return artist;
    }

    public void setArtist(String artist) {
        this.artist = artist;
    }

    public String getSummary() {
        return summary;
    }

    public void setSummary(String summary) {
        this.summary = summary;
    }
}

 

ثم ننشئ كلاس آخر و نسميه على سبيل المثال PareseApplication و الذي بدوره سوف يحتوي على method التي تقوم بقراءة و استخراج المعلومات المطلوبة من XML file  و تخزينها في array  تحتوي على objects  من الكلاس FeedEntry.


public class ParseApplications {
    private ArrayList<FeedEntry> applications;

    public ParseApplications() {
        this.applications = new ArrayList<>();
    }

    public ArrayList<FeedEntry> getApplications() {
        return applications;
    }

    public boolean parse(String xmlData) {
        boolean status = true;
        FeedEntry currentRecord = null;
        boolean inEntry = false;
        String textValue = "";
        try {
            XmlPullParserFactory factory = XmlPullParserFactory.newInstance();
            factory.setNamespaceAware(true);
            XmlPullParser xpp = factory.newPullParser();
            xpp.setInput(new StringReader(xmlData));
            int eventType = xpp.getEventType();

            while (eventType != XmlPullParser.END_DOCUMENT) {
                String tagName = xpp.getName();
                switch (eventType) {
                    case XmlPullParser.START_TAG:
                        if ("entry".equalsIgnoreCase(tagName)) {
                            inEntry = true;
                            currentRecord = new FeedEntry();
                        }
                        break;
                    case XmlPullParser.TEXT:
                        textValue = xpp.getText();
                        break;
                    case XmlPullParser.END_TAG:
                        if (inEntry) {
                            if ("entry".equalsIgnoreCase(tagName)) {
                                applications.add(currentRecord);
                                inEntry = false;
                            } else if ("name".equalsIgnoreCase(tagName)) {
                                currentRecord.setName(textValue);
                            } else if ("artist".equalsIgnoreCase(tagName)) {
                                currentRecord.setArtist(textValue);
                            }else if ("summary".equalsIgnoreCase(tagName)) {
                                currentRecord.setSummary(textValue);
                            }
                        }
                        break;
                    default:
                        //Nothing else to do.
                }
                eventType = xpp.next();
            }
        } catch (Exception e) {
            status = false;
            e.printStackTrace();
        }
        return status;
    }
}

 

لقد قمنا بعمل التالي: 

  • اضافة متغير  applications من نوع ArrayList و الذي سوف يتم تخزين فيه objects من نوع FeedEntry.
  • اضافة Constructor  لانشاء object من هذا الكلاس و احتوائه على Getter للوصول الى المتغير applications.
  • انشاء method  و نسميها parse  و التي بدورها سوف تستخرج المعلومات المطلوبة من ملف XML المحمل كما هو موضح أعلاه.

هذه الـmethod  تحتوي على اربع متغيرات:

  1. متغير Status من نوع boolean و الذي يدل على نجاح الـmethod  او فشلها.
  2. و متغير currentRecord  من نوع FeedEntry و الذي سوف يتم تخزين المعلومات المطلوبة فيه.
  3. و متغير InEntry  من نوع boolean الذي سوف يعطينا إشارة بوصولنا الى Entry TAG.
  4. بالإضافة الى متغير textValue من نوع String الذي سوف يقوم بتخزين النص الموجود في الـTAG.

 

ملاحظة: لحسن الحظ  Android Studio توفر لنا كلاس اسمه XmlPullParserFactory  و الذي بدوره سوف يقوم بكثير من مهام معالجة ملف XML. هذا الكلاس يعتمد على قيم ثوابت(Constatns) معرفة في الكلاس و التي تسمى بالـevents.
بعض الأمثلة عليها: END_DOCUMENT, START_TAG, TEXTEND_TAG.

 

  • انشاء اوبجكت من XmlPullParserFactory ثم نمرر إليه محتويات الـXML  كـparameter.
  • نقوم باستخراج المعلومات المطلوبة من ملف XML و تخزينها في currentRecord ثم اضافة هذا object الى applications.
  • احاطة الكود بـ try and catch لتلافي الأخطاء التي من الممكن وقوعها أثناء استخراج المعلومات.
  • و بالنهاية لا ننسى الخطوة المهمة و التي لا يكتمل التطبيق إلا بها و هي أخذ الإذن للإتصال بالإنترنت. حيث تتم هذه العملية بإضافة السطر البرمجي الموضح أدناه في ملف AndroidManifest.xml المتواجد في مجلد Manifests.

 


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

 

و هنا وصلنا الى نهاية هذا الدرس.?
في الدروس القادمة سوف أتناول كيفية عرض المعلومات المستخرجة باستخدام ListViews.

كلمات دليلية:
2
إعجاب
4360
مشاهدات
1
مشاركة
2
متابع
متميز
محتوى رهيب

التعليقات (2)

moahmed:

ممكن لينك المقال التالى المكمل

Seif Eddine:

ممكن لينك المقال التالى المكمل....

لايوجد لديك حساب في عالم البرمجة؟

تحب تنضم لعالم البرمجة؟ وتنشئ عالمك الخاص، تنشر المقالات، الدورات، تشارك المبرمجين وتساعد الآخرين، اشترك الآن بخطوات يسيرة !