Android 46: Intentlə obyekt ötürmək

Xatırlayırsınızsa 27-ci yazımızda inentdən söz açmış, ardınca intent vasitəsiylə məlumat ötürmüş, almışdıq. Bu səfər isə intent vasitəsiylə obyekt ötürməyə çalışacağıq.

Gəlin “IntentObject” adında bir layihə başladaq, ardınca Student adlı sinif yaradaq. Bu bizim şagird üçün formalaşdırdığımız modelimiz olacaq. Daxilində şagiridn adı, soyadı, yaşı, oxuduğu sinif olacaq. Burada yaşı integer, digərləri String formada saxlanılacaq. Hamısı “private” olaraq qorunacaq, getter və setter (inkapsulasiya) istifadə ediləcək. Bura qədər olan hissəni özünüz həll edin. İndiyə qədər çox işləmişik. Bunu belə rahatlıqla edə bilmirsinizsə, bir problem var. Dostlar. Ciddən problem var. Yalandan üzdən oxuyub keçməyin. Nəyisə siz özünüz etməyi bacarmalısınız. Normal materialı bitirdik, xırdaçılıqlara keçirik. Siz artıq harasa staj üçün müraciət etmək yaşınızdasız, böyümək vaxtıdı. Bir iki aya iş üçün müraciət edəcəyik. Bərabər open source layihələr üzərində işləyəcəyik. Məni tək qoyacaqsınız? Olmaz helə. Hadi hadi. Yuxardakı linklərə keçid et bir də bax. Özün qurmağa çalış. Qura bilmirsən, araşdır, yenidən oxu, qur. Sonra sil. Heç bir yerə baxmadan yenidən qur. Sonra gəl yazının davamını oxu. Belə də, bəyənmirsən, boşdu, bu sayta göz at burdan öyrən. Əsas odu öyrən. Lap bilirsənsə, sən də yaz, izah etməyə çalış, blogunun linkini rəy yerinə qeyd et biz də gələk oxuyaq, biz də səndən öyrənək. Hamı hər şeyi bilir – ifadəsi doğru deyil. Mən “a”-nı bilirəm, sən “c”-ni, başqa biri “a”-nı məndən yaxşı bilir, “c”-ni səndən zəif. Yazsın, mən ondan “a”-nı öyrənim, sən də yaz ki, səndən “c”-ni öyrənsin. Söhbət açılmışkən, bu yaxınlarda kodrea komandası fəaliyyətə başladı, mediumdan tutmuş youtube-a qədər. Axtarış edin, tapın, onlardan öyrənin (mən də onarın materiallarını oxuyuram).

Qayıdaq mövzumuza. Burada Student sinfimiz Serializable sinfini implements etməlidir. Etdirin.

Burda diyanıb keçirik dizayna. Burada SecondActivity adlı activity yaradın. Xml-ində bir textView olsun (id vermək yadddan çıxamasın). Activity-də textView-i tanıdın (findViewById). Ardınca MainActivity-ə keçək. Onun xml səhifəsində bunlar olacaq: 4 ədəd editText, 4 ədəd textView, 1 ədəd Button. MainActivity-də isə editText və buttonları tanıdın. Yadınızdadı buttona klikləyərkən ediləcəklər proseslərini necə yazırdıq? Bilmirsizsə linkə klikləyib baxın. Həmin prosesi yerinə yetirdikdən sonra (Tamam, tamam kömək edim, setOnclickListener, ordanda new View.OnClickListener) Student sinfimizin obyektini yaradaq, editText-lərimizdəki məlumatları bir-bir obyektimizə ötürək. (Kodların hamısı sonda sizindir, özünüz etməyə çalışın.)

İndi intent yaradırıq. Ardınca putExtra ilə obyektimizi ötürürük, startActivity(intent)- yaddan çıxmasın. Bu hissə hazır. Keçirik SeconActivity-nin içinə. İntent yaradıb getIntent() edirik. İndi gələk əsas məsələyə. Normalda informasiya ötürəndə (ibtidai tip və ya String) necə idi? Onun üçün getExtra edirdik. Lakin indi getSerializableExtra() metodunu işlədcəyik. Ad tanış gəldi? Student sinfinə hansı sinfi implement etmişdik, bir bax gör? Aha, o. Əla.

