处理 AsyncTask 警告类应该是静态的,否则可能会发生泄漏

Posted

技术标签:

【中文标题】处理 AsyncTask 警告类应该是静态的,否则可能会发生泄漏【英文标题】:Handling AsyncTask warning class should be static or leaks might occur 【发布时间】:2020-10-30 10:33:42 【问题描述】:

我已创建为 asynctask 以将数据上传到服务器,如下所示。但它显示了这个警告。 这个 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();
    

【问题讨论】:

【参考方案1】:

如果您在函数上下文中执行此操作,则需要使您的 AsyncTask 匿名。比如:

public void ImageUploadToServerFunction()
    final String imageName1 = GetImageNameEditText1.trim();
    final String userName = GetUserName.trim();
    final String imageView1 = getStringImage1(bitmap1);
  
    new 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);
        
    .execute();

但我强烈建议不要再在 android 中使用 AsyncTask。这是一种非常肮脏的异步操作方式,理所当然地应该被弃用。解决此问题的更好方法是使用RxJava。

【讨论】:

谢谢@Darren Finch。尽管代码从 new AsyncTask. 一路创建警告

以上是关于处理 AsyncTask 警告类应该是静态的,否则可能会发生泄漏的主要内容,如果未能解决你的问题,请参考以下文章

此Loader类应该是静态的,否则可能会发生泄漏内部类内存泄漏| AsyncTaskLoader内存泄漏 -

实现 AsyncTask 的正确方法是啥?静态或非静态嵌套类?

我应该如何实现我的 AsyncTask 类?

异步线程之AsyncTask

HandlerThread类应用

异步任务(AsyncTask)