- Home /
Heyzap Listener: delegate randomly becoming null at run time (Android)
I've "successfully" implemented ads with Heyzap. Right now I'm implementing callback routines for a "extra-life" mechanic based on ads.
The system works like such:
HeyzapAdsManager has 2 private delegates: successCallback and failedCallback. It also has a listener for the IncentiveAds Events
A GameManager calls HeyzapAdsManager.RewardVideo, sending a success callback and failed callback;
HeyzapAdsManager assigned those callbacks to it's private variables and call HZIncentvezeAd.ShowWithOptions (which shows an ad video)
The IncentiveListener is called normally, but when it has to call either the successCallback or the failedCallback, sometimes they are null, sometimes not...
I'm using Unity 5.4.3f1
Does anybody sees a flaw in this? I've been over this for hours...
HeyzapAdsManager
public class HeyZapAdsManager : SingletonMono<HeyZapAdsManager> {
public delegate void RewardVideoCallback();
private RewardVideoCallback successCallback;
private RewardVideoCallback failedCallback;
protected override void Awake()
{
base.Awake();
HeyzapAds.Start(Constants.HeyZap.PublisherID, HeyzapAds.FLAG_DISABLE_AUTOMATIC_FETCHING);
....
HZInterstitialAd.SetDisplayListener(InterstitialListener);
}
GameManager
private void ExtraLife(bool video, int medalAmount)
{
if (video)
{
HeyZapAdsManager.instance.ShowRewardVideoAd(
Constants.HeyZapTags.EXTRA_LIFE_VIDEO, GrantExtraLife, GameOver);
playerRevive.chosedToWatchVideo = true;
playerRevive.VideoWatched();
}
...
}
HeyzapAdsManager - ShowAds and Listener
public void ShowRewardVideoAd(string tag,
RewardVideoCallback success, RewardVideoCallback fail)
{
successCallback = success;
failedCallback = fail;
if (HZIncentivizedAd.IsAvailable(tag))
{
HZIncentivizedShowOptions showOptions = new HZIncentivizedShowOptions();
showOptions.Tag = tag;
HZIncentivizedAd.ShowWithOptions(showOptions);
}
}
....
private void IncentiveListener(string adState, string adTag)
{
if (adState.Equals("incentivized_result_complete"))
{
Debug.Log("GIVE REWARD WITH TAG with tag: " + adTag);
if (successCallback != null)
{
Debug.Log("SUCESS_CALLBACK");
successCallback();
}
else
throw new System.Exception("Success callback is null!");
FetchRewardVideoAd(adTag);
}
if (adState.Equals("incentivized_result_incomplete"))
{
Debug.Log("NOT give reward with tag: " + adTag);
if (failedCallback != null)
{
failedCallback();
}
else
throw new System.Exception("Failed callback is null!");
FetchRewardVideoAd(adTag);
}
}
Answer by $$anonymous$$ · Mar 27, 2017 at 06:46 PM
Ok, so I actually solved the problem... From a coding perspective there isn't nothing wrong... But was a problem with persistency among scenes...
HeyzapAdsManager was marked as "DontDestroyOnLoad" among scenes, and after a while I realize this problem didn't happened ramdonly, but only after the second time the level was loaded (menu -> game -> back to menu -> game)... After changing it to be destroyed and created at every scene creation the problem was solved...
Kinda crazy that happened though, could be related to how Unity unload/load scenes?
Your answer
Follow this Question
Related Questions
Unity Built in Android Ads 3 Answers
question about unity analytics 0 Answers
Unity Ads can not show more than 1 time after install game 0 Answers