2013-05-04 26 views
5

我對如何使用Listeners在類和活動之間傳遞信息存在一些混淆。使用Listener完成AsyncTask的觸發事件

這種情況是這樣的:
我有一個任務,從Sqlite數據庫中讀取數據,並將這些數據放入一個ArrayList中傳遞給Adapter,然後將其顯示在屏幕上。

問題:
當我嘗試使用值更新偵聽器接口時,我的應用崩潰。它不顯示logcat中的任何內容......它只是掛起應用程序。 有人可以指出我哪裏出錯了。 - 謝謝

詳細信息:
我有一個名爲DatbaseRoutines的類完成數據庫處理,並在其中執行繁重的內部方法。該方法正在使用AsyncTask,以免佔用主線程。

我創建和接口與一個方法

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

在我DatabaseRoutines類我創建一個私有變量

private DatabaseProcessListener dbProcesslistener; 

隨着二傳手它

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

處理完成後,我使用PostExecute方法來更新監聽器,以便這樣做在聽者的值更改爲真(即數據庫處理完成)以下 是代碼

  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); 
        } ; 

終於在顯示來自我實現監聽數據庫中收集的數據的活動。見下文。

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; 
    } 
} 

一些挖我發現logcat的後error..its一個空指針異常

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) 

不幸的是,應用程序是懸掛和接口永遠不會更新顯示與真(即數據處理完成的活動)

請指點我正確的方向。 - 謝謝

+1

的你是否onPostExecute()得到調用了你的AsyncTask。 – Anirudh 2013-05-04 13:09:36

+0

是的,我做到了。我放了一個斷點,它只是在調用偵聽器的行上凍結。謝謝 – KuriaNdungu 2013-05-05 06:35:42

回答

3

已得到答案!我沒有在我的調用類中初始化偵聽器。所有我需要做的是把這個線

db.setDbProcesslistener(this); 

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

,並開始工作。

謝謝大家誰看了一下,並試圖想辦法解決:)

+0

@ KuriaNdungu - 感謝您發佈DID的工作。還要感謝你展示足夠你的代碼的FINE JOB,現在每個人都可以嘗試應用這種技術。 – DSlomer64 2015-09-21 19:55:04

+0

啊,男人!!!!!!我所做的只是精心地將@ Kuria的代碼的第3部分和第5部分粘貼到我的應用程序中,並修改了我自己的'onPostExecute'有一行 - 'dbProcesslistener.ProcessingIsDone(true);'然後我得到了NPE,所以我醒來並粘貼他的行以適應我的'app':'dbc.setDbProcesslistener(this);'並且它工作。研究這個非常重要的技術的例子。超級工作,Kuria!這是示範性的SO Q和(用戶的!)工作A! – DSlomer64 2015-09-21 20:09:53

+0

@ DSlomer64 1)明星的問題2)upvote erythang 3)開始賞金並將其交給Kuria。 – Will 2015-09-22 15:01:53

3

聽起來像dbProcesslistener變量是NULL。在調用dbProcesslistener.ProcessingIsDone(true);之前,您是否調用過setter並將它傳遞給初始化的Listener對象?

+0

謝謝。那實際上是問題。在調用之前我沒有初始化。 – KuriaNdungu 2013-05-05 13:27:51

+0

已經忘記了。現在完成:) – KuriaNdungu 2013-05-05 16:58:01

相關問題