تحميل بيانات الـJSON في الـAndroid Studio

Rami Shalahمنذ 6 سنوات

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

في هذه المقالة سنتعلم كيفية تحميل الـJSON في الـAndroid  Studio.

في البداية، ما هو الـJSON ؟

JSON هو عبارة عن كائن JavaScript حيث يتم تمثيل البيانات و المصفوفات من خلالها. عندما تتخاطب المنصات أو البرمجيات أو الأنظمة مع بعضها البعض
فهي تتبادل البيانات بهذا الشكل. تخيل لو كنت تود ارسال قائمة ببيانات الموظفين المحالين للتقاعد إلى جهة أخرى فحينها سترسلها مرتبة ومصاغة بهذا الشكل.


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

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

و الآن حتى يتم تحميل الــJSON  يجب علينا:

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

/**
 * Created by Rami on 4/20/2017.
 */

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

        }
        @Override
        protected String doInBackground(String... params) {
            return null;
        }
}
ملاحظة: الكلاس AsyncTask يحتوي على عدة functions مهمة يجب عمل implements لهما و منها: onPreExcute, doInBackground, onPostExcute.

 

  • onPreExcute: يتم استدعاؤها في الـUI thread قبل استدعاء الميثود doInBackground بحيث يتم من خلالها عمل مهمة معينة مثل اظهار الـprogress bar في الـinterface.
  • doInBackground: يتم اسدعاؤها في thread منفصل (background thread) بحيث يتم من خلالها تحميل جميع بيانات الـJSON و بالنهاية يتم عمل pass للبيانات المحملة للميثود onPostExcute.
  • onPostExcute: يتم اسدعاؤها تلقائيا في UI thread بعد الانتهاء من تحميل البيانات بحيث يتم من خلالها اشعار الـcaller بانتهاء التحميل.
     

و لكن للتبسيط سوف نستخدم في هذا الدرس الميثود doInBackground و الميثود onPostExcute.

 

الآن نقوم بانشاء interface في داخل GetRawData كلاس ونسميها على سبيل المثال OnDownloadComplete و التي بدورها سوف تحتوي على ميثود الـonDownloadComplete و التي  تقوم بإشعار الكلاس المستعدي (caller) بانتهاء تحميل البيانات.


/**
 * Created by Rami on 4/20/2017.
 */

public class GetRawData extends AsyncTask<String, Void, String> {
  		private static final String TAG = "GetRawData";
  	 	private final OnDownloadComplete mCallback;

    	interface OnDownloadComplete{
        	void onDownloadComplete(String data);
    	}

    	public GetRawData(OnDownloadComplete callback) {
        	this.mCallback = callback;
    	}		
  