Bir ədəd Student sinfinin obyektini təyin edək, intentin metodundan aldığımız obyekti buna mənimsədək (Student-ə casting edərək). Sonrada bunu ötürək textView-ə. Tadam: Bitdi.

Xeyir, bir ədəd String qaytaran toString() – metodu yazın SecondActivity daxilinə. İçdədə mətniniz ekranda necə görünsün, onu yazın. Və artıq bitdi.

Bu yazıdan da bu qədər. Kodlara burdan baxa bilərsiniz. Uğur ola!

 

 

Advertisements

Android 45: REST və SOAP

Əvvəl gəlin “REST nədir?” və “SOAP nədir?” suallarına qısa cavab verək, sonra aralarındakı fərqə baxarıq.

REST nədir?

REST (REpresentational State Transfer – Nümunə Status Transferi) HTTP ilə asan və sürətli şəkildə client-server əlaqəsi qura bildiyimiz strukturdur. REST üçün URL adresləri üzərindən əlaqələr qurulur, hər bir metod url adresi üzərindən fərqli olur. REST XML və ya JSON-dan istifadə edir (məlumat ötürmək üçün). Əsas da JSON-dan istifadə edilir. Çünki çox sürətli və azhəcimli olduğu üçün. [1]

SOAP nədir?

SOAP (Simple Object Access Protocol – Sadə Obyektə Giriş Protokolu) ən sadə formada internet üzərində az miqdarda məlumatları köçürmə protokoludur. SOAP mesajları XML formatında olub əsasən HTTP (Hyper Text Transfer Protocol) protokolundan (bəzən də TCP/IP) istifadə edilərək göndərilir. Burada diqqət edilməsi vacib olan nöqtələrdən biri SOAP bizi sadəcə XML formatından istifadə etməyə məcbur edir. [2]

REST və SOAP arasındakı fərqlər:

REST SOAP-dan daha sürətli və yüngüldür. [4] REST-i öyrənmək SOAP-a nəzərən daha sürətli və rahatdır. REST kiçik informasiyalar üçün istifadə edilir, SOAP böyük məlaumatlar üçün (Bu hissə necə də GET və POST-a oxşadı). [3] REST, SOAPdan daha az bant genişliyi və resurs tələb edir. [5]

Mənbələr:

[1] https://youtu.be/FlkGlHZZLTQ
[2] http://www.erenguvercin.com/2013/05/soap-ve-rest-mimarilerine-genel-baks.html
[3] http://kodkosesi.blogspot.com/2014/01/rest-vs-soap.html
[4] http://www.ateam-oracle.com/performance-study-rest-vs-soap-for-mobile-applications/
[5] https://www.javatpoint.com/soap-vs-rest-web-services
[6] https://blog.westmonroepartners.com/mobile-web-services-jsonrest-vs-xmlsoap/
[7] https://javapapers.com/web-service/rest-vs-soap/
[8] https://www.youtube.com/watch?v=pJxYARgvn7U
[9] https://stackoverflow.com/questions/6929180/rest-and-soap-webservice-in-android
[10] https://www.captechconsulting.com/blogs/soap-vs-rest-for-mobile-services

Android 44: Android Permissions

Android Permissions – deyərkən android tədbiqetmələrində istifadəçi tərəfindən verilən müəyyən icazələr nəzərdə tutulur. Misal üçün Düzəltdiyiniz tədbiqetməyə internet əlaqəsi lazımdırsa istifadəçidən internet istifadəsi üçün icazə almalısınız. Bunlara User-Permission deyilir, yəni istifadəçi icazələri.

Bu icazələr normal və təhlükəli olmaqla iki yerə ayrılır.

İnternte istifadəsi, Bluetooth istifadəsi, Alarm, Time zone (saat qurşağı) və bu kimi icazələr normal dərəcəli icazələrdi.

Kameradan istifadə, yaddaşdan istifadə, kalendardan istifadə, sms göndərmək və ya oxumaq kimi icazələr isə təhlükəli icazələr sayılır.

Təhlükəli deyərkən “Şəxsi məlumatların qorunması” baxımından təhlükəli. Bu kateoqriyalara buradan göz ata bilərsiniz.

