Как использовать несколько MapActivities/MapViews для приложения/процесса Android

Я написал один класс MapActivity, который может отображать набор мест, а также отдельные места. При запуске приложение создает экземпляр этого MapActivity и отображает несколько мест. Если пользователь нажимает на определенное место, запускается новый Activity, который показывает детали выбранного места. Это действие имеет пункт меню, который позволяет пользователю просматривать место на карте — это приводит к созданию нового экземпляра MapActivity, за исключением того, что теперь отображается только это одно место.

Теперь проблема заключается в том, что если пользователь вернется к первому MapActivity (тот, который показывает несколько мест), плитки больше не будут загружаться + иногда встречаются OutOfMemoryErrors.

Согласно Android JavaDocs, для каждого процесса может быть только один MapActivity. Однако я не хочу определять свой MapActivity как singleInstance/singleTask, поскольку пользователь всегда должен иметь возможность вернуться к первой MapActivity, которая показывает несколько мест.

Я видел, что приложение Google Places (поставляемое с Google Map 4.4) для Android использует несколько экземпляров MapActivity. Как это возможно? И как я могу добиться этого в своем приложении?


person stacky    schedule 31.07.2010    source источник


Ответы (4)


Согласно Android JavaDocs, для каждого класса может быть только одна MapActivity.

Это не одно представление карты для каждого класса, это для каждого процесса.

Известно, что у вас могут возникнуть некоторые проблемы при использовании нескольких представлений карты в одном процессе. Обычно это так (ваше приложение работает в одном процессе), если вы не настраиваете ничего конкретного. Однако вы можете использовать атрибут android:process в своем манифесте, чтобы назначить свои действия:

<activity android:name=".activity.directory.MapView1" android:process=":MapView1">

<activity android:name=".activity.directory.MapView2" android:process=":MapView2">

Таким образом, у вас есть действия, работающие в отдельных процессах, что хорошо работает, если вы не используете какие-либо общие статические переменные для действий.

Также см. обсуждение ошибки в системе отслеживания ошибок Android:

http://code.google.com/p/android/issues/detail?id=3756

person Mathias Conradt    schedule 01.08.2010
comment
Спасибо за Ваш ответ. Я уже знал о возможности использования атрибута android:process. Однако в моем случае у меня есть только одна MapActivity, определенная в файле AndroidManifest.xml, которая может отображать несколько мест, а также отдельные места. Теперь я мог бы разделить эту единственную MapActivity на две MapActivity (как вы предлагаете), но мне интересно, есть ли какие-либо другие решения - я не думаю, что в приложении Google Places для Android каждый экземпляр MapActivity выполняется в отдельном процессе. Пока что я предпочитаю переделывать свое приложение s.t. всегда активна только одна MapActivity. - person stacky; 01.08.2010
comment
Глядя на файл журнала во время работы Google Places, я могу подтвердить, что все действия происходят в одном процессе. Тем не менее, я бы не стал предполагать, что Google Apps полностью построены на основе только общедоступных компонентов SDK, но также имеют некоторые непубличные пользовательские компоненты; т. е. именно поэтому Google Maps использует другого поставщика фрагментов карты и является более точным, чем MapView SDK и т. д. Процессный подход является распространенным при работе с SDK и современным единственным обходным путем, о котором я знаю, также ссылаясь на группу разработчиков Android и средство отслеживания ошибок Android SDK. - person Mathias Conradt; 01.08.2010
comment
Мое приложение содержит макет вкладок (TabHost, TabSpec). Я использую два представления карты в своем приложении. Поэтому, если я включаю вид со спутника в одном из видов карты, тогда другая карта также отображается в виде со спутника, если я перетаскиваю одну карту в сторону США, другой вид карты также перетаскивается в сторону США, независимо от того, куда он указывал ранее. Я использовал вышеуказанное решение, но оно не решает мою проблему. В чем может проблема? - person AndroidDev; 08.06.2012
comment
Я создал простое приложение. Действие, содержащее кнопку для запуска удаленного действия. Нажатие кнопки создает другое удаленное действие, которое я вижу в DDMS. Но когда дело доходит до приложения моей вкладки (TabHost, TabSpec), оно не работает!!! - person AndroidDev; 08.06.2012

У вас может быть более одной MapActivity на процесс, если только одна из них выполняется одновременно. Каждому MapActivity может быть назначен только один MapView. Вы можете показывать разные карты, повторно используя один и тот же MapView в одной и той же MapActivity. Вы можете повторно использовать MapView, объявив его как статическую переменную класса, удалив его из представления, в которое оно было добавлено в настоящее время, когда вы закончите его отображение, присвоив ему новые координаты GPS и добавив его в следующее представление. Когда вы закончите с этой MapActivity, завершите ее, а затем вы можете открыть новую MapActivity. Это работает, я делаю в своем приложении.

person Danny Remington - OMS    schedule 29.07.2011

Еще одно простое решение: просто переопределите метод onDestroy всех ваших MapActivities, чтобы предотвратить закрытие ресурсов, например:

    @Override
    protected void onDestroy() {
        super.onStop();
    }

Мы должны вызвать onStop здесь, чтобы предотвратить запуск RuntimeException. Да, это хак, но он работает.

person Flavio    schedule 07.04.2011

Обновлять:

Google Maps Android API v2 поддерживает фрагменты. Это означает, что вы можете легко отображать несколько карт, как любой другой фрагмент.

Ознакомьтесь с документацией и узнайте больше о новом MapFragment.

person Chris Broadfoot    schedule 29.04.2013