各位好,跟着安卓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);
}
}
详细信息:
对了,能请教一下各位as里怎么复制错误/警告信息呢?
楼上大佬那个恨铁不成钢呀。
我估计就是翻译了您可能也不会太明白,通俗的解释下吧:
首先这是个lint警告,既然是警告,那在某种程度上忽略不管也是没什么大问题的。
但这里这个警告不建议忽略,因为TextView传进来之前,必定是初始化过的,初始化是需要Context的。
个人猜测你的TextView应该是某个Activity上的,那么你的Context就是这个Activity,而AsyncTask是异步子线程,与Activity所在的UI线程没啥联系。
当你把Activity的Context给了TextView,TextView又给了AsyncTask,这样就导致子线程间接持有了Activity的引用。
当AsyncTask执行耗时操作时,你把这个Activity关了,GC发现Activity的还被AsyncTask捏着在,不敢回收内存,就容易出现内存泄漏......
有些地方形容的不太恰当,但大概就是那么个意思,希望您能看明白。