17 Ağustos 2011 Çarşamba

Eclipse intelisense'in çıldırtan yavaşlığına çözüm - Solution for maddening slow performance of eclipse intelisense

Merhaba,

Eclipse ile android uygulaması geliştirirken zaman zaman intelisense'in uzun süreli donmalarına maruz kalmışsınızdır. Bunun nedeni, bug raporunda belirtildiği üzere dizi hesaplamalarındaki algoritma değişikliğiymiş. Bu can sıkıcı problemden kurtulmak için (eclipse 3.7 versiyonu) linkteki dosyayı indirip eclipse içindeki plugins klasörüne atmanız yeterli.

ENG: You may have noticed that eclipse just freezes when you are typing the letters followed by the (.) period while using auto completion feature with Android SDK plugin. This is caused by the change of algorithm which calculates the ranges as described in this bug report. This has been fixed for eclipse 3.7 version, but since it is still in milestone releases, it does not have support for Android SDK. Applying the fix is easy, you just replace org.eclipse.jdt.core_3.6.1.v_A68_R36x.jar inside your Eclipse plugins folder with the file provided in the above message. Here is the link:

http://adt-addons.googlecode.com/svn/patches/org.eclipse.jdt.core_3.6.1.v_A68_R36x.zip

İyi çalışmalar

15 Ağustos 2011 Pazartesi

StateListDrawable kullanarak kendi checkbox'ınızı yaratın. Create your own checkboxes with using StateListDrawable.

Merhaba,

Üzerinde çalıştığım bir projede dinamik oluşturduğum checkboxların theme üzerinde gözükmemesi ancak checked edildikten sonra fark edilmesi problemiyle karşılaştım. Bu sorunu gidermek için theme'i değiştirebilirdim ancak bu pek işime gelmedi, bende statelere göre checkboxların render edildiği imageleri değiştirme yoluna gittim. Umarım işinize yarar.
(Last day I came across a problem while using checkbox object. After that i decided to create my own custom checkbox then this morning i did it and wanted to share with you guys. With the code as can be seen below you can create your own custom checkbox too. What you need is paying some attention to StateListDrawable concept. I hope it will be remarkable detail for you.)

CheckBox myCheckbox = new CheckBox(this);
StateListDrawable stateList = new StateListDrawable();
int statePressed = android.R.attr.state_pressed;
int stateChecked = android.R.attr.state_checked;
stateList.addState(new int[] {-stateChecked}, new BitmapDrawable(BitmapFactory.decodeResource(getResources(), R.drawable.unchecked)));
stateList.addState(new int[] {stateChecked}, new BitmapDrawable(BitmapFactory.decodeResource(getResources(), R.drawable.checked)));
stateList.addState(new int[] {statePressed}, new BitmapDrawable(BitmapFactory.decodeResource(getResources(), R.drawable.pressed)));
myCheckbox.setButtonDrawable(stateList);

İyi çalışmalar.

12 Ağustos 2011 Cuma

java.lang.StackOverflowError hatasını neden alırsınız?

Merhaba,

Bu hatayı deadlock durumlarında alırsınız ve bunun 2 nedeni olabilir.

1. Eğer bir method kendi kendini sonsuz kere çağırıyorsa (Recursive methodlar)
private int getX(int b){
    b += 1;
    ...
    ...
    return getX(b);
}

2. Ya da birinci method ikinci methodu çağırırken ikinci method içindeki herhangi bir satır birinci methodu çağırıyorsa.

İyi çalışmalar


11 Ağustos 2011 Perşembe

Caused by: java.lang.IllegalStateException: (conn# 0) already closed - close() was never explicitly called on database

Merhaba,

Başlıkta 2 farklı hata görmektesiniz. SqliteOpenHelper'dan extend ettiğiniz db class'ındaki tüm sql işlemlerinde cursor'ı kapatmış olsanız dahi -ki bu bizzat benim yaşadığım problemdi- close() was never explicitly called on database hatasını alabilirsiniz. İlginç olan şey debug ederken bu hatayla karşılaşmamanız ve hatta hata geliyor olsa bile (logcat'ten gözlemleyebilirsiniz) uygulamanın çalışmaya devam ediyor olması. Bu problemi çözmek için cursor.close() işlemi sonrası db'yi de close ettiğimde ise doğal olarak tekrar tekrar db'yi açmamız gerekliliğiyle karşılaştım. Sonuç olarak bunların ikisini de bertaraf edecek bir çözümü sizinle paylaşacağım. Genellikle onDestroy eventinde cursor'ın ve/veya db'nin close edilmesi tavsiye edilmiş. Ancak gitmekte olduğunuz class her zaman bir activity olmayabilir. Ben hem daha farklı hem de hepimizin neredeyse her uygulamada kullandığı çakma bir factory pattern ile bu soruna çözüm getirebileceğimizi göstereceğim.

