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);
        }
    }

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?