Tôi đang gặp một số nhầm lẫn về cách sử dụng Trình nghe để chuyển thông tin giữa các lớp và hoạt động.Sự kiện kích hoạt khi AsyncTask hoàn tất bằng cách sử dụng Trình nghe
Kịch bản là:
Tôi có nhiệm vụ đọc dữ liệu từ cơ sở dữ liệu Sqlite và đặt dữ liệu này vào ArrayList được chuyển đến Bộ điều hợp rồi hiển thị trên màn hình.
Câu hỏi:
Ứng dụng của tôi gặp sự cố khi tôi cố gắng cập nhật giao diện người nghe bằng một giá trị. Nó không hiển thị bất cứ điều gì trong logcat ... nó chỉ treo ứng dụng. Có thể ai đó vui lòng chỉ ra nơi tôi đang đi sai. - Cảm ơn
Chi tiết:
Tôi có chế độ xử lý cơ sở dữ liệu được thực hiện bởi một lớp gọi là DatbaseRoutines và bên trong nó là một phương thức bên trong thực hiện việc nâng hạng nặng. phương pháp đang sử dụng AsyncTask để không làm hog luồng chính.
Tôi đã tạo ra và giao diện với một phương pháp đơn
public interface DatabaseProcessListener {
public void ProcessingIsDone(boolean blnProcessIsFinished);
}
Trong lớp DatabaseRoutines của tôi đang tạo ra một biến tin
private DatabaseProcessListener dbProcesslistener;
cùng với một setter cho nó
public void setDbProcesslistener(DatabaseProcessListener dbProcesslistener) {
this.dbProcesslistener = dbProcesslistener;
}
Khi xử lý xong, tôi sử dụng phương thức PostExecute để cập nhật Listener để nó có thể thay đổi giá trị trong người nghe là True (tức là chế biến db được thực hiện) dưới đây là mã
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);
} ;
Cuối cùng trong hoạt động hiển thị các dữ liệu thu thập được từ cơ sở dữ liệu Tôi Triển khai người nghe. xem bên dưới.
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;
}
}
sau khi một số digging tôi tìm thấy logcat error..its một ngoại lệ 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)
Đáng tiếc là ứng dụng được treo và giao diện không bao giờ cập nhật các Hoạt động hiển thị dữ liệu với đúng (tức là xử lý được thực hiện)
Làm điểm cho tôi đi đúng hướng. - Cảm ơn
Bạn đã kiểm tra xem onPostExecute() có được gọi cho AsyncTask của bạn không. – Anirudh
Vâng tôi đã làm. Tôi đặt một điểm ngắt và nó chỉ đóng băng trên đường gọi người nghe. cảm ơn bạn – KuriaNdungu