2013-07-11 46 views
5

làm cách nào để trả lại Danh sách được tạo trong AsyncTask về hoạt động?Danh sách trả về AsyncTask hoạt động

My LoadStringsAsync lớp:

public class LoadStringsAsync extends AsyncTask<Void, Void, List<String> > { 

    List<String> str; 

    @Override 
    protected void onPreExecute() { 
     super.onPreExecute(); 
     ... 
    } 

    @Override 
    protected List<String> doInBackground(Void... arg0) { 
     ... 
     get content from the internet 
     and 
     fill the list 
     ... 
    } 

    @Override 
    protected void onPostExecute(List<String> str) { 
     super.onPostExecute(events); 
     ... 

    } 
} 

và tôi cần danh sách trở lại trong Hoạt động của tôi để làm việc với nó. (Không chỉ để hiển thị nó trong ListView: P)

Bất kỳ đề xuất nào về cách thực hiện việc này? :-)

Cảm ơn bạn cho đến nay!

+0

http://stackoverflow.com/questions/17398837/processdialog-is-not-appearing-properly. kiểm tra điều này trong trường hợp này bạn trả về một chuỗi. sửa đổi cho phù hợp – Raghunandan

+0

Nó có thể phụ thuộc vào những gì bạn muốn làm với Danh sách. Bạn có thể cung cấp thêm thông tin cho chúng tôi không? – Enrichman

Trả lời

7

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

public class YourActivity extends Activity { 
    private List<String> list = new ArrayList<String>(); 

    public void onCreate(Bundle state) { 
     //... 
    } 

    public void setList(List<String> list) { 
     this.list = list; 
    } 

    private void fireYourAsyncTask() { 
     new LoadStringsAsync(this).execute(); 
    } 

}  

AsyncTask:

public class LoadStringsAsync extends AsyncTask<Void, Void, List<String>> { 

    List<String> str; 
    private YourAcitivity activity; 

    public LoadStringsAsync(YourAcitivity activity) { 
     this.activity = activity; 
    } 

    @Override 
    protected List<String> doInBackground(Void... arg0) { 
    } 

    @Override 
    protected void onPostExecute(List<String> str) { 
     super.onPostExecute(events); 
     activity.setList(str); 
    } 
} 
+0

Hoạt động hoàn hảo! ...... đã không nhận được trên ý tưởng đó: D :) – Heisnberg

+0

không thể giải quyết biểu tượng 'sự kiện' –

+0

biến 'sự kiện' là trong câu hỏi của op. Sử dụng biến của riêng bạn. – wtsang02

0

Mã đặt sử dụng danh sách hoặc đặt mã vào một biến, bên trong onPostExecute().

Better chạy nhiệm vụ của bạn từ Hoạt động cha mẹ như:

public class MyActivity extends Activity{ 
    private List<String> mData = new ArrayList<String>(); 


    private void runTask(){ 
    new LoadStringsAsync(){ 

     @Override 
     protected void onPostExecute(List<String> str) { 
     super.onPostExecute(events); 
     mData.clear(); 
     mData.addAll(str); 
     } 

    }.execute(); 
    } 
} 
1

Nếu bạn thực hiện AsyncTask của bạn một lớp bên trong hoạt động của bạn, sau đó onPostExecute sẽ được trong bối cảnh tương tự như các hoạt động, và bạn có thể sử dụng danh sách như bạn sẽ ở bất kỳ đâu trong Hoạt động.

Nếu bạn không đặt AsyncTask thành lớp bên trong trong Hoạt động của mình, thì bạn cần thiết lập trình nghe để gọi lại Hoạt động khi AsyncTask kết thúc. Nếu bạn muốn đi tuyến đường đó, hãy xem this post.

Ngoài ra còn có this post tương tự như câu hỏi của bạn.

+4

Không được gọi là phân lớp của nó. "Thực hiện AsyncTask như một lớp bên trong trong hoạt động của bạn". – wtsang02

+0

Bạn đã chính xác, tôi đã thay đổi nó. – yiati

0

Theo tài liệu từ android link bạn có thể sử dụng phương thức get để trả về kết quả tính toán. Kể từ AsyncTask của bạn cho thấy rằng bạn đang trở về một danh sách, sau đó bạn có thể thử các mã sau đây trong lớp bạn đang gọi lớp không đồng bộ

List<String> returnedlist=new LoadStringAsync().execute().get(); 

Hy vọng tùy chọn này giúp.

Các vấn đề liên quan