2013-05-04 31 views
5

リスナーを使用してクラスとアクティビティの間で情報をやりとりする方法が混乱しています。リスナーを使用してAsyncTaskが完了したときのトリガーイベント


私はSqliteデータベースからデータを読み込んで、このデータをアダプタに渡して、それを画面に表示するArrayListにこのタスクを置きます。

質問:
リスナーインターフェイスを値で更新しようとすると、アプリケーションがクラッシュします。それはlogcatに何も表示されません...それはちょうどアプリをハングアップします。 誰かが間違っているところを親切に指摘できますか? - ありがとう

詳細:
私はデータベース処理をDatbaseRoutinesと呼ばれるクラスで行い、その内部メソッドは重い持ち上げをしています。このメソッドはAsyncTaskを使用してメインスレッドを掘り起こさないようにしています。

私はそれ

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

用セッターと一緒にプライベート変数

private DatabaseProcessListener dbProcesslistener; 

を作成しています私のDatabaseRoutinesクラスでは、単一の方法で

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

を作成し、インターフェイスしています処理が完了すると、私はPostExecuteメソッドを使ってListenerを更新します。以下 (そのDB処理が行われるIE)をTrueにリスナーの値を変更コードIは、リスナーを実装し、データベースから収集されたデータを表示する活動で最後

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

あります。下記参照。私はlogcatは、nullポインタ例外

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) 

をerror..its残念ながらアプリがハングしているとのインタフェースが真でデータを表示する活動を更新したことがない(つまり、処理が行われたいくつかの掘削後

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

私は正しい方向に向いています。 - ありがとう

+1

を考えてみました誰にでも

おかげで、あなたのAsyncTaskのために呼ばれました。 – Anirudh

+0

はい、私はしました。私はブレークポイントを置くだけで、リスナーを呼び出す行にフリーズします。ありがとうございます – KuriaNdungu

答えて

3

回答がありました!私は私の呼び出しクラスでリスナーを初期化していませんでした。私が行うために必要なすべてがこのライン

db.setDbProcesslistener(this); 

すなわち

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

に入れて、それが仕事を始めました。()見ていたし、あなたがonPostExecuteかどうかを確認しましたソリューション:)

+0

@ KuriaNdungu - DIDの仕事を投稿していただきありがとうございます。すべての人がこのテクニックを適用しようとすることができるあなたのコードを十分に示してくれている罰金罰金についても、ありがとうございます。 – DSlomer64

+0

ああ、マン!!!!!!私がしたのは、@ Kuriaのコードの3番目と5番目のハンクを私のアプリに切り取って貼り付け、自分の 'onPostExecute'を' dbProcessListener.ProcessingIsDone(true); 'という行に変更してから、私は目を覚まし、私の 'app'に合うように彼の行に貼り付けました:' dbc.setDbProcesslistener(this); 'それは働いていました。非常に重要な技術のこの例を検討してください。 SUPER JOB、Kuria !!これは代表的なSO Qと(USER'S!)作業A! – DSlomer64

+0

@ DSlomer64 1)質問2)upvote erythang 3)賞金を出してそれをクリアに渡す。 – Will

3

のような音はNULLです。 dbProcesslistener.ProcessingIsDone(true);を呼び出す前に、セッターを呼び出して初期化されたListenerオブジェクトを渡しますか?

+0

ありがとうございます。それは実際には問題でした。私は呼び出す前に初期化していませんでした。 – KuriaNdungu

+0

忘れてしまった。さて完了:) – KuriaNdungu