"This field leaks a context object"?

各位好,跟着安卓training文档做,在一个继承AsyncTask的子类声明了一个TextView私有变量,为什么提示This field leaks a context object?如何消除这个警告?Stackoverflow上没有这方面解答。

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);
    }
}

详细信息:

clipboard.png

对了,能请教一下各位as里怎么复制错误/警告信息呢?

阅读 8.1k
2 个回答

楼上大佬那个恨铁不成钢呀。

我估计就是翻译了您可能也不会太明白,通俗的解释下吧:
首先这是个lint警告,既然是警告,那在某种程度上忽略不管也是没什么大问题的。
但这里这个警告不建议忽略,因为TextView传进来之前,必定是初始化过的,初始化是需要Context的。
个人猜测你的TextView应该是某个Activity上的,那么你的Context就是这个Activity,而AsyncTask是异步子线程,与Activity所在的UI线程没啥联系。
当你把Activity的Context给了TextView,TextView又给了AsyncTask,这样就导致子线程间接持有了Activity的引用。
当AsyncTask执行耗时操作时,你把这个Activity关了,GC发现Activity的还被AsyncTask捏着在,不敢回收内存,就容易出现内存泄漏......

有些地方形容的不太恰当,但大概就是那么个意思,希望您能看明白。

提示里面解释的很清楚啊。我觉得把提示翻译一下就是答案了,你是英文看不懂?

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题