Инициирующее событие, когда AsyncTask завершает работу с использованием Listener
У меня путаница в том, как использовать Слушатели для передачи информации между уроками и занятиями.
Сценарий таков:
У меня есть задача, которая читает данные из базы данных 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 (т. Е. Выполняется обработка дб). Ниже приведен код
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)
К сожалению, приложение зависает, и интерфейс никогда не обновляет Activity, которая отображает данные с true (то есть обработка завершена)
Направь меня в правильном направлении. - Спасибо