كيفية جلب معلومات من ArrayList باستخدام rx java ببرنامج اندرويد ستوديو

 

كيفية جلب معلومات من ArrayList باستخدام rx java ببرنامج اندرويد ستوديو

كيفية جلب معلومات من ArrayList باستخدام rx java ببرنامج اندرويد ستوديو


في هذا المقال سوف نتعرف على بإذن الله تعالى على كيفية جلب بيانات من ArrayList باستخدام ار اكس جافا وهذا المقال يعد من اهم المقالات التي يجب ان تفهمها في rx java فلن تحتاج الى RxJava شرح بعدها اذا ركزت جدا وانا في طبيعة الحال قمت بعمل لكم // قبل كل وظيفة مهمة لكي تفهم كيف يعمل التطبيق وما ستحصل عليه وايضا فوق كل صورة اقدم لكم شرح . 


سوف نحاول ان نقدم لكم RxJava شرح بطريقة بسيطة جدا وايضا سوف نستعملها مع Retrofit لكي تفهم الفكرة بشكل كامل وواضح وهي بسيطة جدا وغير معقدة ولكن تحتاج منك التركيز لانها في نفس الوقت غير سهله وهذا الشرح من سلسلة RxJava android tutorial حيث نسعى ان تقدم افضل محتوى في الوطن العربي والاكواد التي يحتاجها كل مطور تطبيقات اندرويد وتعد Rxjava dependency على توفير كود كبير جدا يحتاج لكتابته المطور لتنفيذ وظيفة وايضا تستخدم بشكل كبير مع Thread وتعد RxJava Android افضل انواع الطرق التي يستعملها اغلب مطوري التطبيقات في الاونه الاخيرة.


اذا لم تكن تعرف RxJava وطريقة استخدامها فهي كما ذكرت لك انها تقوم بتوفير كود كبير وتحسن من performance التطبيق الخاص بك, وفي هذة السلسلة سنقوم بعمل شرح مفصل لـ RxJava بشكل مبسط واذا لم تفهم الفكرة بشكل جيد يمكنك الرجوع الى مقالة Android Introduction To Rom حيث شرحنا لكم كيف تعمل وما تحتاجه ولماذا تستمعل وكثير من الاسالة التي تدور في راسك .


كيفية استعمال rx java لجلب البيانات ؟


اولا لدينا كلاس باسم TaskData يوجد به البيانات التي سوف نعمل عليها في هذا الدرس وفي الدروس القادمة بإذن الله وهو class عادي جدا يحتوي على مجموعة من البيانات كما ترون .



TaskData.class


String title;
    boolean isComplete;
    int priority;

    public TaskData(String title, boolean isComplete, int priority) {
        this.title = title;
        this.isComplete = isComplete;
        this.priority = priority;
    }

    public String getTitle() {
        return title;
    }

    public void setTitle(String title) {
        this.title = title;
    }

    public boolean isComplete() {
        return isComplete;
    }

    public void setComplete(boolean complete) {
        isComplete = complete;
    }

    public int getPriority() {
        return priority;
    }

    public void setPriority(int priority) {
        this.priority = priority;
    }
}


2- قم بعمل methode باسم fromArray وبها array عادية جدا وبعدها Observable<TaskData> تاكد انك تعمل على rx java وبعدها الكلاس الذي يحتوي على البيانات وخذ منة object وبعدها = Observable.fromArray لانك ستعمل على array وادخل له object الخاص بالاري التي قمنا بإنشائها فوق , بعدها تاتي مرحلة operator التي اخبرناكم بها في المقال السابق وهي باسم filter وتعمل نفس وظيفة if وهي تقوم بفلترة البيانات.


 وهنا اخبرته ان البيانات التي اريدها اريد ان تكون priority اكبر من 3 او يساوية بعدها سوف نقوم بعمل اشتراك في subscribeOn وبداخلة Schedulers.io بالنسبة لي io لاننا نستخدم عمليات بسيطة او بمعنى اننا نستخدم بيانات قليلة اذا كانت بيانات كبيرة سنستعمل computation وبعدها observeOn وسيعمل على AndroidSchedulers.mainThread() بعدها taskDataObservable.subscribe بمعنى تاخذ اوبجكت من اسم Observable وتجعله يشترك في Observer وسيخرج لك 4 حالات وفوق كل حالة ذكرت لكم الوظيفة الخاصة بها .


كيفية استعمال rx java لجلب البيانات ؟

الكود الموجود بالصورة


