Подтвердить что ты не робот

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

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

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

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

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

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

Спасибо МНОГО заранее, Dan

4b9b3361

Ответ 1

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

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

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

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

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

Ответ 3

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

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

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

Update:

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

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

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

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

Ответ 4

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

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

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

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

Ответ 5

Если вы хотите, чтобы переменная использовалась в нескольких действиях, лучше всего использовать их в отдельном классе (можно назвать константами или MyVars) в качестве статической переменной и использовать их в любом действии, которое вы хотите, как Константы .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;