Anlaşılmayan nokta olursa yorum yazabilirsiniz.

Aşağıda ürünler ile ilgili db işlemlerini gerçekleştiren bir class'ımız var. Herhangi bir aktivitide yapılan bir işlemde ürün bilgisi getirilecek varsayıyoruz.

public class UrunMgr {
    private static UrunMgr instance;
    Context context;
    private SQLiteDatabase db;

    // constructor
    private UrunMgr(Context context) {
        this.context = context;
        DBHelper helper = new DBHelper(context);
        this.db = helper.getWritableDatabase();
    }

    public static UrunMgr getInstance(Context context) {
        if(instance == null) {
            instance = new UrunMgr(context);
        }
        return instance;
    }

    public Urun getUrunByTip(String urunTipi)
        Urun oUrun;
        Cursor cursor;
        try {
        cursor = db.query(MyConstants.TBL_URUNLER, new String[] {
"_id", "Urun", "Ad", "Ord"}, "Urun = '" + urunTipi + "'", null, null, null,
null, null);

        cursor.moveToFirst();
        if (!cursor.isAfterLast()) {
            do {
                oUrun = populateList(cursor);
            } while (cursor.moveToNext());
        } else {
            oUrun = null;
        }
        cursor.close();
        } catch (SQLException e) {
            Log.e("UrunMgr - getUrunByTip() db hatası alındı: ", e.toString()); e.printStackTrace();
        }

        return oUrun;
    }
}


cok basit anlamda başka bir activity'den UrunMgr class'ı içindeki herhangi bir methodu call etmek için;

Urun urun = UrunMgr.getInstance(this).getUrunByTip("1");

Yukarıdaki örnekte, singleton'a benzer bir yapı ile (çakma factory pattern dedik) constructor'ın private'a çekildiğini, bu sayede tüm çoklama işlemlerinin getInstance methodu üzerinden yapıldığını, dolayısıyla tekrar tekrar UrunMgr class'ının yaratılmadığını (multi-thread hariç) basitçe anlatmaya çalıştım. Dediğim gibi anlaşılmayan bir nokta olursa yorum bölümünden ulaşabilirsiniz, iyi çalışmalar.

9 Ağustos 2011 Salı

Eclipse Shortcuts (Kısayolları)

http://www.allapplabs.com/eclipse/eclipse_shortcuts.htm adresinden alıntılanmıştır. Sık kullanabileceğinizi düşündüğüm kısayolları türkçeye çevirip koyuyla belirttim. (Ctrl+Shift+L ile hızlıca kısayollar menüsüne ulaşmanız da mümkün.)