Yaxşı, bu icazələri hara əlavə edəcəyik bəs? Əlbətdəki AndroidManifest səhifəmizə. Aşaıdakı şəkilə baxaq (şəklin mənbəsi):

<uses-permission android:name="android.permission.CAMERA"/><uses-permission android:name="android.permission.RECORD_AUDIO"/><uses-permission android:name="android.permission.INTERNET"/><uses-permission android:name="android.permission.WAKE_LOCK"/><uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>

Əlavə olaraq bubu yazıya göz ata, bu videonu izləyə bilərsiniz.

Android 43: ActionBar və ToolBar

Əslində yazının adına baxıb axtardığınız informasiyanı bu yazıda görməyəcəyiniz üçün üzr istəyirəm. Bu ümumiyyətlə yazı deyil.

ActionBar:

ToolBar ActionBar-ın biaz daha üstün versiyasıdır deyə bilərik. Material Design ilə (Android API 21, Android 5.0) ilə gəlib.

Bu mövzu haqqında geniş mənbələr var, əvvəl türkc sonra ingiliscə olmaqla linklər aşağıda:

[1] https://gelecegiyazanlar.turkcell.com.tr/konu/android/egitim/android-201/action-bar-eklemek
[2] http://www.androidevreni.com/material-design-toolbar-kullanimi/
[3] https://canaltinova.com/blog/gule-gule-action-bar-hosgeldin-toolbar/
[4] https://blog.xamarin.com/android-tips-hello-toolbar-goodbye-action-bar/
[5] https://www.appcelerator.com/blog/2013/09/using-androids-actionbar/

[6] https://youtu.be/kmUGLURRPkI

Android 42: GET və POST

Bu yazımızdan etibarən, bir neçə yazı sırf bir-birinə oxşar 2 şeyin fərqləri üzərində olacaq. Bu yazımızda GET və POST əmirlərinin fərqinə baxacağıq.

Arasında fərqə baxmadan əvvəl deyək ki, GET və POST əmirləri SQL üçün olan əmirlərdir. Hər ikisi HTTP “request” metodlarıdır.

GET

  • Əlfəcin istifadə etmək mümkündür (Seçilmişlərə əlavə etmək)
  • Keş yaddaşda saxlanıla bilər
  • Browser tarixində qalır.
  • Həsass (çox vacib) məlumatlar üçün istifadə edilməməlidir.
  • 255 simvolluq bir uzunluq məhdudiyyəti var və ASCII cədvəlinə uyğun olmalıdır.
  • Sadəcə məluamt almaq üçün istifadə edilir

POST

  • Seçilmişlərə əlavə edilmir
  • Browser tarixində qalmır
  • Vacib məlumatlar üçün istifadə edilə bilər
  • 32000 simvola qədər uzadıla bilər, ASCII cədvəlinə uyğun olmasa da olar, yəni 0-1 kimi binary formada da ola bilər

Bir qədər qısa oldu amma aşağıdakı mənbələrər göz ataraq bu mövzu haqqında daha dərinləməsinə informasiya əldə edə bilərsiniz (edin)

[1] http://www.bahadirakin.com/get-ve-post-metodlari-ve-java/
[2] http://www.includekarabuk.com/kategoriler/genel/GET-ile-POST-Arasindaki-Fark.php
[3] https://www.w3schools.com/tags/ref_httpmethods.asp
[4] https://www.diffen.com/difference/GET-vs-POST-HTTP-Requests
[5] https://stackoverflow.com/questions/3477333/what-is-the-difference-between-post-and-get

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!

Android 40: JSON Parse

API nədir?

API (Application Programming Interface). Developerlər tərəfindən yaradılmış hazır sinif, prosedur, funksional. Hər hansı application yaradanda digər servisdən istifadə etmək üçün gərək onun API-nı istifadə edərək onunla “communication” yaradıb, hər hansı məlumatı ötürüb götürmək, ümumiyətlə onun necə və nəcür istifade edilməsi qaydalarıdır. Məsələn, mobil üçün twitter tədbiqetməsi yazirsız, twitter account, servisdən istifadə etmək üçün gərək bu application twitter api da qurulumuş qaydaları ilə onunla “əlaqə” qursun, məlumat qəbul edib ötürülsün. [1]

