Android 41: JSON HTTP Request

Bu yazımızda JSON Parse edəcəyimiz yazının yerinə birbaşa link qoyaraq parse etməyə çalışacağıq. Bunun üçün bəzi metodalrı yazmaq lazım olacaq. Başlayaq.

İlk öncə String jsonText var idi ha əvvəlki yazımızda, uzun bir mətin, həmin mətni silək, onun yerinə linki daxil edək.

Biz AsyncTask-dan istifadə edəcəyik. Bunun üçün yeni bir java faylı yaradırıq. Adını mən “AsyncGetPost” qoyacam. AsyncTask-ı isə extends edirik. Nəticə etibari ilə doInBackground metodunu implement etməyimiz lazım gəlir.

DoInBackground nədir? (Bura göz at)

Generate edərək onPreExecute və onPostExecute metodlarını da çağırırıq. Fikir versəz AsyncTaskın sağında “<>” ilə yazılmış üç parametr var. Bunlar nədir, ilki doInBackground-un aldığı argumentn tipi, ikincisi onProgressUpdate metodunun aldığı dəyər (biz o metoddan istifadə etməyəcəyik deyə Void olaraq saxlayırıq), üçüncüsü də onPostExecute-ün aldığı, doInBackground-un qaytardığı dəyərin tipini göstərir. Birinci v üçüncünü String, ikincini isə Void yazaq.

Keçək kodlara. Yazdığımız sinif üçün konstruktor metod yaratmalıyıq. Bunun üçün konstruktor medoumuzun qəbul edəcəyi Context dəyişənini qey edim konstruktor metodumuzu yazırıq

onPreExecute metodunda ProgressDialog yaradaq? Hansı ki doInBackground-da gedən proseslər bitənə dək ekranda mesaj yazılsın.

İndi isə bir ədəd HttpHandler adlı sinif yaradıram. Həmin sinifdə makeServiceCall adlı String qəbul edən və qaytaran metod yazaq.

Response adlı String dəyişəni yaradıb null edək. Ardınca try/catch bloku açaq. URL tipində url dəyişəni yaradıb metodun qəbul etdiyi url adresi ora ötürək. (Qırmızı xətt gələcək, üstünə basıb Exception-I add edin). Ardınca HttpUrlConnection yaradıb ona “GET” ötürək (setRequestMethod). Burada url.openConnection edəcəyik, Eception yarana bilər deyə, onu catch etməliyik (qırımızı xəttin üstünə basıb add edin).

Bura qədər olan vəziyyəti yuxardakı şəkildə görürsünüz. İndi HttpRequestimizdən bir InputStream qayıdır, bunu InputStream dəyişəninin içinə birbaşa ötürə bilməyəcəyik, bunun üçün BufferedInputStream metodu yaratmalıyıq ki, aldığımız Inputu Buffer edib istədiyimiz formaya salım. Belə deyək, API-a sorğu göndərirsiz, ordan sizə müəyyən mətin gəlir, hansı ki bu mətin 0 və 1-lərdən ibarət olur. Biz BufferetİnputStream metodunun içinə elə kodlar var ki, nəticə aldığımız bayt kodları öz başa düşdüyümüz dilə çevrilmiş olur. Həmin nəticəni InputStream-ə ötürməliyik. Həmin mətini isə başqa bir metodla Stringə çevirəcəyik. Başda yaratdığımız respose dəyişəninə mənimsədəcəyik.

İndi isə convertStreamToString metodunu yaradıb içini dolduraq. Əvvəlcə burad içiçə ötürmələr edəcəyik. Onun üçün birbaşa koda baxsaz hansı hazır metodlardan istfiadə etdiyimizi görəcəksiniz.

Ardınca StringBuilder yaradırıq.

“line” adlı String dəyişəni yaradıb try/catch blokunun içində while döngüsü yazırıq. Döngünün şərti belədir: BufferedReader-dən aldığlız informasiyanın “readLine” ilə sətrini öz String-imiziə ötürürük, onun da null (boş) olmamasın yoxlayırıq, null olmadığı vəziyyətdə StringBuilder-ə append edib əlavə də aşağı sətrə keçirik. Sonda aldığımız mətin formasında JSON-u bizə qaytarsın. Kod aşağıdakı kimidir:

Bu hissə tamamdır. İndi qayıdaq AsyncGetPost sinfimizə orada doInBackgorund-da HttpHander obyektini yaradaq makeServiceCall metodunu çağıraq. Burada həmin metoda url adresi ötürmək lazımdı. Qayıdırq MainActivitimizdə url olan dəyişənimizi ordan kəsib həmin bu sinfimizədəki həmin metodumuza local dəyişən kimi yapışdırırıq. Onun da adını jsonText yox jsonUrl qoyuram. Orda həmin handlerdn çağırdığım metodun bizə qaytardığı json mətnini də jsonResult adlı stringə mənimsədib return edirəm. Vəyət aşağıdakı kimidir:

İndi AsyncTask daxilində Json parse etmək üçün jsonParse metodu yazıram, hansı ki siz bunu əvvəlki yazımızda etmişdiniz.

PostExecute metodunun aldığı dəyişəni həmin jsonParse metoduna ötürürəm.

Link-ə getdik, URL-ə çevirdik, sorğu göndərib məlumatı aldıq, alınan məlumatı (byte code) əvvəl başa düşdüyümüz dilə, sonra da normal JSON formasına saldıq. Ardından həmin mətni parse edib arrayListə doldurduq. İndi qaldı həmin arrayList-i ListView-ə ötürmək.

MainActivity-də AsyncGetPost üçün obyekt yaradıb həmin obyekt üçün execute() metodunu çağıraq.

Əlbətdə ki bütün bu proseslər internet üzərindən olduğu üçün internet icazəsi də əlavə edirik. AndroidManifest-ə gedib əlavə edirik:

Indi onPreExecute içində yatadığım ProgressDialog obyektini glob etdim ki JSON parse etdikdən sonra həmin dialog pəncərəsi balansın. Bunun üçün də onPostExecute metodunda jsonParse-dan sonra progressDialog.dismiss() metodun çağırdım.

Bir ədəd də Toast mesaj çıxardaq ekrana ki bilək JSON Parse əməliyyatı uğura tamamlanıb ya yox. Bunun üçün onPostExecute-də progressDialog-dan əvvəl Toast mesaj çıxarırıq.

Və Run edək.

Belə. HttpHandlerAysncGetPost siniflərini sizlə paylaşacam. Ev tapşırığınız, aldığımız informasiyaları listView-ə ötürün. Uğur ola!

Advertisements

Bir cavab yazın

Sistemə daxil olmaq üçün məlumatlarınızı daxil edin və ya ikonlardan birinə tıklayın:

WordPress.com Loqosu

WordPress.com hesabınızdan istifadə edərək şərh edirsinz. Çıxış /  Dəyişdir )

Google+ foto

Google+ hesabınızdan istifadə edərək şərh edirsinz. Çıxış /  Dəyişdir )

Twitter rəsmi

Twitter hesabınızdan istifadə edərək şərh edirsinz. Çıxış /  Dəyişdir )

Facebook fotosu

Facebook hesabınızdan istifadə edərək şərh edirsinz. Çıxış /  Dəyişdir )

%s qoşulma

This site uses Akismet to reduce spam. Learn how your comment data is processed.