リスナーを使用してクラスとアクティビティ間で情報を渡す方法について混乱しています。
シナリオは次のとおり
です。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 で更新しません (つまり、処理は完了しています)。
私を正しい方向に向けてください。- ありがとう