Lint Leak警告调用嵌套的静态异步任务



我收到以下皮棉警告:

此AsyncTask类应该是静态的,否则可能会发生泄漏

调用类

private static Helper.GetRadar mTask;
private void setRadar(String area, String distance, String radar) {
**/// LINT WARNING ON THE BELOW LINE**
mTask = new Helper.GetRadar(activity, area, distance, radar) {
@Override
protected void onPostExecute(String result) {
gotRadar(result);
}
};
}

内部静态异步任务:

class Helper {    
....
public static class GetRadar extends AsyncTask<String, Void, String> {
private WeakReference<Context> mContext;
GetRadar(Context context, String area, String distance, String radar) {
mContext = new WeakReference<Context>(context);            
}
@Override
protected String doInBackground(String... arg) {
....
return result;
}
@Override
protected void onPostExecute(String result) {
/// Override
}
}
}

当类已经声明为静态时,为什么会出现此错误?

您正在用一个匿名内部类扩展静态类,该类将包含对调用活动的引用,这就是您收到该警告的原因。您可以创建自己的自定义接口来调用onPostExecute,如下所示:

public static class GetRadar extends AsyncTask<String, Void, String> {
private WeakReference<Context> mContext;
private MyPostExecute mRunner;
interface MyPostExecute {
void run(String result);
}
GetRadar(Context context, String area, String distance, String radar, MyPostExecute runner) {
mContext = new WeakReference<Context>(context);     
mRunner = runner;            
}
@Override
protected String doInBackground(String... arg) {
....
return result;
}
@Override
protected void onPostExecute(String result) {
mRunner.run(result);
}
}

每个想要使用AsyncTask的类都可以定义自己的PostExecute实现,如下所示:

private static MyRunner implements GetRadar.MyPostExecute {
private WeakReference<Helper> mHelper;
MyRunner(Helper h) {
mHelper = new WeakReference<>(h);
}
@Override
void run(String result)
{
Helper h = mHelper.get();
if( h != null && !h.isFinishing() ) {
h.gotRadar(result);
}
} 
}

对于这种情况,您可以称之为:

mTask = new Helper.GetRadar(activity, area, distance, radar, new MyRunner(this));

最新更新