2013-05-04 33 views
5

kullanılarak tamamlandığında tetikleyici olayı Dinleyiciler'in sınıflar ve aktiviteler arasında bilgi aktarımı hakkında nasıl bir kafa karışıklık yaşıyorum. Bir SQLite veritabanından veri okur ve daha sonra ekranda görüntüleyen bir Adaptörü geçirilir bir ArrayList içine bu verileri koyar bir görev var
: AsyncTask, Dinleyici

senaryo

budur.

Soru:
Dinleyici arabirimini bir değerle güncelleştirmeye çalıştığımda uygulamanız çöküyor. Logcat'ta hiçbir şey göstermiyor ... sadece uygulamayı kapatır. Birisi yanlış gittiğimi gösterebilir. - Teşekkürler

Ayrıntılar:
Veritabanının işlenmesi DatbaseRoutines adlı bir sınıf tarafından yapılmış ve bunun içinde ağır kaldırma işlemini yapan bir iç yöntem var. Metot, asyncTask'ı ana iş parçacığını kastetmeyecek şekilde kullanıyor.

Ben o

public void setDbProcesslistener(DatabaseProcessListener dbProcesslistener) { 
    this.dbProcesslistener = dbProcesslistener; 
    } 

için bir ayarlayıcı ile birlikte özel bir değişkeni

private DatabaseProcessListener dbProcesslistener; 

oluşturma Benim DatabaseRoutines sınıfında tek yöntemle

public interface DatabaseProcessListener { 
    public void ProcessingIsDone(boolean blnProcessIsFinished); 
} 

oluşturulan ve Arayüz var İşlem bittiğinde, Dinleyici'yi güncellemek için PostExecute yöntemini kullanıyorum, böylece bunu yapabilirsiniz True olarak dinleyici değeri değiştirin (yani db işleme yapılır yani) aşağıda kod ben dinleyici uygulamak veritabanından toplanan verilerin görüntülenmesi aktivitesinde Nihayet

  protected void onPostExecute(Boolean aBoolean) { 
       super.onPostExecute(aBoolean); 
       dialog.dismiss(); //i have progress dialog during processing and its       
       //closed here 

       if (blnUpdateSucceededStatus) 
       { 
        dbProcesslistener.ProcessingIsDone(true); 
        } 
        else 
        { 
        Toast.makeText(ctx, "Transactions Processing 
        failed",Toast.LENGTH_SHORT); 
        } ; 

olduğunu. aşağıya bakınız. i logcat bulduğumuz bazı kazma sonra

public class MyActivity extends Activity implements DatabaseProcessListener 
{ 

@Override 
public void ProcessingIsDone(boolean blnProcessIsFinished) { 
    if(blnProcessIsFinished){ 
     PopulateExpandableListView(); 
    } 
    public void PopulateExpandableListView() { 
    //code for populating the listview goes here; 
    } 
} 

05-05 11:11:18.590: ERROR/AndroidRuntime(22339): FATAL EXCEPTION: main 
    java.lang.NullPointerException 
    at com.example.mledger.DatabaseRoutines$1.onPostExecute(DatabaseRoutines.java:258) 
    at com.example.mledger.DatabaseRoutines$1.onPostExecute(DatabaseRoutines.java:141) 
    at android.os.AsyncTask.finish(AsyncTask.java:631) 
    at android.os.AsyncTask.access$600(AsyncTask.java:177) 
    at android.os.AsyncTask$InternalHandler.handleMessage(AsyncTask.java:644) 
    at android.os.Handler.dispatchMessage(Handler.java:99) 
    at android.os.Looper.loop(Looper.java:137) 
    at android.app.ActivityThread.main(ActivityThread.java:4921) 
    at java.lang.reflect.Method.invokeNative(Native Method) 
    at java.lang.reflect.Method.invoke(Method.java:511) 
    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1038) 
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:805) 
    at dalvik.system.NativeStart.main(Native Method) 

Maalesef uygulama asılı bir nullpointer istisna error..its ve arayüz asla yapılır gerçek (yani işleme verileri görüntüler Aktivite günceller

Bana doğru yönde işaret et. -

+1

düşünmeye çalıştım herkese

teşekkürler AsyncTask için çağırıldım. – Anirudh

+0

Evet yaptım. Bir kesme noktası koyuyorum ve sadece dinleyiciyi çağıran çizgide donuyor. teşekkürler – KuriaNdungu

cevap

3

Cevabı Aldım! Arama sınıfımdaki dinleyiciyi başlatmıyordum. i yapmak için gerekli tüm bu hat

db.setDbProcesslistener(this); 

yani

DatabaseRoutines db = new DatabaseRoutines(MyActivity.this); 
db.setDbProcesslistener(MyActivity.this); 

konuldu ve çalışmaya başladı.() Bir göz vardı ve OnPostExecute eğer kontrol ettin çözümü :)

+0

@ KuriaNdungu - DID çalışmanın yayınlanması için TEŞEKKÜR EDERİZ. DAHA FAZLA İŞİNİZE DAHA FAZLA BİLGİ ALMAK İÇİN DAHA FAZLA BİLGİ ALABİLİRSİNİZ. – DSlomer64

+0

AH, MAN !!!!!! Tüm yaptığım düşünceli bir şekilde kesmek ve @ Kuria kodu ilk 3 ve 5 hunks yapıştırın benim app içine ve bir satır - 'dbProcesslistener.ProcessingIsDone (true); ve sonra benim NPN, bir satır var kendi" onPostExecute " Ben uyandı ve benim app ': 'dbc.setDbProcesslistener (bu)' için uygun kendi satırında yapıştırdı ve BT çalıştı. ÇOK önemli bir tekniğin bu örneğini inceleyin. SÜPER İŞ, Kuria! Bu örnek SOQ ve (KULLANICI!) A çalışıyor! – DSlomer64

+0

@ DSlomer64 1) soruyu sormak 2) upvote erythang 3) bir ödül başlatmak ve Kuria'ya vermek. – Will

3

dbProcesslistener değişkeni NULL biçimindedir. dbProcesslistener.ProcessingIsDone(true);'u çağırmadan önce ayarlayıcıyı çağırır ve başlatılmış bir Dinleyici nesnesini geçirir misiniz?

+0

Teşekkürler. Aslında sorun buydu. çağırmadan önce başlatılamıyordum. – KuriaNdungu

+0

Unuttun. Şimdi bitti :) – KuriaNdungu