Некоторые помогают выявить утечки памяти - PullRequest
2 голосов
/ 03 января 2011

У меня есть несколько человек, которые используют мое приложение, и, похоже, через несколько дней телефон становится менее отзывчивым и немного странным, если мое приложение не убивают.

Я бы хотел немного помочь с управлением памятью. У меня есть несколько вопросов:

1) Я делаю очень мало ссылок на статические классы или переменные в моем приложении. У меня есть класс (в своем собственном файле), который по сути является Singleton. Этот класс просто имеет методы в нем. Без переменных и тому подобное. Мое приложение интенсивно использует вызовы веб-служб, и этот класс является точкой доступа для этого. Вызов метода в этом классе загрузит IntentService, который выполняет фактический вызов веб-службы. Вот пример. Обратите внимание, что метод callWebService также ссылается на MyIntentService.JOB_DELETE и MyIntentService.ITEM_ALL, которые являются статическими целочисленными значениями в MyIntentService:

public class MySingleton {

    private static MySingleton mInstance = null;
    protected MySingleton() { }
    public synchronized static MySingleton getInstance() {
        if (mInstance == null) {
            mInstance = new MySingleton();
        }
        return mInstance;
    }

    public void callWebService(Context appContext, int intUserId) {
        Intent intent = new Intent();
        intent.setClass(appContext, MyIntentService.class);

        intent.putExtra("job", MyIntentService.JOB_DELETE);
        intent.putExtra("data_type", MyIntentService.ITEM_ALL);
        intent.putExtra("user_id", intUserId);

        appContext.startService(intent);
    }
}

В своей деятельности я звоню:

MySingleton.getInstance().callWebService(getApplicationContext(), ((MyApplication)getApplicationContext()).getUserId());

Есть ли что-то, что я делаю здесь не так? Поскольку этот синглтон состоит только из методов, было бы лучше, если бы он не был синглтоном и чтобы все методы были статическими?

2) Курсоры.

У меня есть несколько Активов, которые используют CursorAdapters. Я буду запрашивать курсор с помощью AsyncQueryHandler. Когда AsyncQueryHandler получает Cursor, я вызываю changeCursor в моем CursorAdapter, передавая этот новый Cursor. В обработчике changeCursor моего CursorAdapter я передаю Cursor в super, затем устанавливаю личную переменную-член Cursor моей Activity для этого Cursor и вызываю startManagingCursor.

После этого я ничего не делаю в методах onPause () или onStop (), чтобы остановить управление курсором или обнулить его или что-то еще. Это неправильно? Я думаю, что может произойти некоторая утечка, выполнив небольшой тест. Если я прокручиваю ListView вниз и поворачиваю экран, действие «уничтожается», воссоздается, запрашивается новый курсор, а ListView автоматически прокручивается до того места, где он находился до поворота экрана. Очевидно, что он все еще имеет доступ к предыдущему Курсору, верно? Я не совсем уверен, как Android это делает.

Если я позвоню mCursor.close (); в обработчике onStop () это создает проблему. Когда экран поворачивается и заполняется, пользователь теряет позицию прокрутки. Это явно нежелательно. Так что мне делать? Получу ли я позицию прокрутки, закрою курсор, а затем передам позицию прокрутки через saveInstanceState?

3) Как запустить автономный DDMS? Если я открываю его с открытым Eclipse, он жалуется на уже запущенный экземпляр DDMS и закрывается. Если я закрываю Eclipse, запускаю эмулятор, а затем запускаю автономную DDMS, он ничего не видит.

4) Что еще мне нужно знать, учитывая то, что вы знаете о моем опыте работы с Android (основываясь на этом или других постах)? Я прочитал несколько статей Ромена Гая, и я избавился от потенциальных проблем, но, безусловно, я еще не осознал этого.

1 Ответ

0 голосов
/ 03 января 2011

Почему вы запускаете сервис с помощью метода callWebService?Просто сделайте работу в этом методе.Если вы действительно думаете, что это должен быть сервис, просто отбросьте синглтон, и ваша деятельность будет привязана к сервису и вызовите там его метод.

И да, это неправильно, вы должны закрыть курсор.Вы должны закрыть его в onStop и открыть его в onStart или onResume, если необходимо.Вы действительно должны закрыть его как можно скорее.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...