简单的AsyncTasc - 更好的解决方案 - 防止内存泄漏

时间:2018-06-11 20:03:50

标签: java android android-asynctask

我试图编写AsyncTask代码,但AndroidStudio会警告我:

this Aynctask class should be static or leaks might occur

我在堆栈3中找到了解决方案:click

  1. asyncTasc static

  2. weakReference

  3. asyncListener

  4. 这个主题已经过时了,所以我肯定会问:这些解决方案仍然是按时完成的。 ?
    哪些解决方案是专业的并用于实际项目?

    我的代码:

    @Override
    public void onClick(View view) {
    
        String loginFromUser = etLogin.getText().toString();
        String passwordFromUser = etPassword.getText().toString();
        GetUsers getUsers = new GetUsers();
        getUsers.execute(loginFromUser, passwordFromUser);
    
    }
    

    private class GetUsers extends AsyncTask<String, Void, Void>{
    
        @Override
        protected Void doInBackground(String... strings) {
    
            String login = strings[0];
            String password = strings[1];
    
            Log.w("Credentials: ", "" + login + password);
    
            return null;
        }
    }
    

1 个答案:

答案 0 :(得分:0)

任何不保持非静态内部类所包含的隐式引用的解决方案都是完全可以接受的。在您提供的示例中,您只需更改

即可
private class GetUsers extends AsyncTask<String, Void, Void>{

private static class GetUsers extends AsyncTask<String, Void, Void>{

如果在某些时候你需要引用外部类的成员,那么为外部实例创建一个WeakReference作为内部类的成员,如下所示:

private static class GetUsers extends AsyncTask<String, Void, Void> {
    private final WeakReference<OuterClass> outer;

    GetUsers(OuterClass outer) {
        this.outer = new WeakReference<>(outer);
    }

    @Override
    protected Void doInBackground(String... strings) {
        OuterClass outer = this.outer.get();
        // Return early if the outer reference is null
        if (outer == null) {
            return null;
        }
        // Your logic...
        return null;
    }
}