2011-06-19 46 views
5

Tôi hiện đang làm một cái gì đó như thế này trong phương pháp onPostExecute của AsyncTask, nơi NewTaskkhông nhiệm vụ hiện nay đó là thực hiện:Android AsyncTask Bắt đầu Một AsyncTask

private class OlderTask extends AsyncTask<String, Void, Integer> { 
    //other functions (not important) 

    @Override 
    protected void onPostExecute(Integer result) { 
     new NewTask().execute(null, null); 
    } 
} 

Tôi đang tự hỏi nếu điều này là một xấu ý kiến. Sẽ làm như vậy gây ra GC cho OlderTask để chờ cho NewTask? Có bất kỳ vấn đề nào khác có thể xảy ra khi sử dụng cách tiếp cận này không?

Và nếu đây là một vấn đề, làm thế nào tôi có thể khắc phục nó?

Trả lời

3

Trừ khi NewTask là lớp không tĩnh bên trong trong OlderTask nó sẽ không ngăn GC thu thập OlderTask trừ khi bạn lưu trữ tham chiếu đến nó theo một cách khác.

Nhưng ngay cả khi GC sẽ đợi cho đến khi NewTask được thực hiện, nó không phải là một vấn đề lớn trừ khi bạn lưu nhiều dữ liệu trong OlderTask hoặc tạo nhiều bản sao của OlderTask.

Vì vậy, nếu thiết kế của bạn yêu cầu thực hiện điều đó thì không sao. Nhưng nó chắc chắn sạch hơn không có nhiệm vụ xích.

+0

Cảm ơn. Logic tương tự cũng sẽ áp dụng nếu 'OlderTask' đang tạo một' OlderTask' mới? – yydl

+0

Miễn là phiên bản khác của 'OlderTask' và nó không tham chiếu đến cá thể trước đó trực tiếp hoặc gián tiếp. –

0

Tôi sử dụng phương thức gọi lại, Vì vậy, khi kết quả đến onPostExecute tôi gọi một AsynkTask khác từ giao diện người dùng, tôi nghĩ đó là ý tưởng hay, Hãy cho tôi biết bạn nghĩ gì.

public class PatientSearchController extends AsyncTask < String, Void, String > { 

    private PatientSearchResultHandler handler = null; 

    public void onResultHandler(PatientSearchResultHandler handler) { 
     this.handler = handler; 
    } 

    @Override 
    protected String doInBackground(String...params) { 

    } 

    @Override 
    protected void onPostExecute(String result) { 
     this.handler.onResultSuccessHandler(result); 
    } 
}