共享首选项值更改时,视图未更新

时间:2019-05-21 14:29:27

标签: android android-layout android-intent sharedpreferences

我正在使用共享的首选项保存用户的项目点击,然后在2次点击后显示admob广告,一切正常,但是我的问题是,当我单击项目2-3次时,该值保存到共享的偏好设置中但该广告没有展示,我必须退出我的应用,然后该广告才展示。

我已经在google上搜索了stackoverflow,但没有任何帮助。

P.s。单击该项目将启动另一个活动

   @Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    setContentView(R.layout.activity_main);
    Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
    setSupportActionBar(toolbar);

    rvWord = findViewById(R.id.recyclerview);
    rvWord.setLayoutManager(new LinearLayoutManager(getApplicationContext()));
    mDBHelper = new DatabaseHelper(this);

    mAdView = findViewById(R.id.adView);

    dictionaryAdapter = new DictionaryAdapter(this);
    dictionaryAdapter.setCursor(mDBHelper.getDictionaryWord(""));
    rvWord.setAdapter(dictionaryAdapter);

    mInterstitialAd = new InterstitialAd(this);
    mInterstitialAd.setAdUnitId("ca-app-pub-3940256099942544/1033173712");
    mInterstitialAd.loadAd(new AdRequest.Builder().build());


    preferences = getSharedPreferences("click_count",MODE_PRIVATE);

    if ( preferences.getInt("count", 0) > 2) {

        mInterstitialAd.setAdListener(new AdListener() {
            public void onAdLoaded() {
                if (mInterstitialAd.isLoaded()) {
                    mInterstitialAd.show();
                }
            }
        });
        editor = preferences.edit();
        editor.clear();
        editor.apply();

    }
    // Show Notification Daily
    showTimedNotification(this);

    DrawerLayout drawer = (DrawerLayout) findViewById(R.id.drawer_layout);
    ActionBarDrawerToggle toggle = new ActionBarDrawerToggle(
            this, drawer, toolbar, R.string.navigation_drawer_open, R.string.navigation_drawer_close);
    drawer.addDrawerListener(toggle);
    toggle.syncState();

    NavigationView navigationView = (NavigationView) findViewById(R.id.nav_view);
    navigationView.setNavigationItemSelectedListener(this);
}

2 个答案:

答案 0 :(得分:1)

问题可能是广告没有加载显示。根据{{​​3}},您必须在onCreate方法中加载广告。

将以下几行移至onCreate方法

mInterstitialAd = new InterstitialAd(this);
mInterstitialAd.setAdUnitId("ca-app-pub-3940256099942544/1033173712");
mInterstitialAd.loadAd(new AdRequest.Builder().build());

并在插页式广告关闭时加载新广告,以便下次单击按钮时可以显示此已加载的广告。使用以下代码更新AdListener。如果需要在返回时检查首选项值,则必须在onStart方法中使用它,因为onCreate方法仅在应用程序重新启动时才被调用。阅读此docs可以了解android活动的生命周期

@Override
protected void onStart() {
    super.onStart();
    if ( preferences.getInt("count", 0) > 2) {

        mInterstitialAd.setAdListener(new AdListener() {
            public void onAdLoaded() {
                if (mInterstitialAd.isLoaded()) {
                    mInterstitialAd.show();
                }
            }
            @Override
            public void onAdClosed() {
               // Load the next interstitial.
               mInterstitialAd.loadAd(new AdRequest.Builder().build());
            }
        });
        editor = preferences.edit();
        editor.clear();
        editor.apply();

    }
}

答案 1 :(得分:0)

我有同样的问题,但是当我使用commit()而不是apply()时。可能会很好。

  1. 因为apply()是异步的,所以它提交时没有返回表示成功或失败的布尔值。

  2. 和commit()是同步的,如果保存有效,则返回true,否则返回false。