Soru & Cevap

Android Observer Design Pattern

13.02.2014 - 11:56

Merhaba arkadaşlar non ui class ile activity arasında haberleşme sağlamak için observer design pattern olduğunu gördüm bi kaç exampleye baktım kendim uygulamaya çalıştım fakat olmadı.Hatam nerede var anlayamadım.

[code]public class ConnListener extends Observable 
implements ConnectionListener {
    public ConnListener() {
    }

    /* bağlantı benim tarafımdan disconnect edilirse */
    @Override
    public void connectionClosed() {
        // bağlantıyı kendim kapattığım için yapılacak bir işlem yok
    }

    /* bağlantı benden bağımsız disconnect edilirse */
    @Override
    public void connectionClosedOnError(Exception e) {
        setChanged();
        notifyObservers();
        System.out.println("observer bilgilendirdi");
    }

    /* belli bir saniyede reconnect olursa */
    @Override
    public void reconnectingIn(int s) {
        Log.d("eylem", "reconnectingIn " + s);
    }

    /* servere yeniden bağlanma başarısız olursa */
    @Override
    public void reconnectionFailed(Exception e) {
        Log.d("eylem", "reconnectionfailed " + e.getMessage());
    }

    /* servere yeniden bağlanma başarılı olursa */
    @Override
    public void reconnectionSuccessful() {
        Log.d("eylem", "reconnectionsuccesfull");
    }
}

[/code]

bu class sunucu bağlantılarını dinliyor ve bağlantı koparsa connectionclosedonerror methoduna düşüyor bende burda observer ile bilgilendirme yapıyorum ve register ettiğim activityde bağlantı düştü tarzı loglamaya çalışıyorum.Activityde şu şekilde:

[code]

public class MainList extends ActionBarActivity implements
SearchView.OnQueryTextListener, LocationListener, Observer {
    ConnListener connListener;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        connListener = new ConnListener();
        connListener.addObserver(this);
        ...
        ....
        ...
        ....
    }

    @Override
    protected void onDestroy() {
        connListener.deleteObserver(this);
        super.onDestroy();
    }

    @Override
    public void update(Observable observable, Object data) {
        Log.d("observer", "bağlantı düştü");
    }
}

[/code]
208 Görüntülenme

2 Cevap

Sitedeki sorulara cevap verebilmek için giriş yapın ya da üye olun.

picture-12244-1392330775.png
olkun.mustafa
14.02.2014 - 01:16

observer design pattern ilk defa gördüm. Server klasik bağlantı yöntemlerine göre avantajları var mı acaba ?

picture-1372-1408467635.jpg
ahmtbrk
13.02.2014 - 04:12

Sorunuma çözüm buldum.ConnListeneri register ederken başka instance observeri açarken başka instance kullandığımdan oluyormuş singleton deseni kullanarak tek instance elde ettim sonrada hem bağlantıyı dinlerken hemde observeri register ederken aynı instanceyi kullandım problem düzeldi.fakat sayfada alertdialog açtırmak istiyorum hata basıyor bu hatayı çözemedim bi türlü:S

http://aarcoraci.wordpress.com/2012/11/22/android-simple-sync-manager-using-observer-pattern/

Şu örnektende yararlanılabilir konu hk.

Dialog create ederken

android.view.WindowManager$BadTokenException: Unable to add window -- token null is not for an application bu hatayı alıyorum

[code]

    public static void mShowErrorAlertDialog(final Context context,
            String title, String message, String button1Text) {
        try {
            AlertDialog.Builder alertDialogBuilder = new AlertDialog.Builder(
                    context);
            alertDialogBuilder.setTitle(title);

            alertDialogBuilder
                    .setMessage(message)
                    .setCancelable(false)
                    .setIcon(R.drawable.warning2)
                    .setPositiveButton(button1Text,
                            new DialogInterface.OnClickListener() {
                                @Override
                                public void onClick(DialogInterface dialog,
                                        int id) {
                                    Intent intent = new Intent(context,
                                            LoginActivity.class);
                                    intent.addCategory(Intent.CATEGORY_HOME);
                                    intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
                                    context.startActivity(intent);
                                    ((Activity) context).finish();
                                }
                            });

            AlertDialog alertDialog = alertDialogBuilder.create();
            alertDialog.show();
        } catch (NullPointerException e) {
            e.printStackTrace();
        }
    }

[/code]

dialog kodumda bu 

Ahmet Burak Demirkoparan
13.02.2014 - 04:20
dialog olustururken context yerine getApplicationContext veriyordum yukarda global mContext tanımlayıp onCreatede this parametresi verip onu set ettim dialogda çalıştı.Yararlanmak isteyen arkadaşlar bakabilir.