簡體   English   中英

Android Asynctask:內部類是否必要?

[英]Android Asynctask: Is inner class necessary?

我嘗試使用Asynctask在Android中進行網絡連接,並且成功與否。

我很好奇:是否有必要使Asynctask內部類?

我沒有把它作為內部類的一種形式,但Google API指南說AsyncTask must be subclassed to be used. (但我沒有,它的工作原理......) - http://developer.android.com/reference/android/os/AsyncTask.html

為什么Asynctask采用一種形式的類,即使它只執行一個主函數? (我認為它應該是一種方法,而不是一種類。)

'AsyncTask必須被子類化才能使用'並不意味着內部類; 它意味着該類擴展了AsyncTask。

通常人們使用ASyncTask作為(非靜態)內部類來避免因為存在一個大而微妙的問題,如下所示:

  1. 您將Asynctask創建為您的活動的內部類,並且不需要花費很多時間。 根據定義,內部類包含對其“外部”父級的引用(這是它們訪問父級數據的方式)。
  2. Android會關閉活動並重新啟動新活動(例如,當您旋轉手機時)。
  3. 現在舊的活動及其所有資源仍然被保留,因為Asynctask仍在運行並且持有對舊活動的引用; 突然之間,您正在為舊版本的活動和新版本的活動使用內存。

通過使用靜態內部類(不能引用它的外部父級)或不同的類並且僅使用weak_reference引用活動,可以最容易地解決這個難題。

它不一定是內部類,它取決於你使用它的內容。

例如,如果你有一個AsyncTask作為內部類,只有持有它的類可以使用它,但你有一個很多類正在使用的AsyncTask,你可能想把AsyncTask作為公共類,所以每個人都可以使用它。

它可以在兩個方面工作。

我很好奇:是否有必要使Asynctask內部類?

不,你可以將它放到外部java文件中,或者你也可以將它作為內部靜態類。

必須將AsyncTask子類化才能使用。

它與類是內在的無關,它說你需要創建一個AsyncTask的子類,即:

class MyAsyncTask extends AsyncTask 

內部類看起來像這樣:

class MyActivity extends Activity {
    // now MyAsyncTask  is inner to MyActivity and has full access to its instance
    class MyAsyncTask extends AsyncTask
    {}
} 

為什么Asynctask采用一種形式的類,即使它只執行一個主函數? (我認為它應該是一種方法,而不是一種類。)

它執行了很多,比如onPostExecute,onPreExecute,看得更近。 它還解耦了AsyncTask邏輯並允許重用。

如果你想讓AsyncTask成為內在的,那么我建議讓它成為靜態 - 但是為什么不把它變成外部類。 內部類總是保持對它的外部類的引用,這種方式在這種情況下,Activity不會被垃圾收集,直到AsyncTask完成它的工作(線程結束),因為網絡通信需要時間,這可能會導致問題 - 比如泄漏引用或OOM(Out Of內存)異常,如果您的活動使用大量內存。 最好繼續引用WeakReference中的Activity,以允許Activity被收集。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM