Arhn - архитектура программирования

Android: повторное использование одного и того же объекта View в разных действиях (дело касается рекламных баннеров)

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

Я почти сделал это. Дело, конечно, в контексте.

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

Я попытался с некоторой активностью, которую я не возражал против утечки один раз и дал ее в качестве контекста. Это работало, на самом деле все работало, пока я не начал получать странные исключения в ViewFlipper.

Мой вопрос в том, действительно ли возможно такое повторное использование и как сделать его стабильным? У вас есть опыт в этом?

Заранее БОЛЬШОЕ спасибо, Дэн


  • зачем тебе это? представление допустимо в данном контексте, допустимым контекстом для представления является действие, если вы создаете новое действие, вы должны создать новое представление 09.01.2012
  • Является ли это возможным? Возможно. Это стабильно? Вполне вероятно, что этого не так просто добиться. Есть ли вообще веская причина для такой цели? 09.01.2012
  • Думаю, у меня есть веская причина. Я говорю о просмотрах рекламы, которые являются сторонними, и я не хочу загружать их с каждой новой активностью. 09.01.2012
  • Насильственно избегать перезагрузки рекламных просмотров таким образом противоречит условиям предоставления услуг. Если вы сделаете это, вы можете не получить от них денег. Проведя некоторое исследование рекламы, лучше получать клики, а не просмотры, поэтому мой предпочтительный способ отображения рекламы — это периодическое всплывающее окно (1 раз в неделю), которое показывает рекламу и просит вас щелкнуть или нажать кнопку «Пропустить» ниже. Это дает гораздо лучшие рейтинги кликов и гораздо больше денег. 13.01.2012
  • Это совсем не моя ситуация. И я не говорю о межстраничной рекламе. Я говорю о рекламных баннерах. Я перезагружаю рекламу каждые 60 секунд. По крайней мере, это мое намерение. Реальность такова, что я перезагружаю рекламу гораздо чаще из-за смены действий и необходимости снова перезагружать просмотры рекламы. Это снижает рейтинг кликов ниже реальных значений. 13.01.2012

Ответы:


1

Я имею в виду, что вы можете позволить себе утечку 1 действия, поскольку это единственное известное мне решение: объявить статическое представление, скажем, myAdView в вашем 1-м действии (в котором вы запрашиваете рекламу). Теперь вы можете рекламировать и удалять этот myAdView при каждой транзакции активности. Конечно, вам придется поддерживать отдельные LinearLayouts для ваших объявлений в отдельных действиях, где мы будем добавлять/удалять myAdView, например. Предположим, вы переходите от активности A к B, затем в onPause A удалите myAdView:

private LinearLayout layoutAd;
layoutAd = (LinearLayout) findViewById(R.id.layout_ad); // from A's xml
protected void onPause() {
    super.onPause();
    layoutAd.removeView(FirstActivity.adBannerView);
}

и в onResume B добавьте тот же (FirstActivity) myAdView:

private LinearLayout layoutAd;
layoutAd = (LinearLayout) findViewById(R.id.layout_ad);  // from B's xml
protected void onResume() {
      super.onResume();
      layoutAd.addView(FirstActivity.adBannerView);
}

Надеюсь, это решит вашу проблему в какой-то степени.

