当前位置: 首页 > 知识库问答 >
问题:

调用嵌套静态Asynctask的Lint泄漏警告

壤驷敏学
2023-03-14
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
    }
}
}

共有1个答案

公羊新
2023-03-14

您正在用匿名内部类扩展静态类,该类将保存对调用活动的引用,这就是为什么您会得到警告。您可以创建自己的自定义接口来调用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));
 类似资料:
  • 这是我的代码: 我怎么纠正这个?

  • 问题内容: 有些问题的标题相似,但所有问题都与您在构造函数中获得的上下文有关。 有带有项目的RecyclerView和其他带有播放\暂停按钮的视图。 此类允许该视图一次仅播放一个文件。如果正在播放view_1,然后在view_2上按播放,则将播放file_2。 此类中有一个 ImageButton mPlayPauseButton。需要将view_1的 ImageButton 设置为paused_

  • 我有以下java代码: 我的问题如下:我收到一个文本和一种语言,我必须检查该文本是否仅使用该语言的有效字母字符书写。我的代码如下: 这很好,也很有效,但随着我在应用程序中添加语言,我将不得不在交换机中添加越来越多的案例。 我想知道在中是否有一种方法可以动态命名一个静态嵌套类,比如: 所以我上面的代码可能是这样的: 谢谢,如果这是超级简单的事情,我很抱歉。 我是一名开发人员,正在学习。

  • 本文向大家介绍Android 避免使用AsyncTask泄漏活动,包括了Android 避免使用AsyncTask泄漏活动的使用技巧和注意事项,需要的朋友参考一下 示例 注意:AsyncTask除了这里描述的内存泄漏之外,还有很多陷阱。因此,请谨慎使用此API,如果您不完全了解其含义,请完全避免使用它。有很多选择(线程,EventBus,RxAndroid等)。 一个常见的错误AsyncTask是

  • 我的项目中有一个AsyncTask,有一个警告,它说:

  • 我正在调试一个我在Tomcat应用程序中多年来遇到的问题——由于Webapp类加载器无法通过气相色谱重新启动应用程序时导致的内存泄漏。我用JProfiler对堆进行了快照,似乎至少我的一些静态变量没有被释放。 某些类有一个静态 final 成员,该成员在首次加载类时初始化,并且因为它是 final,所以我无法在应用程序关闭时将其设置为 null。 静态最终变量是Tomcat中的反模式,还是我错过了