Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/355.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 匿名类对象是否应设置为空onDestroy?_Java_Android_Memory Leaks_Anonymous Class - Fatal编程技术网

Java 匿名类对象是否应设置为空onDestroy?

Java 匿名类对象是否应设置为空onDestroy?,java,android,memory-leaks,anonymous-class,Java,Android,Memory Leaks,Anonymous Class,我听说了 类似地,匿名类还将维护对它们在其中声明的类的引用。因此,如果在活动中匿名声明和实例化异步任务,则可能发生泄漏。如果它在活动被销毁后继续执行后台工作,则对该活动的引用将持续存在,并且在后台任务完成之前不会对其进行垃圾收集 匿名类对象是否应设置为空onDestroy以防止内存泄漏?下面是我的一些代码 public class RegisterActivity extends AppCompatActivity { private ApiHandler registerHandler

我听说了

类似地,匿名类还将维护对它们在其中声明的类的引用。因此,如果在活动中匿名声明和实例化异步任务,则可能发生泄漏。如果它在活动被销毁后继续执行后台工作,则对该活动的引用将持续存在,并且在后台任务完成之前不会对其进行垃圾收集

匿名类对象是否应设置为空onDestroy以防止内存泄漏?下面是我的一些代码

public class RegisterActivity extends AppCompatActivity {
    private ApiHandler registerHandler = null;
    private static final int SERVICE_REQUEST_REGISTER = 243;

    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_register);
        init();
    }

    private void init() {
        useApiService();
        initApiHandler();
    }

    protected void useApiService() {
        apiService = ApiClient.getClient(getApplicationContext()).create(ApiInterface.class);
    }

    private void initApiHandler() {
        registerHandler = new ApiHandler(this, SERVICE_REQUEST_REGISTER) {
            @Override
            protected String successStatusCode() {
                return "802";
            }

            @Override
            protected String secretKey() {
                return getDefaultKey();
            }

            @Override
            protected boolean isExchangeSecretKey() {
                return false;
            }
        };
    }

    @Override
    protected void onDestroy() {
        super.onDestroy();
        registerHandler = null;
    }
}

事实上,我是为你做的

您粘贴的文本说明,如果您正在创建的匿名类启动了一个新的AsyncTask,那么您创建它的主类将永远不会被销毁


换句话说,虽然有一个匿名类运行tasks,但从不在主类上调用onDestroy

,如果您正在生成一个AsyncTask,并且您知道活动将被销毁或可能在过程中被销毁,那么在onDestroy()内部调用AsyncTask.cancel(),然后在super.onDestroy()之前调用onDestroy()。。。另外,在AsyncTask类内部,在onCancel()内部,请确保清除所有内容,因为取消引用没有人们通常认为的有用,通常是不必要的。预防胜于治疗。不要为引用设置空值,不要做GC的工作,而是仔细地确定引用的范围。不要使用内部类不适当地保留对包含类实例的引用。如果您正确地协调了对象的生命周期,那么您就不需要笨拙的黑客来协调内存管理。