7 Ocak 2017 Cumartesi

Otto - Android EventBus

Yazılım geliştirirken en dikkat edilmesi gereken konulardan biri loose coupling yani esnek bağlı tasarım . Fakat ne kadar bağımlılıktan kaçınsanızda çoğu yerde activityler fragmentlarla servislerle veya activityler diğer activiylerle haberleşmesi gerekebilir . Bu bahsettiklerim geleneksel olarak interfacelerle yapılabilir -Bir sınıfta instance , bir sınıfta ilgili methodlar kullanılarak haberleşebilirler-. Burda karşılaşılabilen en büyük handikap kullanılmayan methodlarında çoğu classda bulunarak gereksiz yer kaplaması veya sürekli bir üst sınıfa taşınması gereken instance lar. . İkinci yöntem ise eventbus kütüphanesi . Otto ise bu eventbus kütüphaneleri arasındaki en bilinenlerden biri . Temel olarak yapmanız gereken 5 aşama var .

1) Otto sınıfının heryerden ulaşılabilecek bir constructorı oluşturulur .
 2) Kullanılacak olan sınıfa register edilir .(kayıt edilir)
3) Mesaj tipi oluşturulur .
 4) Mesaj tipine subscribe olunur .
 5) Mesaj gönderilir - yakalanır. Şimdi sırayla açıklayalım .

1) Otto sınıfının heryerden ulaşılabilecek bir constructorı oluşturulur . Bunu yapmanın en kolay yolu bir tane application sınıfı açılır ve içinde static bir nesne oluşturulur .

public class ApplicationClass extends android.app.Application {
            public static Bus busProvider;

            @Override
            public void onCreate() {
                super.onCreate();
                busProvider = new Bus();
            }
        }

2) Kullanılacak olan sınıflar register edilir -kayıt edilir-.(hem mesajı gönderecek hem yakalayacak kısım ).

 public class MainActivity extends AppCompatActivity {
            @Override
            protected void onCreate(Bundle savedInstanceState) {
                super.onCreate(savedInstanceState);
                setContentView(R.layout.activity_main);
                ApplicationClass.busProvider.register(this);
            }

3) Mesaj tipi oluşturulur . (Bir sınıftan diğerine bir String nesnesi taşınacak)

public class Message {
            public String count;

            public Message(String count) {
                this.count = count;
            }
        }

4) Mesaj tipine subscribe olunur . (Gelecek mesajın yakalandığı yer)

@Subscribe void callingMessage (Message message){
            message.count;
        }

5)Mesaj gönderilir. (Senkron olarak o an register olan sınıftaki method tetiklenir )

plus.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                ApplicationClass.busProvider.post(new Message("plus"));
            }

 İlgili örneği linkten bulabilirsiniz 

22 Ağustos 2016 Pazartesi

Android Retrofit Kullanımı

     Retrofit rest tabanlı yazılmış servisler "RESTful" için kullanılan , eski yöntemlere göre aşırı kolay bir kütüphanedir . Temel mantık sunucu elinde bir data bulundurur ve servisle bunu sunar . Mobil tarafında ise bu servisten retrofit yardımıyla bu data alınır .Örnek olarak linkte sunulmuş hazır bir servis örneğini görebilirsinis ."https://api.github.com/users/gurkankesgin"



Bu datayı mobil taraflı yakalamak için ise 3 temel adımı uygulamanız gerekiyor .

1)  Datayı mobil tarafta map edecek bir sınıf oluşturmak . "Ben burada test amaçlı olduğu için sadece birkaç parametre ekledim , psikopat bir back-endci yoksa ve gereksiz yere parametre göndermiyorsa genelde hepsi eklenir :)"
public class User {

    private String name;
    private String avatar_url;
    private boolean site_admin;


    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getAvatar_url() {
        return avatar_url;
    }

    public void setAvatar_url(String avatar_url) {
        this.avatar_url = avatar_url;
    }

    public boolean isSite_admin() {
        return site_admin;
    }

    public void setSite_admin(boolean site_admin) {
        this.site_admin = site_admin;
    }


    @Override
    public String toString() {
        return "User{" +
                ", name='" + name + '\'' +
                ", avatar_url='" + avatar_url + '\'' +
                ", site_admin=" + site_admin +
                '}';
    }
}





2) Servise çıkılacak olan uzantılar için bir interface oluşturulur . "Buradaki @Path ; url in sonundaki kısmın değişken olduğu ve verilen değere göre farklı bir nesne döndürdüğünü belirmektedir . Yani username yerine kendi adınızı gönderirseniz kendi bilgilerinizi çekebilirsiniz ."
public interface ApiInterface {

    @GET("/users/{username}")
    public void getUserbyName(@Path("username") String username, Callback userCallback);

}