API (a techie term for application programming interface – interfeys proqram əlavəsi üçün olan ifadə) istifadəçilərə bir başa səhifələrində məlumat almağa imkan yaradaraq fasiləsiz yeniləmələr təmin edərək müntəzəm yükləmələr, məlumat axını-mətn, rəsmlər, görüntü üçün video ilə təchiz edir. Məsələn, Flickr API-si sizə bloqunuzdan və ya səhifənizdən şəkilləri görüntüləməyə imkan yaradır. Twitter və Facebook kimi saytlar API-ni “açın” edəndə,bu o deməkdir ki, veb tərtibatçılar əsəs xidmətlər üzərində yeni funksiyalara əsaslanan tətbiqi proqramlar yarada bilərlər.(Wikipedia entry baxın) [2]

JSON nədir?

JSON (“JavaScript Object Notation”) — insanlar tərəfindən oxuna bilən verilənlərin çevrilməsi üçün formatdır. XML-in Javascript ilə daha yaxşı işləyə bilməməsindən yaranmışdır. JSONda verilənlər açar(key) və dəyər(value) dan ibarət olur. XML-dən asan olmasına görə müasir dövrdə yavaş-yavaş XML-i əvəzləməyə başlamışdır. XML-dən daha sürətlidir. Əsas üstünlüyü verilənlərin transferi zamanı daha kiçik hissələrdən istifadə edə bilməsidir. Fayl Genişlənməsi .json-dur. [3]

JSON Obyect nədir?

JSON Obyektləri iki yerə ayrılır – “{” və “}” olmaqla, dalğalı mötərizə daxilindəkiləri də əhatə etməklə bütünlükdə bir obyekt, ikincisi isə açar-dəyər cütlüyü. [4]

JSON Array nədir?

Array – yəni massiv olub “[” və “]” olmaqla, kvadrat mötərizə ilə başlayıb bitir.  [5]

Qısa infarmasiyadan sonra keçək əsas məsələyə. Bu yazımızda https://jsonplaceholder.typicode.com/posts adresindəki JSON-u parse edəcəyik.

İlk öncə MainActivity-də String jsonText = “”; dəyişəni yaradıb dırnaq arasına öz lindəki JSON mətnin kopyalayıb yapışdıraq. (Qeyd: Növbəti yazıda artıq mətni yox, sadəcə linki yazacağıq, linkdən JSON mətnini almağa çalışacağıq). JSON mətninə uyğun bir model yaradaq, hansı ki List (əlaqədar yazının linki) yazılarında yaratmışdıq.

UserModel adlı java faylı yaradırıq, 4 dəyişənimizi əlavə edib ona uyğun get və set metodlarını yazırıq.

İndi qayıdaq MainActivity-yə və JSON mətnimizi parse edək. Bunun üçün Modelimizin arrayListini yaradırıq.

ArrayList<UserModel> arrayList = new ArrayList<>();

Kodumuzdakı JSON Parse hissəsini try/catch içində yazacağıq.

Əvvəlcə JSONArray yaradııq, içinə mətnimizi ötürürük. Sonra dövür qururuq, i sıfırdan jsonArray.length()-ə qədər. Həmin dövrün içində massivin içindən götürürük, modelimizi yaradıb müvafiq əmirləri yerinə yetiririk. Kodun qalan hissəsi şəkildəki kimidi.

Burada biz JSON mətninə uyğun hər bir dəyişənimiz üçün dövr daxilində getİnt və getString edərək müvafiq int və String dəyişənlərinə mənimsətdik, onları da modelə ötürdük, sonar modelimizi arraylistimizə ötürdük.

Bu yazıda əsas göstərmək istədiyim hissə JSON parse idi, adepter qrup, həmin aldığımız məlumatları listView daxilində ekrana çıxartmaq da sizin ev tapşırığınız olsun. Kodalrı vermiyəcəm. Uğur ola!

Mənbələr:

[1] https://cavablar.net/2015/01/05/api-n%C9%99dir/#.Wz_TzCC-m00
[2] http://sosialmedia.net/?p=1145
[3] https://az.wikipedia.org/wiki/JSON
[4] https://www.w3schools.com/js/js_json_objects.asp
[5] https://www.w3schools.com/js/js_json_arrays.asp