2012-12-11 32 views
9

Ok vì vậy bây giờ tôi có Class A có chứa một số spinners giá trị sẽ được điền bởi Class B kéo dài AsnycTask lấy giá trị spinner từ dịch vụ web. Trong lớp B tôi quản lý để lấy các giá trị, hiển thị trong một Toast. Vấn đề bây giờ là làm cách nào để chuyển các giá trị spinner đó trở lại lớp A?Giá trị trả về từ lớp AsyncTask trên phương thứcPostExecute

Tôi đã thử

Can OnPostExcecute method in AsyncTask RETURN values?

bằng cách thông qua Class A-Class B và lưu trữ các giá trị trong một biến công cộng của Class A như dưới đây

@Override 
protected void onPostExecute(String result) 
{ 
    classA.classAvariable = result; 
} 

Tuy nhiên bất cứ khi nào tôi cố gắng đọc classAvariable i luôn nhận được NullPointer Exception. Có vẻ như biến chưa bao giờ được gán với kết quả. Vì mục đích dễ đọc, tôi cần phải tách riêng Class B thay vì sử dụng làm lớp nội tuyến.

Bất kỳ ý tưởng nào về lập trình viên Java đồng nghiệp của tôi?

+0

Cung cấp các mã mà bạn đã viết –

Trả lời

29

Tôi đoán bạn đang cố gắng để đọc lớp Một biến trước khi nó đang được thiết lập .. Cố gắng làm điều đó bằng callbacks..in chức năng gọi lại vượt qua các giá trị và làm mới spinners của bạn ..

Bạn có thể tạo interface, vượt qua nó để AsyncTask (trong constructor), và sau đó gọi phương thức trong onPostExecute

Ví dụ:

giao diện của bạn:

public interface OnTaskCompleted{ 
    void onTaskCompleted(values); 
} 

Hoạt động của bạn:

public YourActivity implements OnTaskCompleted{ 
    //your Activity 
    YourTask task = new YourTask(this); // here is the initalization code for your asyncTask 
} 

Và AsyncTask của bạn:

public YourTask extends AsyncTask<Object,Object,Object>{ //change Object to required type 
    private OnTaskCompleted listener; 

    public YourTask(OnTaskCompleted listener){ 
     this.listener=listener; 
    } 

    //required methods 

    protected void onPostExecute(Object o){ 
     //your stuff 
     listener.onTaskCompleted(values); 
    } 
} 
+0

Nhờ nó hoạt động! Tuy nhiên, bạn có nhớ giải thích lý do trên mã này? Bởi vì nó trông giống như thực hiện một phương thức getter trong lớp AsyncTask (mặc dù nó không hoạt động trong thực tế). –

+2

đó là loại hàm gọi lại thay vì chuyển hoạt động sang tác vụ, bạn chuyển qua một trình nghe, (giống như trình nghe nút) khi tác vụ được hoàn thành, gọi hàm gọi lại (gọi hoạt động thực hiện gọi lại này) và sau đó hoạt động làm những gì nó muốn – Nermeen

+1

Đúng nếu tôi sai, với logic của tôi việc thực hiện giao diện được gọi khi AsyncTask được thực hiện trong khi triển khai phương thức getter có thể không hoạt động vì AsyncTask có thể không được hoàn thành trước khi phương thức được gọi. Điều này có đúng không? –

0

Tạo một giao diện giống như OnCompletRequest() sau đó chuyển thông tin này đến constructor ClassB của bạn và chỉ cần gọi phương thức bên trong giao diện này như complete(yourList list) trong phương pháp của onPostExecute(String result)

+0

Bạn có nhớ cung cấp đoạn mã ngắn không? Tôi không rõ làm cách nào để triển khai giao diện trong lớp AsyncTask. –

+0

tôi vừa cập nhật mã của @Nunu để giúp bạn biết cách hoạt động của mã đó. –

+0

Cảm ơn bạn rất nhiều! Nó rất hữu ích! –

1

Vấn đề ở đây là khi bạn thực thi AsynchTask của bạn, doodeBackground() của nó sẽ chạy trong chuỗi riêng biệt và thread đã bắt đầu AsynchTask này di chuyển về phía trước, Qua đó thay đổi xảy ra trên biến của bạn bởi AsynchTask không phản ánh trên chủ đề mẹ (người đã tuyên bố AsynchTask này) ngay lập tức.

Ví dụ -

class MyAsynchTask 
{ 

doInbackground() 
{ 
a = 2; 
} 

} 


int a = 5; 

new MyAsynchTask().execute(); 

// ở đây một vẫn là 5

+0

tốt nếu bạn đã đọc mã của tôi, tôi đã thực hiện nhiệm vụ trong phương thức onPostExecute .. được cho là đang chạy trên luồng UI không? –

+0

có! onPostExecute chạy trong chuỗi giao diện người dùng nhưng sau khi hoàn thành doInbackground. – Mufazzal