2013-05-04 36 views
5

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

+1

Bạn đã kiểm tra xem onPostExecute() có được gọi cho AsyncTask của bạn không. – Anirudh

+0

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

Trả lời

3

Có câu trả lời! Tôi đã không khởi tạo người nghe trong lớp gọi điện của tôi. tất cả tôi cần phải làm được đưa vào dòng này

db.setDbProcesslistener(this); 

tức

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

và nó bắt đầu làm việc.

Nhờ tất cả những người đã xem và cố gắng nghĩ về giải pháp :)

+0

@ KuriaNdungu - CẢM ƠN BẠN đã đăng những gì DID hoạt động. Cảm ơn bạn C forNG cho VIỆC LÀM MỸ cho thấy đủ mã của bạn mà MỌI NGƯỜI bây giờ có thể thử áp dụng kỹ thuật này. – DSlomer64

+0

AH, MAN !!!!!! Tất cả những gì tôi đã làm là cắt giảm cẩn thận và dán các đoạn 3 và 5 đầu tiên của mã @ Kuria vào ứng dụng của tôi và sửa đổi 'onPostExecute' của riêng tôi để có một dòng - 'dbProcesslistener.ProcessingIsDone (true);' và sau đó tôi nhận được NPE, Tôi thức dậy và dán vào dòng của mình cho phù hợp với 'ứng dụng' của tôi:' dbc.setDbProcesslistener (điều này); 'VÀ CNTT LÀM VIỆC. NGHIÊN CỨU Ví dụ này của một kỹ thuật rất quan trọng. SUPER JOB, Kuria !! Đây là mẫu SO Q và (USER'S!) Làm việc A! – DSlomer64

+0

@ DSlomer64 1) sao câu hỏi 2) upvote erythang 3) bắt đầu một tiền thưởng và đưa nó cho Kuria. – Will

3

Âm thanh như biến số dbProcesslistenerNULL. Bạn có gọi setter của bạn và vượt qua nó một đối tượng Listener khởi tạo một thời gian trước khi bạn gọi dbProcesslistener.ProcessingIsDone(true);?

+0

Cảm ơn bạn. đó thực sự là vấn đề. tôi đã không khởi tạo trước khi gọi. – KuriaNdungu

+0

Đã quên. Bây giờ xong :) – KuriaNdungu