private void fromArray() {

        // طباعة معلومات من array عادية
        TaskData[] arr = new TaskData[5];
        arr[0] = (new TaskData("geecoders", true, 2));
        arr[1] = (new TaskData("the web developer", false, 5));
        arr[2] = (new TaskData("the android developer", false, 1));
        arr[3] = (new TaskData("let's go to learn new programing language", true, 3));
        arr[4] = (new TaskData("geocoders is the best website to learn programing language by simple", false, 4));

        Observable<TaskData> taskDataObservable = Observable.fromArray(arr)
                .filter(new Predicate<TaskData>() {
                    @Override
                    public boolean test(TaskData taskData) throws Throwable {
                        if (taskData.priority >= 3) {
                            return true;
                        }
                        return false;
                    }
                })
                .subscribeOn(Schedulers.io())
                .observeOn(AndroidSchedulers.mainThread());
        taskDataObservable.subscribe(new Observer<TaskData>() {

            // يعمل اول مره فقط عندما يتم تشغيل الوظيفة
            @Override
            public void onSubscribe(@NonNull Disposable d) {
            }

            //يحدث اثناء تشغيل الوظيفة
            @Override
            public void onNext(@NonNull TaskData taskData) {
                Log.i(TAG, "onNext: " + taskData.getTitle());
            }

            // يحدث عندما يوجد مشكلة او ايرور
            @Override
            public void onError(@NonNull Throwable e) {
            }

            // يحدق عندما تكتمل الوظيفة وتنتهي
            @Override
            public void onComplete() {
            }
        });
    }
    


الان نريد عمل كلاس جديد يحتوي على ArrayList او List وبه قائمة تحتوي على مجموعة من البيانات تذكر ان تستعمل public static لكي تكون ظاهرة للكلاس الاخر او بمعنى تكون ظاهره على مستوى الproject لجميع classes .


tutorial rx java

ArrayActivity.class


 public static ArrayList<TaskData> array() {
        ArrayList<TaskData> tasks = new ArrayList<>();
        tasks.add(new TaskData("geecoders",true,2));
        tasks.add(new TaskData("the web developer",false,5));
        tasks.add(new TaskData("the android developer",false,1));
        tasks.add(new TaskData("let's go to learn new programing language",true,3));
       tasks.add(new TaskData("geecoders is the best website to learn programing language by simple",false,4));
        return tasks;
    }
    


الان الى الكلاس الذي نعمل عليه وهو MainActivity وسنقوم بعمل methode جديد باسم getData_with_filter وسنعمل مثل ما فعلنا في الكود السابق ولكن .fromIterable(ArrayActivity.array()) وايضا الفلترة هنا سوف تكون على الاسماء التي تبدء بكلمة gee وسوف تشاهد ظهور highlight على if لذلك انقر على alt + enter لكي تجعله في سطر واحد


rx java ببرنامج اندرويد ستوديو


getData_with_filter methode


 private void getData_with_filter() {

        // طباعة معلومات من داخل ArrayList في كلاس اخر

        Observable<TaskData> taskDataObservable = Observable.fromIterable(ArrayActivity.array())
                .subscribeOn(Schedulers.io())
                .filter(new Predicate<TaskData>() {
                    @Override
                    public boolean test(TaskData taskData) throws Throwable {
                        // اذا اردت معرفة الاسماءالتي تبدء بكلمة gee
                        if(taskData.getTitle().contains("gee")) {
                            return true;
                        }
                        return false;
                    }
                })
                .observeOn(AndroidSchedulers.mainThread());
        taskDataObservable.subscribe(new Observer<TaskData>() {
            @Override
            public void onSubscribe(@NonNull Disposable d) {
            }
            @Override
            public void onNext(@NonNull TaskData taskData) {
                Log.i(TAG, "onNext: " + taskData.getTitle());
            }

            @Override
            public void onError(@NonNull Throwable e) {
            }
            @Override
            public void onComplete() {
            }
        });
    }


بدل من عمل if واذا كانت النتيجه صحيحة ارجعها واذا خطا لا ترجعها يمكنك عملها في سطر واحد كما يظهر بالصورة التالية وايضا الصوره تحتوي على النتيجة النهائية .


شرح java rx android studio

بعض الحالات التي يمكنك عملها في if للاختبار 


شرح جافا ار اكس اندرويد ستوديو

لمزيد من الاكواد حول RxJava بالعربي يمكنك متابعة احد المقالات التالية التي قدمنا فيها RxJava شرح وهي ايضا Reactive Programming شرح يمكنك متابعة القسم المختص لفهم المزيد من برمجة وتطوير تطبيقات الاندرويد



تعليقات