5

リスナーを使用してクラスとアクティビティ間で情報を渡す方法について混乱しています。

シナリオは次のとおり
です。Sqlite データベースからデータを読み取り、このデータを ArrayList に入れ、アダプタに渡して画面に表示するタスクがあります。

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

詳細:
データベース処理は DatbaseRoutines と呼ばれるクラスによって行われ、その内部メソッドは重い作業を行います。メソッドは、メインスレッドを独占しないように AsyncTask を使用しています。

私は作成し、単一のメソッドとのインターフェースを作成しました

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

私の DatabaseRoutines クラスでは、プライベート変数を作成しています

private DatabaseProcessListener dbProcesslistener;

そのためのセッターとともに

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

処理が完了したら、PostExecute メソッドを使用してリスナーを更新し、リスナーの値を True (つまり、db 処理が完了したこと) に変更できるようにします。以下のコードは次のとおりです。

            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エラーが見つかりました..それはnullpointer例外です

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)

残念ながら、アプリはハングしており、インターフェイスはデータを表示するアクティビティを true で更新しません (つまり、処理は完了しています)。

私を正しい方向に向けてください。- ありがとう

4

2 に答える 2

3

dbProcesslistener変数はのように聞こえますNULL。を呼び出す前に、setter を呼び出して、初期化された Listener オブジェクトを渡しますdbProcesslistener.ProcessingIsDone(true);か?

于 2013-05-05T08:33:48.500 に答える
3

答えが出ました!呼び出し元のクラスでリスナーを初期化していませんでした。私がする必要があったのは、この行に入れることだけでした

db.setDbProcesslistener(this);

すなわち

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

そしてそれは働き始めました。

見て、解決策を考えようとしたすべての人に感謝します:)

于 2013-05-05T08:40:01.907 に答える