AsynTask

  • AsyncTask為什么要設(shè)計為只能夠一次任務(wù)寻定?

因為要同一個實例執(zhí)行多次很麻煩,沒必要缭保。

假設(shè)允許多次 execute 同一個 AsyncTask 多次蘸朋,也就是說隊列中會有同一個 AsyncTask 實例出現(xiàn)多次。首先 AsyncTask 需要改動很多韩容,比如把各種狀態(tài)額外保存多份款违,不能像現(xiàn)在這樣簡單做為 AsyncTask 的成員變量,這些先不說群凶,從調(diào)用者角度來看:

你繼承 AsyncTask 實現(xiàn)了自己的一個子類 MyTask插爹,加了一些成員變量,你想多次執(zhí)行同一個 MyTask请梢,發(fā)現(xiàn)不對啊赠尾,我第一次執(zhí)行后這些成員變量的值都變了,狀態(tài)不對毅弧。還得加個 reset 函數(shù)把這些值改回初使值气嫁,再一想何必呢,我干脆重新 new 一個 MyTask 不是更簡單有效嗎够坐。

另外寸宵,雖然用默認(rèn)的 Executor 是不會同時運行的,但你 execute 時如果用了自己定義 Executor咆霜,是有可能會多線程同時訪問的邓馒。這時你也會想還要搞線程同步太麻煩了還是我還是 new 兩個 MyTask 別想著同一個 MyTask 運行兩次好了。

所以蛾坯,你看光酣,就算人家允許你同一個 AsyncTask execute 多次,你既然也不會用這功能的話脉课,我就干脆不許你 execute 兩次好了救军。

  • AsynTask造成的內(nèi)存泄露的問題怎么解決财异,比如任務(wù)還在請求中,但這個Activity已經(jīng)被銷毀了唱遭,這個task就仍然持有act的引用戳寸,造成內(nèi)存泄露?

最主要的是在 Activity 銷毀時就應(yīng)該把所有屬于這個 Activity 的 Task cancel 掉拷泽。

你的 Task 應(yīng)該在 onCancelled 函數(shù)中做相應(yīng)的處理疫鹊。比如說如果 Task 是用 來聯(lián)網(wǎng)的,就應(yīng)該在 onCancelled 中 disconnect司致。然后在 onCancelled 中將指向 Activity 的引用設(shè)為 null;

弱引用更多的是一份保險拆吆,保證如果你在沒有正確 cancel Task 時,不會讓本應(yīng)去死的 Activity 還因為 Task 的引用還在內(nèi)存中晃悠脂矫。當(dāng)然這個保險是很有必要的枣耀。

弱引用Demo:

static class AsyncDrawable extends BitmapDrawable {
    private final WeakReference<BitmapWorkerTask> bitmapWorkerTaskReference;

    public AsyncDrawable(Resources res, Bitmap bitmap,
            BitmapWorkerTask bitmapWorkerTask) {
        super(res, bitmap);
        bitmapWorkerTaskReference =
            new WeakReference<BitmapWorkerTask>(bitmapWorkerTask);
    }

    public BitmapWorkerTask getBitmapWorkerTask() {
        return bitmapWorkerTaskReference.get();
    }
}
public void loadBitmap(int resId, ImageView imageView) {
    if (cancelPotentialWork(resId, imageView)) {
        final BitmapWorkerTask task = new BitmapWorkerTask(imageView);
        final AsyncDrawable asyncDrawable =
                new AsyncDrawable(getResources(), mPlaceHolderBitmap, task);
        imageView.setImageDrawable(asyncDrawable);
        task.execute(resId);
    }
}

public static boolean cancelPotentialWork(int data, ImageView imageView) {
    final BitmapWorkerTask bitmapWorkerTask = getBitmapWorkerTask(imageView);

    if (bitmapWorkerTask != null) {
        final int bitmapData = bitmapWorkerTask.data;
        // If bitmapData is not yet set or it differs from the new data
        if (bitmapData == 0 || bitmapData != data) {
            // Cancel previous task
            bitmapWorkerTask.cancel(true);
        } else {
            // The same work is already in progress
            return false;
        }
    }
    // No task associated with the ImageView, or an existing task was cancelled
    return true;
}

private static BitmapWorkerTask getBitmapWorkerTask(ImageView imageView) {
   if (imageView != null) {
       final Drawable drawable = imageView.getDrawable();
       if (drawable instanceof AsyncDrawable) {
           final AsyncDrawable asyncDrawable = (AsyncDrawable) drawable;
           return asyncDrawable.getBitmapWorkerTask();
       }
    }
    return null;
}

class BitmapWorkerTask extends AsyncTask<Integer, Void, Bitmap> {
    ...

