Простой AsyncTasc - лучшее решение - предотвратить утечку памяти - PullRequest
0 голосов
/ 11 июня 2018

Я пытаюсь закодировать AsyncTask, но AndroidStudio предупреждает меня:

this Aynctask class should be static or leaks might occur

Я нашел решение для стека 3 здесь: click :

  1. asyncTasc статический

  2. слабый отзыв

  3. asyncListener

Эта тема старая,поэтому наверняка я спрашиваю: эти решения все еще «вовремя»?
Какое из этих решений профессионально и используется в реальных проектах?

Мой код:

@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 голосов
/ 12 июня 2018

Любое решение, которое не хранит неявную ссылку, хранящуюся внутри нестатического внутреннего класса, является полностью приемлемым.В приведенном вами примере вы можете просто изменить

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;
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...