vigational Shortcuts
F10Main menu (Ana Menü)
Shift F10Context menu (Sağ Click)
Ctrl F10View menu (Breakpoint koyulan alanda sağ click)
Workspace navigation
F12Activate editor (Kod alanını aktifleştir)
Ctrl+Shift+WSwitch editor (Editörler arası geçiş)
Ctrl F6Next editor (Sonraki editör) 
Ctrl Shift F6Prev editor (Önceki editör)
Ctrl F7Next workspace (Sonraki workspace)
Ctrl Shift F7Prev workspace (Önceki workspace)
Ctrl F8Next perspective (Sonraki perspektif [Java-Debug hızlı geçiş için])
Ctrl Shift F8Prev perspective (Önceki perspektif)
Alt LeftBack (Editörler arası sola doğru dolaşma)
Alt RightForward (Editörler arası sağa doğru dolaşma)
Files
Alt Shift SSource (veya sağ click source)
Ctrl Shift RJump to file (Dosyaya atla)
Ctrl NNew file (Yeni dosya)
Ctrl SSave file (Dosyayı kaydet)
Ctrl Shift SSave all files (Hepsini göster)
Ctrl F4Close file (Dosyayı kapat)
Ctrl Shift F4Close all files (Tümünü kapat)
Find
Ctrl LGoto line (Satıra git)
Ctrl FFind (Bul)
Ctrl JIncremental find (İleriye doğru tek tek bul)
Ctrl Shift JIncremental find prev (Geriye doğru tek tek bul)
Ctrl KFind next (Sonrakini bul)
Ctrl Shift KFind prev (Öncekini bul)
Ctrl HSearch workspace (Ara)
Ctrl (dot)Navigate next 
Ctrl (comma)Navigate prev
Java navigation
F3Goto declaration
Ctrl Shift UFind references in file (Açık ekran içinde nesnenin referanslarını bul)
Ctrl Shift GFind references in workspace (Tüm proje içinde nesnenin referanslarını bul)
Ctrl GFind declarations in workspace
Ctrl Shift PNavigate to matching bracket/brace
Ctrl TPopup type hierarchy
Ctrl Shift TOpen Type
Ctrl OOutline of current source
Ctrl F3Outline of current cursor position
Ctrl Shift ArrowJump beetween methods up or down
F2Show Javadoc
F4Show hierarchy
Ctrl Alt HOpen call hierarchy
General editing
Alt ArrowMove line(s) up or down 
Alt Shift UpExpand selection to enclosing element (Kapsandığı elemana kadar seçimi genişlet)
Alt Shift RightExpand selection to next element
Alt Shift LeftExpand selection to previous element
Alt Shift DownRestore previous selection (Önceki seçime dön)
Ctrl Alt ArrowDuplicate line(s) up or down (Alt satıra kopyala)
Shift EnterInsert line below (Satır atla devam et)
Ctrl Shift EnterInsert line above (Alta satır ekle, atlamadan devam et)
Ctrl DDelete line (Satır sil)
Ctrl Shift QToggle Quick Diff
Ctrl Shift YConvert to lowercase 
Ctrl Shift XConvert to uppercase
Java editing
Alt Shift URemove occurrence annotations (Notasyonları kaldır)
Ctrl 1Quick fix (works even when there are no errors
Ctrl Shift MAdd import (Namespaceleri ekle)
Ctrl Shift FReformat (Yeniden formatla)
Ctrl Shift OOrganize Imports (Kullanılmayan namespaceleri kaldır, gerekli olanları ekle)
Ctrl /Comment
Ctrl \UnComment
Ctrl Shift SpaceParameter hints (Değişkenin alabileceği değerler)
CtrlHyperlink identifier
Ctrl ICorrect indentation
Shift SpaceIncremental content assist
Debugger
F5Step into (Methodun içine girerek devam et)
F6Step over (Satır satır devam et)
F7Run to return (Sonraki breakpoint'e git)
F8Resume (Devam et)
F9Relaunch last (Sonuncuyu yeniden aç)
F11Run/debug last 
Ctrl F11Run (Çalıştır)
Ctrl Shift BToggle breakpoint (Breakpoint koy/kaldır)
Ctrl DDisplay
Ctrl QInspect (İncele)
Ctrl RRun to line (Satıra git)
Ctrl URun snippet
Refactoring
Alt TRefactoring menu
Ctrl Shift ZUndo refactor
Ctrl Shift YRedo refactor
Alt Shift RRename
Alt Shift VMove
Alt Shift IInline
Alt Shift MExtract method (Method oluştur)
Alt Shift LExtract local (Field oluştur)
Alt Shift CChange method signature (Method dönüş tipini değiştir)
Misc
F5Refresh
F1Infopop
F2Show resizeable hover

5 Ağustos 2011 Cuma

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

[2011-08-05 13:26:44 - Quadro_Android] Android Launch!
[2011-08-05 13:26:44 - Quadro_Android] The connection to adb is down, and a severe error has occured.
[2011-08-05 13:26:44 - Quadro_Android] You must restart adb and Eclipse.
[2011-08-05 13:26:44 - Quadro_Android] Please ensure that adb is correctly located at 'C:\PROGRA~1\Android\android-sdk\platform-tools\adb.exe' and can be executed.

Hatayı gidermek için aşağıdaki adımları izleyin

1. Eclipse'i kapatın
2. Command prompt'ta platform-tools adresine gidin (bendeki bu şekilde ama sizdeki farklı olabilir C:\Program Files\Android\android-sdk\platform-tools>)
3. adb kill-server yazın
4. adb start-server yazın
5. Eclipse'i yeniden başlatın.

4 Ağustos 2011 Perşembe

java.lang.SecurityException: Permission Denial

ActivityManager: java.lang.SecurityException: Permission Denial: starting Intent { act=android.intent.action.MAIN cat=[android.intent.category.LAUNCHER] flg=0x10000000 cmp=com.quadro.main/.Main } from null (pid=3080, uid=2000) not exported from uid 10066

Bu hata emulator'de karşınıza çıkmayıp, cihazda debug ederken gelebilir. O yüzden cihazla alakalı bir problem diye düşünebilirsiniz, ancak hatanın nedeni "bir activity'nin androidmanifest.xml dosyasında 2 kez tanımlanmasından kaynaklanmaktadır". Entry point activity'nizin, altta tekrar diğer activityler ile birlikte tanımlandırılmış olup olmadığını kontrol edin.