【问题标题】:Asynctask Memory Leak Warning AndroidAsynctask 内存泄漏警告 Android
【发布时间】:2021-12-27 21:11:50
【问题描述】:

我已创建为 asynctask 以将数据上传到服务器,如下所示。但它仅在 class AsyncTaskUploadClass 中显示此警告。 “这个 AsyncTask 类应该是静态的,否则可能会发生泄漏......”我已经阅读并尝试了弱引用样式,但我无法将它集成到这段代码中。任何线索将不胜感激。

 public void ImageUploadToServerFunction(){
    final String imageName1 = GetImageNameEditText1.trim();
    final String userName = GetUserName.trim();
    final String imageView1 = getStringImage1(bitmap1);
  
    class AsyncTaskUploadClass extends AsyncTask<Void,Void,String> {
        @Override
        protected void onPreExecute() {
            super.onPreExecute();
            progressDialog = ProgressDialog.show(UploadActivity.this,"Your Data is Uploading....",false,false);
        }
        @Override
        protected void onPostExecute(String string1) {
            super.onPostExecute(string1);
            progressDialog.dismiss();
         }
        @Override
        protected String doInBackground(Void... params) {
            ImageProcessClass imageProcessClass = new ImageProcessClass();
            HashMap<String,String> HashMapParams = new HashMap<>();
            HashMapParams.put(ImageName1, imageName1);
            HashMapParams.put(UserName, userName);
            HashMapParams.put(ImagePath1, imageView1);
            return imageProcessClass.ImageHttpRequest(ServerUploadPath, HashMapParams);
        }
    }
    AsyncTaskUploadClass AsyncTaskUploadClassOBJ = new AsyncTaskUploadClass();
    AsyncTaskUploadClassOBJ.execute();
}

【问题讨论】:

    标签: android memory-leaks android-asynctask


    【解决方案1】:

    这是 Java 内部类的本质 - 类中的类具有对父实例的隐藏引用。这可能会导致内存泄漏。避免这种情况的方法是使其成为静态内部类-static class Foo。这将导致它删除隐藏的引用,但内部类将不再能够引用父级的函数或成员变量。

    更实际地——这种类型的 AsyncTask,虽然从技术上讲会导致临时泄漏,但只要 doInBackground 函数在合理的时间内终止,它就相当安全。对于此类,如果 imageProcessClass.ImageHttpReques() 在合理的时间内运行并终止(出现超时错误或完成其工作),则不必担心泄漏-只是父类看起来像活动,在它这样做之前不会被释放。因此,如果 Activity 已完成但请求正在处理中,它将强制父类比所需的时间多停留一两秒。

    【讨论】:

    • 感谢@Gabe Sechan 提供的有用见解。 imageProcessClass.ImageHttpRequest() 有 10 秒超时错误。这可以被认为是一个合理的时间吗?。
    • 是的,这是合理的。这意味着它最多可以在 Activity 被释放后将其保留 10 秒。除非您的内存已经非常低,否则这不是问题。您可能想要做的一件事是在 onPostExecute 检查活动是否已经完成,如果是,则什么也不做(那么更新活动毫无意义)
    • 我可以这样检查吗? @Override protected void onPostExecute(String string1) { super.onPostExecute(string1); if(isFinishing ()){ progressDialog.dismiss(); }
    • 我很欣赏明确的线索。
    • 是的,这行得通。
    猜你喜欢
    • 1970-01-01
    • 2011-10-23
    • 1970-01-01
    • 2019-02-13
    • 1970-01-01
    • 1970-01-01
    • 2017-05-16
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多