3) Interface in kullanacağı adapter oluşturulur ve kendisine servisler için çıkacağımız base url verilir .
Ardından bu adapter kullanılarak interface in intance ı alınır .
 RestAdapter resrAdapter = new RestAdapter.Builder().setEndpoint("https://api.github.com").build();
 ApiInterface apiInterface = radapter.create(ApiInterface.class);



ve artık dataya erişebilirsiniz . apiInterface intance ı ile kullanmak istediğiniz servisi kullanabilir çekmek istediğiniz datayı çekebilirsiniz . Şu an tek servisimiz olduğundan mecburen kendisini kullanıyoruz :)  Bizden bir string ve bir callback isteyen methoda ilgili parametreleri gönderiyoruz .
  apiInterface.getUserbyName("gurkankesgin", new Callback() {
            @Override
            public void success(User user, Response response) {
                Toast.makeText(MainActivity.this, user.toString(), Toast.LENGTH_LONG).show();
            }

            @Override
            public void failure(RetrofitError error) {

            }
        });
Callback te görüldüğü üzere iki method var biri success , başarılı bir şekilde sonuç geldiğinde bu method a düşer içerisinde  yakalamak isteğimiz user nesnesi ile; diğeri ise failure , adından da anlaşılcağı gibi bir yerlerde hata olduğunu gösteririr ""error.getMessage() ile hata mesajını bu methodda yazdırabilirsiniz .

 Kodun çıktısı da aşağıdaki gibidir .




  • tabi bunları yazarken internet iznini vermeyi unutmuyoruz . 
"<uses-permission android:name="android.permission.INTERNET"/>"

kaynak kodlara adresten erişebilirsiniz .Link 1

4 Temmuz 2015 Cumartesi

Static Anahtar Kelimesi

        Sınıfların içinde bulunan değişkenler her yeni nesne için tekrar tekrar oluşturulur . Buna nesne değişkeni denir . Fakat bazı durumlarda nesneler için değil de sınıf için genel değişkenler tanımlanması gerekir ki bu da static anahtar kelimesi ile mümkündür . Daha açık anlatmak gerekirse ;

Aşağıdaki gibi bir nesne sınıfınız varsa ve sürekli instance alarak yeni nesne üretiyorsanız ve her nesne için id numarasının bir artmasını istiyorsanız bunun için id değerini static yapmanız gerekiyor . Çünkü oluşturulan her nesne için ayrı bir id değişkeni oluşturmak yerine o sınıfa ait bir değişken oluşturulmuştur .


public final class Nesne {

 public static  int id = 0;
 
 public Nesne() {
  id++;
 }
 
}
public class Main {

 public static void main(String[] args) {

  Nesne nesne1 = new Nesne();
  System.out.println(nesne1.id);
  
  Nesne nesne2 = new Nesne();
  System.out.println(nesne2.id);
  
  
 }
}
Sonuç : 1
        2

Static kullanılmasaydı her seferinde değer 0 dan başlayacak ve 1 olacaktı -yani sürekli başa saracaktı-. Ek olarak bu nesne değişkenine direk "Nesne.id" ile de ulaşabilirsiniz . Herhangi bir instance almaya gerek duymadan .



public class Main {

 public static void main(String[] args) {

  Nesne nesne1 = new Nesne();
  System.out.println(nesne1.id);
  
  Nesne nesne2 = new Nesne();
  System.out.println(nesne2.id);
  
  Nesne.id = 10;
  System.out.println(nesne2.id);
 }
}
Sonuç : 1
        2
        10

Static methodlarda aynı şekilde instance almadan direk sınıfı adı üzerinden ulaşılabilir kullanım açısından static değişkenle arasında bir fark bulunmaz -nesneden bağımsız method oluşturmak -. Tek dikkat edilmesi gereken static methodlar içinde de static değişkenler kullanılması gerekmektedir .

Farklı bir static anahtar kelimesi kullanımı ise "static kod bloklarıdır" . Genellikle oluşturulan static değişkenlere ilk değerlerini atamak için kullanılırlar ve bu static blokları  nesne oluşturulmadan hemen önce çalışır .

public final class Nesne {

 public static int id = 0;
 
 public Nesne() {
  System.out.println("constructor");
  id++;
 }
 
 static
 {
  System.out.println("static blok");
  id=10;
 }
}
public class Main {

 public static void main(String[] args) {

  System.out.println("main");
  
  Nesne nesne1 = new Nesne();
  System.out.println(nesne1.id);
  
  Nesne nesne2 = new Nesne();
  System.out.println(nesne2.id);
  
  Nesne.id = 10;
  System.out.println(nesne2.id);
 }
}
Sonuç : main
static blok
constructor
11
constructor
12
10
Kısacası bir sınıf için genel bir değişken oluşturulmak istendiğinde static anahtar kelimesi kullanılmalıdır . Son olarak bir statik sınıftan sadece static değer ve methodlara erişilebilir . Aksi halde instance alınması gerekmektedir .