13.01.2012
  • Да, это то, что я делал, отсюда и проблемы с исключениями ViewFlipper. (Я думаю, что это причина, так как это начало происходить после того, как я реализовал подобное решение) 13.01.2012
  • Вам не нужно реализовывать ViewFlipper для этого! И я делал это в своих играх без каких-либо сбоев. 13.01.2012
  • Я не реализую ViewFlipper. Это исключение, которое я начал получать после реализации аналогичного решения. Вопрос - сколько активностей в ваших играх открыто/закрыто за сессию? Меньше 10 или больше - 30-40 за сеанс? Спасибо. 13.01.2012
  • кстати, между моей и вашей реализацией есть некоторые отличия. Это может быть ключом к этому исключению. Я попробую ваше точное предложение и сообщу вам результаты. 13.01.2012
  • Хорошо. Ну, в зависимости от игры пользователей, может быть открыто/закрыто более 10 действий в сеансе. Это рыночная ссылка этой игры: market.android.com / 13.01.2012

  • 2

    Почему вы не используете Фрагменты?

    http://developer.android.com/guide/topics/fundamentals/fragments.html

    Я думаю, что ваш вариант использования идеально подходит для этого.

    17.01.2012
  • из документации: Остановленный фрагмент все еще жив (вся информация о состоянии и членах сохраняется системой). Однако он больше не виден пользователю и будет уничтожен, если активность будет уничтожена. 18.01.2012

  • 3

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

    Вместо этого вы должны создавать представление в каждом действии, которое вам нужно, и вместо этого передавать только те данные, которые вам нужны для его заполнения.

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

    Обновление:

    Поскольку вы раскрыли цель этого вопроса (перехват показа рекламы из сторонней библиотеки), я предлагаю вам сначала связаться с компанией и проверить условия использования. Если они разрешат использовать свой сервис, минуя код просмотра, то они могут предоставить вам API более низкого уровня для отображения рекламы по вашему усмотрению.

    Если такое использование не разрешено, учтите тот факт, что они могут заблокировать вашу учетную запись (и удержать платеж) за неправомерное использование.

    Если вы все еще хотите продолжить: НЕ взламывайте шаблоны пользовательского интерфейса Android, чтобы это работало. Извлеките рекламные изображения из сторонней библиотеки на стороне сервера (т. е. создайте простое размещенное веб-приложение Java с хранилищем кеша и REST API) и покажите рекламу в свое Android-приложение из этой службы «человек посередине». Однако я, конечно, не одобряю этот метод.

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

    09.01.2012
  • Да, рефакторинг лучше всего, и использование данных было бы превосходным, если это возможно. К сожалению, представления, которые я хочу перенести в другую деятельность, являются сторонними, и извлечь из них данные на самом деле невозможно. 09.01.2012
  • Поскольку не в моих силах решать, какие рекламные сети мне интегрировать, я должен найти выход из сложившейся ситуации. И, поверьте, если я смогу сделать такой сервер для 10+ рекламных сетей, я сразу окунусь в рекламный бизнес. Кроме того, я очень сомневаюсь, что это неправильное использование, поскольку оно хорошо интегрировано в приложение для iPhone. Мы намерены запрашивать рекламу каждые 60 секунд, но в Android это происходит гораздо чаще из-за проблемы. Я вижу ваш ответ, что это невозможно, спасибо за это. 13.01.2012
  • Нет проблем, Данил. Я понимаю, что это не тот ответ, который вы ищете, надеюсь, вы найдете тот, который вам подходит. 13.01.2012
  • Если реклама не интерактивна (или взаимодействие легко имитировать), возможно, вы могли бы рассмотреть возможность сделать снимок экрана, обрезать изображение только для просмотра рекламы и отобразить полученное изображение между 60-секундными интервалами? Это будет соответствовать платформе Android и решить вашу проблему с трафиком... 13.01.2012

  • 4

    Я в том же деле, что и Данаил. Дело не в том, чтобы взломать рекламного провайдера, а в том, что если вы хотите показывать баннер через различные действия, рекомендуется в рекламе не перезагружать его каждый раз, когда вы меняете действие, потому что вы делаете больше показов, поэтому ваш CTR (клик Через Ratio) уменьшится. Вы бы предпочли перезагружать баннер с фиксированной скоростью, независимо от изменений активности.

    Я думаю, что правильный способ сделать это, как говорит NeTeInStEiN, использовать фрагменты. У вас может быть уникальная активность, состоящая из разных фрагментов. В одном из фрагментов, например внизу, у вас будет баннер, и вы загрузите его фактически один раз. Затем на большей области вверху (скажем, мы на телефоне) вы размещаете разные фрагменты, один за другим, которые будут соответствовать вашим текущим действиям. Когда вы обычно «меняете» активность, теперь вы просто меняете «основной» фрагмент, но фрагмент баннера остается неизменным.

    Основная и БОЛЬШАЯ проблема с этим подходом заключается в том, что вам нужно проектировать приложение таким образом с самого начала, потому что изменение модели приложения с нескольких действий на одно действие с несколькими фрагментами - это довольно большое изменение кода... :.(

    Итак, я понимаю, что за затраты на реализацию можно попытаться «перенести» представление с одного вида деятельности на другой. Но, как я видел в других ответах, это действительно не рекомендуется и хлопотно...

    08.08.2013

    5

    Если вы хотите, чтобы переменная использовалась в нескольких действиях, то лучше всего поместить их в отдельный класс (может называться Constants или MyVars) в качестве статической переменной и использовать их в любом действии, которое вы хотите, например, Constants.SavedVar или MyVars.SavedVar, как показано ниже, является примером кода.

    public class MyStaticVars {
    
    public static Context myContext;
    }
    
    // First Activity where you want to save a specific context
    
    MyStaticVars.myContext = ContextToBeSaved;
    
    // Any Other Activity where you want to reuse that context
    
    priviousContext = MyStaticVars.myContext;
    
    09.01.2012
  • вы понятия не имеете, о чем вы говорите ... Контекст будет активностью ... если активность будет уничтожена, она больше не действует. 09.01.2012
  • Do not keep long-lived references to a context-activity (a reference to an activity should have the same life cycle as the activity itself) с сайта developer.android.com/resources/articles/ так что нет, это абсолютно не лучшая практика 09.01.2012
  • на самом деле, я могу позволить себе утечку одного действия только для того, чтобы использовать его в качестве контекста для всех моих статических представлений (переменных представлений, которые я хочу поместить в разные действия). Проблемы, с которыми я сейчас борюсь, намного хуже. 09.01.2012
  • Новые материалы

    Коллекции публикаций по глубокому обучению
    Последние пару месяцев я создавал коллекции последних академических публикаций по различным подполям глубокого обучения в моем блоге https://amundtveit.com - эта публикация дает обзор 25..

    Представляем: Pepita
    Фреймворк JavaScript с открытым исходным кодом Я знаю, что недостатка в фреймворках JavaScript нет. Но я просто не мог остановиться. Я хотел написать что-то сам, со своими собственными..

    Советы по коду Laravel #2
    1-) Найти // You can specify the columns you need // in when you use the find method on a model User::find(‘id’, [‘email’,’name’]); // You can increment or decrement // a field in..

    Работа с временными рядами спутниковых изображений, часть 3 (аналитика данных)
    Анализ временных рядов спутниковых изображений для данных наблюдений за большой Землей (arXiv) Автор: Рольф Симоэс , Жильберто Камара , Жильберто Кейрос , Фелипе Соуза , Педро Р. Андраде ,..

    3 способа решить квадратное уравнение (3-й мой любимый) -
    1. Методом факторизации — 2. Используя квадратичную формулу — 3. Заполнив квадрат — Давайте поймем это, решив это простое уравнение: Мы пытаемся сделать LHS,..

    Создание VR-миров с A-Frame
    Виртуальная реальность (и дополненная реальность) стали главными модными терминами в образовательных технологиях. С недорогими VR-гарнитурами, такими как Google Cardboard , и использованием..

    Демистификация рекурсии
    КОДЕКС Демистификация рекурсии Упрощенная концепция ошеломляющей О чем весь этот шум? Рекурсия, кажется, единственная тема, от которой у каждого начинающего студента-информатика..