Original PDF

You might also like

Download as pdf or txt
Download as pdf or txt
You are on page 1of 146

Java

ile Native Android Eğitimi


Android İnternet Tabanlı İşlemler

Kasım ADALAN
Elektronik ve Haberleşme Mühendisi
Freelance Software Developer

Kasım ADALAN 1
Eğitim İçeriği

• Restful API
• Volley Kütüphanesi
• Retrofit 2 Kütüphanesi
• Firebase Realtime Database
• Picasso kütüphanesi

Kasım ADALAN 2
RESTful Web Services
• REST : Representational State Transfer
• Web servise , Bilgileri basit bir formatta transfer etmek için kullanılır.
• XML ve JSON en çok kullanılan formattır.
• Web tabanlı olduğu için internet izni istenmektedir.

<uses-permission android:name="android.permission.INTERNET"/>
RESTful Çalışma Mimarisi
Cevap :
JSON veya XML formatındadır.

Web Service
Eğer gönderilen HTTP isteği
RESTful SERVER
ile beraber veri
(MySql Veri
Tabanı) gönderilmek istenirse
GET ve POST metotları
kullanılmalıdır.

HTTP ile
JSON veya XML JSON veya XML Kullanıcıya
Formatında Parse yapılır. Sunulur.
cevap alınır.
ALINAN CEVAP
PARSE EDİLMEYE GİDER
MySQL Veritabanı Yapısı
filmler
film_id int
film_ad varchar
film_yil int
film_resim varchar
kategori_id int
yonetmen_id int

kategoriler yonetmenler
kategori_id int yonetmen_id int
kategori_ad varchar yonetmen_ad varchar
Filmler
Yönetmenler
CREATE TABLE yonetmenler (
yonetmen_id int(11) primary key auto_increment,
yonetmen_ad varchar(100) not null
);

Kategoriler
CREATE TABLE kategoriler (
kategori_id int(11) primary key auto_increment,
kategori_ad varchar(100) not null
);
Örn:
PHP
• Android uygulama ile Veritabanın bulunduğu server arasındaki
bağlantıyı php ile yapabiliriz.

db_config.php