Dipnot : public static void main() in static olmasının nedeni kodun JVM e ilk yüklenme anında ortada herhangi bir nesne olmaması ve nesne yaratmadan methodun kullanılmasının tek yolunun static olarak tanımlanmasıdır .

5 Mart 2015 Perşembe

The connection to adb is down, and a severe error has occured

       

 "The connection to adb is down, and a severe error has occured" hatası , nedenini hala anlayamadım ama çözümü gayet basit :)

1) Eclipse , genymotion ya da alakalı ne varsa kapatın .

2) "\adt-bundle-windows-x86_64-20140321\sdk\platform-tools" adresine gidin ve shift tuşuna basılı tutarak sağ tıklayın "Open comman window here " veya "command prompt u burada aç" tarzı sekme görüceksiniz tıklayın .

3) "adb kill-server" yazın enter a basın ardından "adb start-server" yazıp enter a basın

4) Tekrar eclipse veya ne kullanıyorsanız açıp kaldığınız yerden devam edebilirsiniz .

Observer Design Pattern

          Observer design pattern , türkçe karşılığı gözlemci tasarım kalıbı olup temelinde de gözlemcilerin hepsini tek bir komutla haberdar etme , işlem yaptırma veya harekete geçirme gibi işlemler için kullanılır . Yani elimizde bir nesne olduğunu düşünelim , bu nesne değiştiğinde gereken diğer tüm sınıf ya da methodlara haber verilir . Yani bu nesneyle ilgilenen sınıflar sürekli nesne değişti mi sormaktansa -thread başlatıp nesnenin değişimi gözlemlenebilir - , nesne değiştiğinde tüm sınıflara haber vermek için oluşturulan bir ara sınıf daha mantıklı bir çözüm gibi duruyor .

           Aşağıdaki örnekte daha iyi anlaşılması için tüm operatörlere mesaj atan bir program yapılmıştır . Kodda sadece bir satırlık kodla her sınıf için tek tek yazılması gereken kod yazılması sağlanmıştır .-3 farklı operatöre ayrı ayrı mesaj atmaktansa tek bir satırla 3 operatöre mesaj atmak-

package com.gurk.designpatterns;

import java.util.ArrayList;
import java.util.List;

public class Islem {

 private List list = new ArrayList<>();
 private String message;

 public void observerEkle(Observer observer) {
  list.add(observer);
 }

 public void tumKullanicilaraGonder() {
  for (Observer observer : list) {
   observer.mesajGonder();
  }
 }

 public String getMessage() {
  return message;
 }

 public void setMessage(String message) {
  this.message = message;
  tumKullanicilaraGonder();
 }

}
package com.gurk.designpatterns;

public abstract class Observer {

 /** 
  * alttaki sınıflar kullanacak diye bir tane Islem tanımla 
  */
 
 protected Islem islem;

 public abstract void mesajGonder();

}
package com.gurk.designpatterns;

public class Avea extends Observer {

 public Avea(Islem islem) {
  // this.islem = observer sınıfının parametresi
  this.islem = islem;
  this.islem.observerEkle(this);
 }

 @Override
 public void mesajGonder() {
  System.out.println(islem.getMessage()+" AVEA lı");

 }

}
package com.gurk.designpatterns;

public class Turkcell extends Observer{
 
 
 public Turkcell(Islem islem) {
  
  this.islem=islem;
  this.islem.observerEkle(this);
 }
 
 @Override
 public void mesajGonder() {
  System.out.println(islem.getMessage()+" TURKCELL li");
  
 }

}
package com.gurk.designpatterns;

public class Vodafone extends Observer {

 public Vodafone(Islem islem) {
  this.islem = islem;
  this.islem.observerEkle(this);
 }

 @Override
 public void mesajGonder() {

  System.out.println(islem.getMessage() + " VODAFONE lu");
 }

}
package com.gurk.designpatterns;

public class Test {

 public static void main(String[] args) {
  
  Islem islemler = new Islem();
  
  new Turkcell(islemler);
  new Avea(islemler);
  new Vodafone(islemler);
  
  islemler.setMessage("Merhaba");
  
 }
 
}
Sonuç

Merhaba TURKCELL li
Merhaba AVEA lı
Merhaba VODAFONE lu


          Kısaca kodu açıklamak gerekirse aynı işlemi gerçekleştirecek olan tüm sınıflar observer sınıfı altında toplanmıştır .  islemler.setMessage("STR"); komutu çağırılığında ise listte tutulan tüm observerler tetiklenip ortak olan methodların çağrılması sağlanmıştır .

26 Aralık 2014 Cuma

