2012-09-20 73 views
1

我有靜態方法的工具類。假設這些方法能火後臺任務,類似下面:Android:Util類與後臺線程靜態方法(異步任務)

class ExampleAsyncUtil { 
    public static void doSomeAsyncJob() { 
     new AsyncTask<Void, Void, Void>() { 

      @Override 
      protected Void doInBackground (Void... params) { 
       //do heavy job here ... 
       return null; 
      } 
     }.execute(); 
    } 
} 

若我撥打活動內的Util類方法,然後成爲破壞:

class ExampleActivity extends Activity { 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 

     ExampleAsyncUtil.doSomeAsyncJob(); 
    } 

    @Override 
    protected void onDestroy() { 

     //should i stop async task in util on destroy ? 

     super.onDestroy(); 
    } 
} 

是否有什麼壞處? (假設後臺線程沒有保留任何關於調用實用方法的活動的參考)

+1

有沒有一個合理的理由來創建沒有'Context'的AsyncTask?對於用戶而言,沒有太多可以做的事情。下面的例子:如果用戶退出你的Activity,整個過程首先被殺死 - 如果你想讓你的任務完成這個任務就很重要。如果你提供你的理由,我可以詳細說明。 –

+0

嗨,感謝您的回答,是的,在這種情況下,它可能是線程。但是爲什麼從文檔中將'AsyncTask'與'Context'聯繫起來,它似乎只是一個幫助常見的頻繁線程處理場景的類。 –

+1

您不必將其與上下文關聯。從你的其他評論看來,你需要這個線程來完成它的工作 - 在這種情況下,使用一個「服務」 - 它不太可能被殺死,並且你得到了處理這些殺戮的工具。如果你不需要線程來完成它的工作,不要吃用戶的電池,並停止它:) –

回答

1

是的,您應該從您的用戶界面中取消AsyncTask。否則,您可以泄漏AsyncTask(從經驗談話)。而且,誰知道,甚至可能阻止另一個人從同一個線程開始:他們不斷更改實現:http://developer.android.com/reference/android/os/AsyncTask.html。或者,相反,多個onCreate()可以創建重複的「殭屍」AsyncTask。無論如何,這不是AsyncTask的預期用途:它們應該是短命的並且得到適當的控制。所以,這種靜態業務似乎沒有真正的收益。

我認爲你應該啓動一個服務,並從中產生一個服務,或者只是在你的Activity的生命週期內使用AsyncTask。

這裏有一個關於異步處理的好教程:http://www.vogella.com/articles/AndroidPerformance/article.html

+0

嗨,謝謝你的回答,但我理解服務和異步任務,以及很久以前閱讀許多lars的教程;)。我故意給出了這個例子,其中沒有存儲任何對活動或其資源的引用(所以它不是殭屍,因爲它對它的被調用者活動不感興趣)。由於這是實用方法,獨立調用只是正確的方案。 ... –

+0

...我知道異步任務(池或隊列取決於系統版本)的實現更改的問題,但這不是問題的問題。問題的線索是,如果在靜態方法中啓動一個新的線程在某種程度上與被稱爲靜態方法的活力相關聯,並且它似乎不是 - 所以在澄清我的意思後,我想我找到了答案: )。 –

+0

順便說一下,lars vogel的教程示例'ThreadsLifecycleActivity'似乎有漏洞。這個教程是相當古老的(2年現在),所以它可以採取「第一次調查」而不是「高貴的模式」;) –