<?php
define('DB_USER', "u139539474_root");
define('DB_PASSWORD', ”123456");
define('DB_DATABASE', "u139539474_movie");
define('DB_SERVER', "mysql.hostinger.web.tr");
?>
tum_kisiler.php

Çalıştırmak istediğimiz
PHP kod
tum_kisiler_arama.php

Çalıştırmak
istediğimiz PHP
kod
delete_kisiler.php

Çalıştırmak
istediğimiz
PHP kod
insert_kisiler.php

Çalıştırmak
istediğimiz PHP kod
update_kisiler.php

Çalıştırmak istediğimiz
PHP kod
Client Desteği
• İki adet client bğlantı türü vardır.
• Apache HTTP Client
• DefaultHttpClient ve AndroidHttpClient kullanır.
• Güçlü ve esnektir.
• Andoid yazılım ekibi destek vermemektedir.
• Bu yüzden android studioda yer almamaktadır.
• Eclipse projelerinde kullanılabilir.
• Java’s HttpURLConnection
• Java.net sınıfını kullanır.
• Java.io sınıfı ile işlemler yapılır.Yani input-output stream kullanılır.
• Android yazılım ekibi destek vermektedir.
Apache HTTP Örneği
AndroidHttpClient client =
AndroidHttpClient .newInstance(“AndroidUserAgent”);
HttpGet istek= new HttpGet(URL);
httpResponse cevap= client.execute(istek);
String stringResponse =
EntityUtils.toString(cevap.getEntity);
HttpURLConnection Örneği
Eğer gönderilen HTTP isteği
RESTful SERVER
ile beraber veri
(MySql Veri
Tabanı) gönderilmek istenirse
GET ve POST metotları
kullanılmalıdır.

HTTP ile
JSON veya XML JSON veya XML Kullanıcıya
Formatında Parse yapılır. Sunulur.
cevap alınır.
ALINAN CEVAP
PARSE EDİLMEYE GİDER
Bu metot HTTP İsteğine
karşılık gelen cevabı
almaktadır. Bu cevap JSON
veya XML olabilir.
HTTP İsteğine karşılık gelen
cevabı görülmektedir. Bu
cevap JSON formatındadır.

Bu cevap anlamlı hale


getirilmelidir. Bunun için
JSON parse yöntemi
kullanılır.
Gelen cevabı Parse etme işlemi.
Performanslı veri alabilmek
için AsyncTask kullanılır.

HTTP isteği yapılır


cevap alınır.

Alınan cevap Parse


edilir ve gerekli
yerde kullanılır.
AsynchTask Çalıştırma
AsyncTask
• Extends AsyncTask<String,Integer,String> abstracttir.
• Arkaplanda işlemleri yapmak için kullanırız.
• Override etmemiz gerek metodları vardır.
• onPreExecute : Arka plan işlemleri başladığında. ProgressBar burada
başlatılabilir.
• doInBackground : Arka plandaki işlemlerin yapıldığı metot. Yapacağı
işlemi bitirdiğ anda onPostExecute() metoduna veri gönderir.
• onPostExecute : İşlem bittikten sonra çalışan metotdur.
• onProgressUpdate() : ilerme burda gösterilir.
Kasım ADALAN 25
AsyncTask Dışarıdan alacağı parametrenin Türü
İlermenin Türü

Sonucun Türü

Dışarıdan gelen veriyi


params[0] ile alırız.
doInBackground işlemi
bitince onPostExecute
metoduna return ile veri
gönderir. Oluşan ilermeyi
values[0] ile alırız.

Kasım ADALAN 26
İlermeyi
tetikler.

Kasım ADALAN 27
İnceleme onPostExecute() metodunda adapter ihtiyacı
olduğu için doInBackground() adapter
• RecyclerView gibi döndürmelidir. Bundan dolayı AsyncTask
yapılara adapter parametrelerinde biri adapter’ın bulunduğu
yükleme işlemi sınıftan olmalıdır.
onPostExecute()
metodunda
gerçekleşir.

• Sebebi ;
doInBackgroud()
içerisinde işlem
yaparken yani
veri tabanından
veri çekildikten
sonra
RecyclerView’e
adapter eklenir.
Veri tabanı üzerindeki işlemler
İşlem türü JSON Parse yapılmalı mı ? HTTP istek
türü
Veri göndermeden EVET Klasik HTTP
sadece veri almak. isteği
Sadece veri göndermek. HAYIR GET veya POST

Veri gönderip veri almak. EVET GET veya POST

Aslında temel olarak iki görev vardır.


Veri göndermek.
Veri almak.
HTTP GET metodu ile çalışmak.
• HTTP isteği yaparken veri göndermemizi sağlar.
• GET metodu url üzerinde eklemeler yaparak veri göndermeye
yaramaktadır.
• Gönderdikleri veriler PHP kodları ile yakalanabilir ve geriye cevap
dönebilir.
• Birden fazla parametreli verileri gönderme sınırı vardır.
• http://kasimadalan.pe.hu/get_all_kategoriler.php?kat_id=1&kat_ad=korku
• Kullanımı basittir.
HTTP POST metodu
• Get metodu ile aynı işleve sahiptir.
• Veriler url üzerine değil , gönderilen verinin içerisine yerleştirilir.
• Daha güvenlidir. Bu eğitimde post metodundan bahsedilecektir.
Veri göndermeden sadece veri almak
• select * from kisiler ; gibi sorgu cümleleri ile koşul olmadan gelen
verileri almaktır.
Sadece veri göndermek.
• Veri tabanı üzerinde silme , güncelleme ve yeni kayıt oluşturma gibi
işlemler için kullanılır.
• insert into kisiler (kisi_ad) values (“mehmet”)
• delete from kisiler where kisi_no = 1
• update kisiler set kisi_ad = ”caner” where kisi_no = 2

• Veri gönderme işlemi olduğu için POST yöntemi kullanılmalıdır.


Veri gönderip veri almak.
• Select * from filmler where kategori_id = 3

• Belirli bir koşula göre veri getiren yapılardır.

• Veri gönderme işlemi olduğu için POST yöntemi kullanılmalıdır.


PHP POST
Post metodu ile gönderilen veriler $_POST[] etiketi ile yakalanır.
$kategori_id = $_POST[’kategori_id'];
JSON ve XML için VERİ MODELİ oluşturmalı
• Gelen verilere göre model sınıflar oluşturulmalıdır.
public class Contacts {

private String id;


private String name;
private String email;
private String gender;
private String address;
private Phone phone;

public Contacts() {
}

}
JSON
[ parantez bir dizi başlangıcı olduğunu gösterir
JSON PARSE ve bu diziye ulaşmak için
JSONArray gelenDizi = new JSONArray (“contacts”);

{ parantez bir nesne başlangıcı olduğunu gösterir


ve bu nesneye ulaşmak için
JSONObject gelenNesne = gelenDizi[0];
gelenNesne.getString(“name”);

JSONObject nesne = gelenNesne.getJSONObject(“phone”)


nesne.getString(”Mobile”);
JSON PARSE
StringBuilder sb = new StringBuilder();
try { // Phone node is JSON Object
JSONObject jsonObj = new JSONObject(jsonIcerik); JSONObject phone = c.getJSONObject("phone");
String mobile = phone.getString("mobile");
// Getting JSON Array node String home = phone.getString("home");
JSONArray contacts = jsonObj.getJSONArray("contacts"); String office = phone.getString("office");

// looping through All Contacts sb.append("adi: "+name+"\n");


for (int i = 0; i < contacts.length(); i++) { sb.append("email: "+email+"\n");
JSONObject c = contacts.getJSONObject(i); sb.append("cinsiyet: "+gender+"\n");
sb.append("-----------------------\n");
String id = c.getString("id");
String name = c.getString("name"); }
String email = c.getString("email"); } catch (JSONException e) {
String address = c.getString("address");
String gender = c.getString("gender");
}
XML
Parse XML case XmlPullParser.TEXT:
StringBuilder stringToplayici = new StringBuilder();
String gelenTag = "" ; if(gelenTag.equals("name")){
stringToplayici.append("adı : "+parser.getText()+"\n");
try { }
XmlPullParserFactory factory = if(gelenTag.equals("cost")){
XmlPullParserFactory.newInstance(); stringToplayici.append("fiyatı : "+parser.getText()+"\n");
XmlPullParser parser = factory.newPullParser(); }
parser.setInput(new StringReader(xmlIcerik)); if(gelenTag.equals("description")){
stringToplayici.append("açıklaması :"+parser.getText()+"\n");
stringToplayici.append("---------------------\n");
int evetType = parser.getEventType(); }
break;
while (evetType != XmlPullParser.END_DOCUMENT){ }
switch (evetType){ try {
case XmlPullParser.START_TAG: evetType = parser.next();
gelenTag = parser.getName(); } catch (IOException e) {
//okunmaya başladığında çalışır. e.printStackTrace();
break; }
case XmlPullParser.END_TAG: }
gelenTag = "" ; } catch (XmlPullParserException e) {
//bir önceki gelen veriyi boşaltır. e.printStackTrace();
break; }
Veritabanı İşlemleri Analizi
Tüm Verilerin Alınması
Çalıştırmak tum_kategoriler.php
istediğimiz
PHP kod
PHP koduna
uygun http
metodu

Bu metot HTTP İsteğine


karşılık gelen cevabı
almaktadır. Bu cevap JSON
veya XML olabilir.
HTTP İsteğine karşılık gelen
cevabı görülmektedir. Bu
cevap JSON formatındadır.

Bu cevap anlamlı hale


getirilmelidir. Bunun için
JSON parse yöntemi
kullanılır.
Gelen cevabı
Parse etme
Performanslı veri alabilmek
için AsyncTask kullanılır.

HTTP isteği yapılır


cevap alınır.

Alınan cevap Parse


edilir ve gerekli
yerde kullanılır.
Silme işlemi
Çalıştırmak delete_kisiler.php
istediğimiz
PHP kod
PHP koduna uygun
http metodu

Sadece işlem yaptığı için


geri gelen cevabı parse
etmeme gerek yok.
http metodunun doInBackground() içerisinde
çalıştırılması

AsynchTask’in çalıştırılması
Yeni kayıt işlemi
Çalıştırmak istediğimiz PHP kod

insert_kisiler.php
PHP koduna
uygun http
metodu

Bundan sonraki Sadece işlem yaptığı için geri


gelen cevabı parse etmeme
adımlar silme gerek yok.
işlemi ile aynı
Güncelleme işlemi
Çalıştırmak istediğimiz PHP kod

update_kisiler.php
PHP
koduna
uygun
http
metodu

Bundan Sadece işlem yaptığı için geri


sonraki gelen cevabı parse etmeme
adımlar silme gerek yok.
işlemi ile aynı
Arama işlemi
Çalıştırmak tum_kisiler_arama.php
istediğimiz PHP
kod
PHP koduna uygun
http metodu

Sadece işlem yaptığı için geri


gelen cevabı parse etmeme
gerek yok.
HTTP İsteğine karşılık gelen cevabı
görülmektedir. Bu cevap JSON
formatındadır.

Bu cevap anlamlı hale getirilmelidir.


Bunun için JSON parse yöntemi
kullanılır.
Gelen cevabı
Parse etme
http metodunun doInBackground() içerisinde çalıştırılması

AsynchTask’in çalıştırılması
Volley
Volley
• http kütüphanesidir.
• Json desteklemektedir.
• Google tarafından geliştirilmiştir.Android işletim sistemi ile uyumlu
çalışır.
• Network bağlantısı oldukça hızlıdır.
• En güncel teknolojiye sahiptir.
• Kütüphane olduğu için dependencies aşağıdaki kod eklenerek
projemize dahil edilir.
implementation 'com.android.volley:volley:1.1.1'
<uses-permission android:name="android.permission.INTERNET"/>
Güncelleme
• http ile başlayan web servisler varsayılan olarak çalışmamaktadır.
• https ile başlayan web servislerde sorun yaşanmamaktadır.
• Bu sorunu çözmek için aşağıdaki ifadeyi manifest dosyasına eklemeniz gereklidir.
Volley Avantajları
• Otomatik olarak istek kuyruğu oluşturur.
• Aynı anda birden çok bağlantıya izin verir.
AsyncTask vs Volley MySQL Database
SERVER
doInBackground() HTTP Request
Arkada Çalışan Thread
HTTP Response

Ana Thread

AsyncTask Çalışma Yapısı


AsyncTask vs Volley
Response
Cache
Cache Thread Memory

Cach Miss
Response

Request
Ana Thread Cache Dispatcher

Response

Request
Response

HTTP Request

Network Thread
Volley Çalışma Yapısı HTTP Response
Volley İstekleri
• StringRequest : Döndürdüğü cevap String’dir . XML veya JSON
formatına kolayca parse edilir.

• JSONObjectRequest : Döndürdüğü cevap JSON formatındadır.XML için


parse işlemi yapılamaz
StringRequest

Gelen cevap string olduğu için JSON veya XML olabilir.


Daha esnek bir yapıdır.

İstek oluşturulduktan sonra istek kuyruğuna koyularak , performanslı bir hale gelir.
JSONObjectRequest

Gelen cevap json formatındadır.


XML parse için uygun değildir.
Daha sınırlı bir yapıdır.

İstek oluşturulduktan sonra istek kuyruğuna koyularak , performanslı bir hale gelir.
Tüm Verilerin Alınması
tum_kisiler.php

Çalıştırmak istediğimiz
PHP kod
Android Tarafı Kodlama

Alınan cevap Parse


edilir ve gerekli
yerde kullanılır.
Arama işlemi
tum_kisiler_arama.php

Çalıştırmak
istediğimiz PHP
kod
Android Tarafı Kodlama
Silme İşlemi
delete_kisiler.php

Çalıştırmak
istediğimiz
PHP kod
Android Tarafı Kodlama
Kayıt İşlemi
insert_kisiler.php

Çalıştırmak
istediğimiz PHP kod
Android Tarafı Kodlama
Güncelleme İşlemi
update_kisiler.php

Çalıştırmak istediğimiz
PHP kod
Android Tarafı Kodlama
ImageRequest
( Resim verilerini alıp bitmap formatında kullanabiliriz)
String url = "http://kasimadalan.pe.hu/resimler/thehatefuleight.jpg";

ImageRequest imgRequest = new ImageRequest(url,


new Response.Listener<Bitmap>() {
@Override
public void onResponse(Bitmap response) {
imImageViewResim.setImageBitmap(response);
}
}, 0, 0, ImageView.ScaleType.FIT_XY, Bitmap.Config.ARGB_8888, new
Response.ErrorListener() {
@Override
public void onErrorResponse(VolleyError error) {
}
});

Volley.newRequestQueue(this).add(imgRequest);
Retrofit
Retrofit Kütüphanesinin kullanımı
Güncelleme
• http ile başlayan web servisler varsayılan olarak çalışmamaktadır.
• https ile başlayan web servislerde sorun yaşanmamaktadır.
• Bu sorunu çözmek için aşağıdaki ifadeyi manifest dosyasına eklemeniz gereklidir.
Retrofit Kütüphane kullanım aşaması
1. Gerekli kütüphaneler gradle ile yüklenecek,internet izni alınacak.
2. JSON formatında alınacak bilgi POJO yapısına dönüştürülecek ve
Java sınıfları oluşturulacak.
3. JSON verilerini almak için bir adet interface oluşturulacak.
4. Retrofit nesnesi alınacak.
5. Alınan retrofit nesnesi ile oluşturduğumuz interface bağlanacak.
6. Çalıştırmak istediğimiz interface’in içinde bulunan metod çağrılır ve
çalıştırılır.
1.Kütüphane yüklenmesi ve izin alınması
2. JSON bilgisini
POJO haline getirme
• http://www.jsonschema2p
ojo.org/
• POJO (Plain Old Java
Objects )
• Projemizin paket ismi
girilir.
• Oluşturmak istediğimiz ana
sınıf adı girilir.
3. Interface oluşturma

Geri dönüş değeri POJO model sınıfı ile aynı olmalıdır.

Yapmak istediğimiz
işlemin metodu yazıyoruz
ve muhtemel geri dönüş
değerini belirtiyoruz eğer
gerekiyorsa veride
gönderebiliyoruz.
4. Retrofit Nesnesi Alınır

Dışarıdan alınan temel url ile retrofit nesnesi alınır.


5. Retrofit nesnesiyle interface’i bağlama

Interface içerisindeki metodları her kullanmak istediğimizde bu metod çalıştırılacak.

Not : BASE_URL ana path olmalı yani bu yoldan sonra /kisiler/tum_kisiler.php geliyorsa bu yol interface
içerisinde belirtilmelidir.Ana domain burda yer alamalı geri kalan uzantı interface içerisinde yer almalıdır.
6. Interface metodunun çağrılması

Interface içerisindeki metodları her kullanmak için ilgili interface’in nesnesi alındı.
Get Metodu kullanımı (Sadece veri almak için)
GET Annotation’ı ile hangi url uzantısı kullanılacağı belirleniyor.
Response nesnesinin body metoduyla
FilmlerSample içerisine erişebiliyoruz
Post metodu kullanma (Veri gönderme)
Veri gönderip veri alma

@POST Annotation’ı ile hangi url uzantısı kullanılacağı belirleniyor.


@POST Annotation’ı veri gönderme amacıyla kullanılıyor.
@FormUrlEncoded Annotation’ı gönderilen verinin utf-8 vb. encode’lara uyarlıyor.
@Field Annotation’ı url ile gönderilecek veriyi tanımlıyor.

Sonuç : http://kasimadalan.pe.hu/kisiler/delete_kisiler.php/kisi_id=2
Post metodu türevleri
Delete ( Silme )
Insert ( Kayıt )
Update ( Güncelleme )
Firebase Realtime Database
Firebase Realtime Database

• Firebase gerçek zamanlı çalışan bir veri tabanıdır.


• Veri tabanı üzerinde oluşan değişiklikleri anlık olarak projelere yansıtır.
• No sql bir veri tabanıdır. Klasik sql sorguları geçerli değildir.
• Veri kayıt işlemini primary key olmadan yapmaktadır.
• Verileri json yapısında tutmaktadır.
• Web servis yazmanıza gerek yoktur.
Firebase üzerinde proje oluşturmalıyız.

Kasım ADALAN 116


Android Studio İçerisinden
Firebase’a ulaşmak

Kasım ADALAN 117


Kasım ADALAN 118
Connect Firebase ile sizin gmail
hesabınız ile firebase’e bağlanır
ve sizden firebase projesi
seçmenizi ister.

Kasım ADALAN 119


Yeni firebase proje oluşturma seçimi

Var olan firebase proje seçimi.

Var olan firebase projenizi


seçersiniz.

Kasım ADALAN 120


Android studio projemiz firebase projemize
doğru bağlandığının göstergesi

2. Aşamada kütüphaneler ve servisler


projemize dahil edilir.

Kasım ADALAN 121


Android studio projemize
eklenecek kütüphaneleri ve
servisleri gösteriyor ve bu
kütüphaneleri ve servisleri kabul
ederek android studio projemize
ekliyoruz.

Kasım ADALAN 122


Veri tabanı Kuralları
Veri yapısı
Veri yazılacak tablonun seçilmesi
Insert - Veri Kaydı
Kendi Keyimiz ile Veri Kaydı
Delete : Veri silme
Update : Veri güncelleme
Veri Okuma
Sql sorgu çeşitleri
EqualsTo : Eşitlik Arama
LimitToFirst veya LimitToLast
Değer Aralığında Veri Alma
Picasso
PİCASSO
• Picasso ile url üzerinden resimleri indirebiliriz.
• ImageView nesnesi ile çalışabilmektedir.
• Minimum hafıza kullanarak kompleks resimleri url üzerinden
görüntüleyebiliriz.
• Otomatik olarak hafıza yönetimi yapmaktadır.
Güncelleme
• http ile başlayan web servisler varsayılan olarak çalışmamaktadır.
• https ile başlayan web servislerde sorun yaşanmamaktadır.
• Bu sorunu çözmek için aşağıdaki ifadeyi manifest dosyasına eklemeniz gereklidir.
Picasso
• Bu kütüphaneyi kullanabilmek için ;
1. Android manifest içinde Internet izni alınmalı.
2. Dependency içine kütüphane tanımlanmalıdır.

http://square.github.io/picasso/
Picasso – Kullanabildiği kaynaklar.
• Harici depolama.
• Internet.
• Android resource (drawable vb.)
Picasso - Internet
• Resim kaynağı internettir ve resim yerini bir url ile belirtiriz.
• Sadece internet izni yeterlidir.
Picasso – Android Kaynağı

• Resim kaynağına drawable içinden ulaşılır.


• Sadece internet izni yeterlidir.
Picasso – Harici Depolama
• Resim kaynağına sd card içinden ulaşılır.
• File sınıfından bir nesne ile ulaşacağımız resmin yolunu
belirtiriz
• Dış kaynaktan veri okuma ve yazma için izin gereklidir..
<uses-permission
android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>

File yol = Environment.getExternalStorageDirectory();


File dosya = new File(yol,"resim.png");

Picasso.get()
.load(dosya)
.into(imageViewResim);
Picasso – Image Trasformations
• Url den alınan resim üzerinde anlık değişimler yapabiliriz.
• resize(genişlik,yükselik) : resmin boyutlarında x ve y koordinatları kadar
oynama yapılır.
• rotate(derece) : Resmi verilen derece kadar döndürür.
Picasso – Placeholder ve Error FallBack
• Placeholder : Resim yüklenene kadar gösterilen varsayılan resim.
• Error : Yükleme sırasında hata oluştuğunda gösterilen resim.

String url = "http://kasimadalan.pe.hu/resimler/inception.jpg";

Picasso.get()
.load(url)
.placeholder(R.drawable.placeholder)
.error(R.drawable.error)
.into(imageViewResim);
Uygulama
Teşekkürler...

kasım-adalan kasimadalan@gmail.com kasimadalan

You might also like