Stack - Yığıt - Yığın

          Stack sınıfı nesnelerin LIFO (last-input-first-output) yapısıyla depolanmasını sağlayan bir veri tipidir. Yani nesnelerinizin üst üste depolandığını varsayarsanız ilk nesneniz altta , eklediğiniz yeni nesneler onun üstüne şeklinde devam eden bir yapısı vardır . Örnek vermek gerekirse android telefonlarda açılan uygulamalar yığın yapısıyla depolanır . Açık kalan uygulamalarınız geri tuşuna bastıkça yığının en üstündeki yani kullandığınız bir önceki uygulamaya geçerek devam eder .

           Stack sınıf içinde 5 tane method bulunmaktadır .


  • E peek() : Yığının en üstündeki nesneyi gönderir . 

  • E pop() : Yığının en üstündeki nesneyi gönderir . Peek den farkı burada öğe silinir , peek de silinmez göstermek amaçlı kullanılır .

  • E push(E item) : Gelen nesneyi yığının en üstüne koyar . 

  • int search(Object o) : Verilen nesnenin yığında kaçıncı sırada olduğunu söyler . Saymaya son girenden başlar . Değer yoksa -1 gönderir .

  • boolean empty() : Yığının boş olup olmadığını kontrol eder. 

Aşağıda daha açıklayıcı olması açısından basit bir örnek yapılmıştır .

import java.util.Stack;


public class Driver {

 public static void main(String[] args) {
  
  // stack sınıfından instance alındı
  Stack stack = new Stack<>();
  
  // initialize methodu çağrıldı ve push methoduyla yığın dolduruldu 
  initialize(stack);
  
  // peek = en üstteki nesneyi bul
  stack.peek();
  String peek = stack.peek();
  System.out.print("\n En Tepede "+peek);
  printStack(stack);
  
  
  stack.pop();
  printStack(stack);
  
  // search = nesnenin sırasını bul
  System.out.println(stack.search("D"));
  System.out.println(stack.search("L"));
  
  
 }

 public static void initialize(Stack stack) {
  //push = yığına nesne ekle
  stack.push("A");
  printStack(stack);
  stack.push("B");
  printStack(stack);
  stack.push("C");
  printStack(stack);
  stack.push("D");
  printStack(stack);
  stack.push("E");
  printStack(stack);
 }

 private static void printStack(Stack stack) {
  // isEmpty = yığın boş mu kontrol et
  if(!stack.isEmpty())
   System.out.printf("\n%s ",stack);
  
   
 }
 
 
}
[A] 
[A, B] 
[A, B, C] 
[A, B, C, D] 
[A, B, C, D, E] 
 En Tepede E
[A, B, C, D, E] 
[A, B, C, D] 
1
-1

12 Aralık 2014 Cuma

Final Anahtarı Kelimesi



          Birçok yazılımcının göz ardı ettiği veya gereksiz gördüğü final anahtar kelimesi ; daha dayanıklı , daha performanslı kodlar yazmada çok büyük katkısı olan bir terimdir .Genel tanımıyla methodlarınız veya değerleriniz sabit kalması değiştirilmemesi için kullanılan bir anahtardır diyebiliriz . Kullanımını tamamen yazılımcıya bağlıdır ve 4 farklı yapı için kullanılabilir .


  1. Final Sınıf
  2. Final Method
  3. Final Sınıf Değişkeni
  4. Final Method Değişkeni




1. Final Sınıf

        Eğer yazdığınız sınıfınızı başka bir sınıf tarafından kalıtılmasını istemiyorsanız sınıfınız başına final kelimesini eklemeniz yeterli . Aşağıda final class extend edilmeye çalışılmış ve hata alınmıştır .



2. Final Method

             Eğer yazdığınız methodun başka classlar tarafından kalıtılmasını istemiyorsanız methodun başına final kelimesi ekleyebilirsiniz . Bir nevi burada abstract kelimesinin tersi olarak çalışıyor diyebiliriz . -abstract methodlar alt classlarda kalıtılması zorunludur - . Aşağıda final method override edilmeye çalışılmış ve sonucunda hata alınmıştır.





3. Final Sınıf Değişkeni

          Final sınıf değişkenleri genellikle yazılan sınıf içinde hiç değişmemesi gereken "pisayısı , e sayısı" gibi değişkenler için kullanılır . Sonrasında herhangi bir artırım işlemi veya değiştirilme olmaması garantilenir . Aşağıda final bir değer artırılmaya çalışılmış ve hata alınmıştır .


4. Final Method Değişkeni

          Final method değişkeni ise methoda gönderilen değerin method içinde değiştirilmemesi garantisi verir . Aşağıda final method değişkeni değiştirilmeye çalışılmış ve sonucunda hata alınmıştır.




          Kısaca final anahtar kelimesi herhangi bir kullanım zorunluluğu olmayan fakat kullanıldığı zaman kodun çakılmasını engelleyebilecek hamleler yaptırabilen bir jokerdir .