        private static final String TAG = "DownloadData";
        @Override
        protected void onPostExecute(String s) {
            super.onPostExecute(s);

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

كما هو موضح أعلاه الـ GetRawData تتلقى parameter و الذي هو عبارة عن اوبجكت يسمى بالـcallback و الذي يعتبر كـreference للكلاس المستدعي(caller) حيث أن الكلاس المستعدي يعمل على implements الـinterface والمسمى OnDownloadComplete.

 

ملاحظة: بهذه الطريقة يتم فصل كلاس GetRawData عن بقية الكلاسات و الذي بدوره يعزز الـreusability و يتم اشعار الكلاس المستعدي عند انتهاء تحميل البيانات دون ايقاف أي عملية أخرى.

 

الآن نقوم بإضافة الكود في داخل الـميثود doInBackground و التي بدورها سوف تكون المسؤولة عن تحميل بيانات الـJSON.


	@Override
    protected String doInBackground(String... params) {
        HttpURLConnection connection = null;
        BufferedReader reader = null;

        if(params == null){
            return null;
        }

        try{
            URL url = new URL(params[0]);
            connection = (HttpURLConnection) url.openConnection();
            connection.setRequestMethod("GET");
            connection.connect();
            int response = connection.getResponseCode();
            Log.d(TAG, "doInBackground: The response code is: " + response);


            StringBuilder result = new StringBuilder();

            reader = new BufferedReader(new InputStreamReader(connection.getInputStream()));

            String line;

            while(null != (line = reader.readLine())){
                result.append(line).append('\n');
            }

            return result.toString();

        }catch (MalformedInputException e){
            Log.e(TAG, "doInBackground: Invalid URL" + e.getMessage());
        }catch (IOException e){
            Log.e(TAG, "doInBackground: IO Exception reading data" + e.getMessage());
        }catch (SecurityException e){
            Log.e(TAG, "doInBackground: Error connetino to internet. neeed permision" + e.getMessage());
        }finally {
            if(connection != null){
                connection.disconnect();
            }
            if(reader != null){
                try{
                    reader.close();
                }catch (IOException e){
                    Log.e(TAG, "doInBackground: Error closing the reader" + e.getMessage());
                }
            }
        }

        return null;
    }

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

  • doInBackground تتلقى الـ URL الذي يوجد فيه ملف الـJson و المتمثل في الـparameter المسمى params.
  • نسند قيمة مبدئية null للمتغيرين reader, connection.
  • نتحقق من الـparameter  المسمى params على احتوائه على ملف JSON من عدمه.
  • انشاء الإتصال بالإنترنت.
  • انشاء StringBuilder object حتى يتم الحاق كامل ملف JSON بهذا object.
  • قراءة كامل ملف JSON  عن طريق BufferReader و يمكن أن تتساءل ما الفائدة من المتغير response؟ عن طريقه يمكن معرفة نجاح الاتصال بالانترنت او فشله.
    حيث انه اذا ظهر لك المتغير response  بقيمة
     200 هذا يعني نجاح الاتصال، غير ذلك يعني فشله.
  • قراءة الملف سطر بعد سطر عن طريق المتغير line و الحاقها بالـتغير result حيث أن الـloop سوف تنتهى عند انتهاء ملفJSON.
  • أحطنا الـ code بـ try and catch حتى نتعامل مع الأخطاء المحتملة منها: فقدان الاتصال بالانترنت، او خطأ في عنوان الرابط.. الخ.
  • إذا حصل خطأ نقوم بـreturn null.
     

 نقوم بإضافة الكود في داخل الميثود onPostExecute و التي بدورها سوف تستعدي الميثود onDownloadComplete المتواجدة في كلاس المستعدي(caller)
لإشعاره بانتهاء تحميل البيانات مع تمرير الـstring الخاص بالـJSON.


@Override
    protected void onPostExecute(String s) {
        Log.d(TAG, "onPostExecute: The parameter is: " + s);
        if(mCallback != null){
            mCallback.onDownloadComplete(s);
        }
        Log.d(TAG, "onPostExecute: Ends");
    }

 

 وبالنهاية نقوم بانشاء الكلاس caller وليكن على سبيل المثال الـMainActivity.


public class MainActivity extends AppCompatActivity implements GetRawData.OnDownloadComplete{
    private static final String TAG = "MainActivity";
  
	@Override
    protected void onCreate(Bundle savedInstanceState) {
        Log.d(TAG, "onCreate: starts");
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

		GetRawData getRawData = new GetRawData(this);
      	getRawData.excute("https://api.flickr.com/services/feeds/photos_public.gne");
      
        Log.d(TAG, "onCreate: ends");
    }
  	@Override
    public void onDownloadComplete(String data) {
        Log.d(TAG, "onDownloadComplete: starts");
      
      	//Do something here.

        Log.d(TAG, "onDownloadComplete ends");
    }

}

كما موضح أعلاه:

  • انشاء الكلاس MainActivity و قمنا بعمل implements للـinterface المسمى OnDownloadComplete.
  • انشاء اوبجكت من النوع GetRawData.
  • استدعاء الميثود excute و تمرير الرابط الذي يحتوي على بيانات الـJSON و التي بدورها سوف تقوم بانشاء الـthread المنفصل.
  • قمنا بـimplements للميثود onDownloadComplete بحيث سوف يتم استدعاؤها تلقائيا عند انتهاء الكلاس GetRawData من تحميل البيانات و هذا هو المقصود من اشعار الـCaller.

 

 لا ننسى الخطوة المهمة و التي لا يكتمل التطبيق إلا بها و هي أخذ الإذن للإتصال بالإنترنت. حيث تتم هذه العملية بإضافة السطر البرمجي الموضح أدناه في ملف AndroidManifest.xml المتواجد في مجلد Manifests.
 


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

و هنا وصلنا الى نهاية هذا الدرس.?

في الدروس القادمة سوف أتناول كيفية معالجة و قراءة الـJSON المحملة.

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

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

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

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