【发布时间】:2013-05-04 12:43:20
【问题描述】:
我对如何使用监听器在类和活动之间传递信息有些困惑。
场景是这样的:
我有一个任务,它从 Sqlite 数据库中读取数据并将这些数据放入一个 ArrayList 中,该 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(即数据库处理完成) 下面是代码
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 错误..它是一个空指针异常
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 的 Activity(即处理完成)
请为我指明正确的方向。 - 谢谢
【问题讨论】:
-
您是否检查过 onPostExecute() 是否为您的 AsyncTask 调用。
-
是的,我做到了。我放了一个断点,它只是冻结在调用侦听器的行上。谢谢
标签: android android-asynctask listener