鍍金池/ 問(wèn)答/Java  Android/ "This field leaks a context object&

"This field leaks a context object"?

各位好,跟著安卓training文檔做,在一個(gè)繼承AsyncTask的子類聲明了一個(gè)TextView私有變量,為什么提示This field leaks a context object?如何消除這個(gè)警告?Stackoverflow上沒(méi)有這方面解答。

package com.example.bob.simpleasynctask;

import android.os.AsyncTask;
import android.widget.TextView;

import java.util.Locale;
import java.util.Random;

/**
 * Created by bob on 2018/3/22.
 */

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

    //這里提示有警告
    private TextView mTextView;
    public SimpleAsynccTask(TextView tv){
        this.mTextView=tv;
    }
    @Override
    protected String doInBackground(Void... voids) {
        Random random=new Random();
        int n=random.nextInt(10);

        int sleepTime=n*100;

        try {
            Thread.sleep(sleepTime);
        } catch (InterruptedException ex){
            ex.printStackTrace();
        }

        return String.format(new Locale("en-us"),"Awake at last after sleeping for %d milliseconds.",sleepTime);
    }

    @Override
    protected void onProgressUpdate(Void... voids) {
        super.onProgressUpdate(voids);
    }

    @Override
    protected void onPreExecute() {
        super.onPreExecute();
    }

    @Override
    protected void onPostExecute(String s) {
        mTextView.setText(s);
    }
}

詳細(xì)信息:

clipboard.png

對(duì)了,能請(qǐng)教一下各位as里怎么復(fù)制錯(cuò)誤/警告信息呢?

回答
編輯回答
半心人

提示里面解釋的很清楚啊。我覺(jué)得把提示翻譯一下就是答案了,你是英文看不懂?

2017年12月28日 04:46
編輯回答
祉小皓

樓上大佬那個(gè)恨鐵不成鋼呀。

我估計(jì)就是翻譯了您可能也不會(huì)太明白,通俗的解釋下吧:
首先這是個(gè)lint警告,既然是警告,那在某種程度上忽略不管也是沒(méi)什么大問(wèn)題的。
但這里這個(gè)警告不建議忽略,因?yàn)門(mén)extView傳進(jìn)來(lái)之前,必定是初始化過(guò)的,初始化是需要Context的。
個(gè)人猜測(cè)你的TextView應(yīng)該是某個(gè)Activity上的,那么你的Context就是這個(gè)Activity,而AsyncTask是異步子線程,與Activity所在的UI線程沒(méi)啥聯(lián)系。
當(dāng)你把Activity的Context給了TextView,TextView又給了AsyncTask,這樣就導(dǎo)致子線程間接持有了Activity的引用。
當(dāng)AsyncTask執(zhí)行耗時(shí)操作時(shí),你把這個(gè)Activity關(guān)了,GC發(fā)現(xiàn)Activity的還被AsyncTask捏著在,不敢回收內(nèi)存,就容易出現(xiàn)內(nèi)存泄漏......

有些地方形容的不太恰當(dāng),但大概就是那么個(gè)意思,希望您能看明白。

2017年8月30日 05:46