




非靜態(tài)匿名內(nèi)部類(lèi)為何會(huì)持有外部類(lèi)的引用呢?靜態(tài)匿名內(nèi)部類(lèi)不持有外部對(duì)象的引用
非靜態(tài)態(tài)內(nèi)部類(lèi)里面不允許有靜態(tài)方法(因?yàn)榉庆o態(tài)內(nèi)部類(lèi)方法的調(diào)用必須依賴外部對(duì)象的創(chuàng)建)。The method test cannot be declared static; static methods can only be declared in a static or top level type
外部類(lèi):


外部類(lèi)不持有MainActivity的引用
在Android中,長(zhǎng)時(shí)間運(yùn)行的任務(wù)和Acyivity生命周期進(jìn)行協(xié)調(diào)會(huì)有點(diǎn)困難,如果你不加以小心的話會(huì)導(dǎo)致內(nèi)存泄漏。關(guān)于如何處理這個(gè)棘手的問(wèn)題,下面有幾個(gè)基本的技巧供參考 1、使用靜態(tài)內(nèi)部類(lèi)/匿名類(lèi),不要使用非靜態(tài)內(nèi)部類(lèi)/匿名類(lèi).非靜態(tài)內(nèi)部類(lèi)/匿名類(lèi)會(huì)隱式的持有外部類(lèi)的引用,外部類(lèi)就有可能發(fā)生泄漏。而靜態(tài)內(nèi)部類(lèi)/匿名類(lèi)不會(huì)隱式的持有外部類(lèi)引用,外部類(lèi)會(huì)以正常的方式回收,如果你想在靜態(tài)內(nèi)部類(lèi)/匿名類(lèi)中使用外部類(lèi)的屬性或方法時(shí),可以顯示的持有一個(gè)弱引用。 2、不要以為java永遠(yuǎn)會(huì)幫你清理回收正在運(yùn)行的threads.在上面的代碼中,我們很容易誤以為當(dāng)Activity結(jié)束銷(xiāo)毀時(shí)會(huì)幫我們把正在運(yùn)行的thread也結(jié)束回收掉,但事情永遠(yuǎn)不是這樣的!Java threads會(huì)一直存在,只有當(dāng)線程運(yùn)行完成或被殺死掉,線程才會(huì)被回收。所以我們應(yīng)該養(yǎng)成為thread設(shè)置退出邏輯條件的習(xí)慣。 3、適當(dāng)?shù)目紤]下是否應(yīng)該使用線程.Android應(yīng)用框架設(shè)計(jì)了許多的類(lèi)來(lái)簡(jiǎn)化執(zhí)行后臺(tái)任務(wù),我們可以使用與Activity生命周期相關(guān)聯(lián)的Loaders來(lái)執(zhí)行簡(jiǎn)短的后臺(tái)查詢?nèi)蝿?wù)。如果一個(gè)線程不依賴與Activity,我們還可以使用Service來(lái)執(zhí)行后臺(tái)任務(wù),然后用BroadcastReceiver來(lái)向Activity報(bào)告結(jié)果。另外需要注意的是本文討論的thread同樣使用于AsyncTasks,AsyncTask同樣也是由線程來(lái)實(shí)現(xiàn),只不過(guò)使用了Java5.0新增并發(fā)包中的功能,但同時(shí)需要注意的是根據(jù)官方文檔所說(shuō),AsyncTask適用于執(zhí)行一些簡(jiǎn)短的后臺(tái)任務(wù)新聞熱點(diǎn)
疑難解答
圖片精選
網(wǎng)友關(guān)注