异步任务内存泄漏警告 Android
Asynctask Memory Leak Warning Android
我创建了异步任务来将数据上传到服务器,如下所示。但它会在 class AsyncTaskUploadClass 处显示此警告。 “这个 AsyncTask class 应该是静态的,否则可能会发生泄漏……”我已经阅读并尝试了弱引用样式,但我无法将它集成到这段代码中。任何线索将不胜感激。
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();
}
这是 Java 的内部 classes 的本质 - class 中的 class 具有对父实例的隐藏引用。这可能会导致内存泄漏。避免这种情况的方法是使其成为静态内部 class- static class Foo
。这将导致它删除隐藏引用,但内部 class 将无法再引用父函数或成员变量。
更实际 - 这种类型的 AsyncTask,虽然从技术上讲它会导致临时泄漏,但只要 doInBackground 函数在合理的时间内终止,它就相当安全。对于此 class,如果 imageProcessClass.ImageHttpReques() 在合理的时间内运行并终止(出现超时错误或完成其工作),这不是泄漏问题 - 只是父级class,它看起来像一个 Activity,在它释放之前不会被释放。因此,如果 Activity 已完成但请求正在处理,它将迫使父 class 停留一两秒,比需要的时间长。
我创建了异步任务来将数据上传到服务器,如下所示。但它会在 class AsyncTaskUploadClass 处显示此警告。 “这个 AsyncTask class 应该是静态的,否则可能会发生泄漏……”我已经阅读并尝试了弱引用样式,但我无法将它集成到这段代码中。任何线索将不胜感激。
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();
}
这是 Java 的内部 classes 的本质 - class 中的 class 具有对父实例的隐藏引用。这可能会导致内存泄漏。避免这种情况的方法是使其成为静态内部 class- static class Foo
。这将导致它删除隐藏引用,但内部 class 将无法再引用父函数或成员变量。
更实际 - 这种类型的 AsyncTask,虽然从技术上讲它会导致临时泄漏,但只要 doInBackground 函数在合理的时间内终止,它就相当安全。对于此 class,如果 imageProcessClass.ImageHttpReques() 在合理的时间内运行并终止(出现超时错误或完成其工作),这不是泄漏问题 - 只是父级class,它看起来像一个 Activity,在它释放之前不会被释放。因此,如果 Activity 已完成但请求正在处理,它将迫使父 class 停留一两秒,比需要的时间长。