Geleceği Yazanlar Blog
RSS Beslemesi

Activity ve Fragment Çağırmanın Doğru Yöntemi

Burhan Aras

Bugüne kadar gördüğüm Android projelerinin çoğunda en sık karşılaştığım hata yeni  Activity ve Fragmentların  yanlış çağrılmasıdır.  

Activity ve Fragmentlar uygulamanın ekranlarını temsil ettiği için önemli bir yeri vardır. Bu nedenle bu aşamada yapılan yanlış kullanımlar tüm uygulamamızın ileride spagetti koda dönüşmesi yönünde atılan ilk adımlardan biri olur.

Yazılım dünyasında tek bir mutlak doğru yoktur fakat bir işi yapmanın otoritelerce kabul görmüş yolları vardır. Yeni Activity ya da Fragment çağırmanın doğru yollarını görmeden önce yapılan hatalı çağrımları inceleyelim.

 

Hatalı Uygulama 1

HomeActivity.user = user;
Intent intent = new Intent(LoginActivity.this, HomeActivity.class);
startActivity(intent);

 

Özellikle yeni başlayan arkadaşların en sık başvurdukları yöntemdir. Çağıracağınız Activity içerisinde static bir değişken tanımlayıp sonrasında Activity' i çağırmak. Unutulmamalıdır ki static değişkenler uygulamanın test edilmesini zorlaştırır. Ayrıca bu Activity' i çağırması gereken client her seferinde bu static değişkene değer vermesi gerektiğini bilemez. Bu nedenle bu yöntemden vazgeçilmelidir.

 

Hatalı Uygulama 2

private static final String KEY_USER = "KEY_USER"; 

Intent intent = new Intent(this, HomeActivity.class); 
intent.putExtra(KEY_USER, user); 
startActivity(intent);

 

İlkine göre daha iyi denebilir ama hala hatalıdır. Çünkü  KEY_USER  isimli String' in aynısından HomeActivity içerisinde de oluşturmamız gereklidir. Ayrıca HomeActivity' i çağıran tüm sınıflar içinde de yine bu String tanımlanmalıdır. Gereksiz kod tekrarı, yönetilmesi zor key-value çiftleri... Ayrıca yazım hatası oluşması durumunda hatalara çok açıktır.

 

Hatalı Uygulama 3
 

Intent intent = new Intent(this, HomeActivity.class);
intent.putExtra(HomeActivity.KEY_USER, user); 
startActivity(intent);

Bir önceki hatadan ders çıkarıyoruz. KEY_USER   isimli String' i HomeActivity içerisine alıyoruz. Bu durumda HomeActivity' i çağıran her sınıf içerisinde tanımlı olması gerekmez. Fakat bu durumda da HomeActivity içerisindeki bu String' e bağımlı hale geliriz. HomeActivity' i çağırırken key olarak bu String' i kullanmamız gerektiğini nereden bilebiliriz ki? Bu durum da ileride muhtemel hatalara davetiye çıkaracaktır.

 

Hatalı Uygulama 4

Intent intent = new Intent(this, HomeActivity.class); 
intent.putExtra(Constants.KEY_USER, user); 
startActivity(intent);

Uygulama geliştiriken çok severek oluşturduğumuz, şifre, kullanıcı adı, key gibi ne kadar sabit değer varsa neredeyse hepsini içine yazdığımız meşhur Constants class' ına hoşgeldiniz.  Hemen her projede vardır mutlaka. Son çare olarak  KEY_USER  String' ini Constants sınıfı içerisine tanımladık fakat bu malesef doğru değildir. Hangi key' i çağırmamız gerektiğini  bize birldirmediği gibi bizi bu sınıfa gereksiz şekilde baağımlı kılar.

 
Nihayet Doğru Uygulama

Nihayetinde doğru yol aslında hiç key kullanmamaktır. Parametre olarak yollayacağımız nesneyi de key kullanmadan, doğrudan yollamaktır. Bu yöntemin adı Static Factory Method' dur.  Lafı uzatmadan doğru yolu gösterelim, açıklamasını sonra yaparız.

Intent intent = HomeActivity.newIntent(LoginActivity.this, user); 
startActivity(intent);

Bu  şekilde çağırısak HomeActivity' i key dediğimiz Stringleri yönetmek zorunda kalmayız. HomeActivity içinde de bize Intent döndüren newIntent() metodunu tanımlıyoruz.

 

public class HomeActivity extends AppCompatActivity {

    private static final String KEY_USER = "KEY_USER";

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_home);

        User user = getIntent().getParcelableExtra(KEY_USER);
        if (user != null) {
            Log.d(TAG,user.toString());
        }
    }
    
    public static Intent newIntent(Activity callerActivity, User user){
        Intent intent=new Intent(callerActivity, HomeActivity.class);
        intent.putExtra(KEY_USER, user);
        return intent;
    }
}

 

Bu yöntemin asıl adı Static Factory Method' dur.  Joshua Bloch' un yazdığı,  yazılım dünyasındaki en popüler kitaplardan biri olan Effective JAVA kitabında birinci madde olarak anlatılmaktadır. Bu kitabı da mutlaka okumanızı tavsiye ederim.

 

Fragmentlar Çağrılırken

Fragmentlar için de benzer şekilde static factory method kullanarak  parametre gönderebiliyoruz.

    public static BlankFragment newInstance(String param1, String param2) {
        BlankFragment fragment = new BlankFragment();
        Bundle args = new Bundle();
        args.putString(ARG_PARAM1, param1);
        args.putString(ARG_PARAM2, param2);
        fragment.setArguments(args);
        return fragment;
    }

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        if (getArguments() != null) {
            mParam1 = getArguments().getString(ARG_PARAM1);
            mParam2 = getArguments().getString(ARG_PARAM2);
        }
    }

 

Joshua Bloch'un Effective Java kitabını okumanızı tekrar tavsiye ederim.

Hoşçakalın.

Yorumlar

  1. bıraz kafam karıstı ama okuyup yapmak kolay teşekkürler

  2. Güzel anlatım :)

Yorum ekle

Yorum yapmak için giriş yapın veya üye olun.