    @Override
    protected void onPostExecute(Bitmap bitmap) {
        if (isCancelled()) {
            bitmap = null;
        }

        if (imageViewReference != null && bitmap != null) {
            final ImageView imageView = imageViewReference.get();
            final BitmapWorkerTask bitmapWorkerTask =
                    getBitmapWorkerTask(imageView);
            if (this == bitmapWorkerTask && imageView != null) {
                imageView.setImageBitmap(bitmap);
            }
        }
    }
}

  • task執(zhí)行完返回結(jié)果在已經(jīng)被銷毀的act顯示,會如何庭再?

如果執(zhí)行了這個 activity 的 view 的操作的話捞奕,會報異常。因為此時這個 view 已經(jīng)不屬于任何活的Window拄轻。

  • Act銷毀但Task如果沒有銷毀掉颅围,當(dāng)Act重啟時這個task該如何解決?

最多就是 Task 指向 Activity 的引用改成弱引用了哺眯。 Task 如果是 Activity 一個成員的話已經(jīng)泄漏無法訪問了谷浅。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末扒俯,一起剝皮案震驚了整個濱河市奶卓,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌撼玄,老刑警劉巖夺姑,帶你破解...
    沈念sama閱讀 206,482評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異掌猛,居然都是意外死亡盏浙,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,377評論 2 382
  • 文/潘曉璐 我一進(jìn)店門荔茬,熙熙樓的掌柜王于貴愁眉苦臉地迎上來废膘,“玉大人,你說我怎么就攤上這事慕蔚∝せ疲” “怎么了?”我有些...
    開封第一講書人閱讀 152,762評論 0 342
  • 文/不壞的土叔 我叫張陵孔飒,是天一觀的道長灌闺。 經(jīng)常有香客問我艰争,道長,這世上最難降的妖魔是什么桂对? 我笑而不...
    開封第一講書人閱讀 55,273評論 1 279
  • 正文 為了忘掉前任甩卓,我火速辦了婚禮,結(jié)果婚禮上蕉斜,老公的妹妹穿的比我還像新娘逾柿。我一直安慰自己,他們只是感情好宅此,可當(dāng)我...
    茶點故事閱讀 64,289評論 5 373
  • 文/花漫 我一把揭開白布鹿寻。 她就那樣靜靜地躺著,像睡著了一般诽凌。 火紅的嫁衣襯著肌膚如雪毡熏。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,046評論 1 285
  • 那天侣诵,我揣著相機(jī)與錄音痢法,去河邊找鬼。 笑死杜顺,一個胖子當(dāng)著我的面吹牛财搁,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播躬络,決...
    沈念sama閱讀 38,351評論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼尖奔,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了穷当?” 一聲冷哼從身側(cè)響起提茁,我...
    開封第一講書人閱讀 36,988評論 0 259
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎馁菜,沒想到半個月后茴扁,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 43,476評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡汪疮,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 35,948評論 2 324
  • 正文 我和宋清朗相戀三年峭火,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片智嚷。...
    茶點故事閱讀 38,064評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡卖丸,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出盏道,到底是詐尸還是另有隱情稍浆,我是刑警寧澤,帶...
    沈念sama閱讀 33,712評論 4 323
  • 正文 年R本政府宣布,位于F島的核電站粹湃,受9級特大地震影響恐仑,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜为鳄,卻給世界環(huán)境...
    茶點故事閱讀 39,261評論 3 307
  • 文/蒙蒙 一裳仆、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧孤钦,春花似錦歧斟、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,264評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至俊扭,卻和暖如春队橙,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背萨惑。 一陣腳步聲響...
    開封第一講書人閱讀 31,486評論 1 262
  • 我被黑心中介騙來泰國打工巷懈, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留沮榜,地道東北人潮孽。 一個月前我還...
    沈念sama閱讀 45,511評論 2 354
  • 正文 我出身青樓晓铆,卻偏偏與公主長得像,于是被迫代替她去往敵國和親姐仅。 傳聞我的和親對象是個殘疾皇子花枫,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 42,802評論 2 345

推薦閱讀更多精彩內(nèi)容

  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 171,510評論 25 707
  • 介紹自己負(fù)責(zé)的部分,如何實現(xiàn)的掏膏。 自定義view viewGroup activity的啟動流程 事件傳遞及滑動沖...
    東經(jīng)315度閱讀 1,194評論 1 4
  • Android開發(fā)者:你真的會用AsyncTask嗎劳翰? 導(dǎo)讀.1 在Android應(yīng)用開發(fā)中,我們需要時刻注意保證...
    cxm11閱讀 2,701評論 0 29
  • 導(dǎo)讀:Android面試中高頻率出現(xiàn)的題都在這了。試題大部分從互聯(lián)網(wǎng)收集伶丐,博主下了一番功夫進(jìn)行梳理總結(jié)悼做,難免有不足...
    Maat紅飛閱讀 55,681評論 61 844
  • 總想寫點什么,卻不知從何寫起哗魂。每天心中都有個千萬個感慨肛走,奈何無處發(fā)泄。從網(wǎng)絡(luò)中每天都能看到許多所謂的雞湯录别,其中的故...
    森叟閱讀 160評論 1 1