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

Posted

技术标签:

【中文标题】共享首选项值更改时视图不更新【英文标题】:View not updating when shared preferences value is changed 【发布时间】:2019-10-07 23:32:01 【问题描述】:

我正在使用共享首选项来保存用户项目点击,然后在 2 次点击后显示 admob 广告一切正常,但我的问题是当我点击一个项目 2-3 次时,该值被保存到共享首选项但是广告没有显示,我必须退出我的应用程序然后才会显示广告。

我在 google 和 *** 上搜索过,但没有任何帮助。

附:项目点击启动另一个活动

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

【问题讨论】:

【参考方案1】:

我有同样的问题,但是当我使用 commit() 而不是 apply() 时。它可能工作正常。

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

    commit() 是同步的,如果保存成功则返回 true,否则返回 false。

【讨论】:

【参考方案2】:

问题可能是广告未加载显示。根据docs,您必须在 onCreate 方法中加载广告。

将下面的行移至您的 onCreate 方法

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

并在插页式广告关闭时加载新广告,以便下次单击按钮时可以显示此已加载的广告。使用以下代码更新 AdListener。如果需要在返回时检查首选项值,则必须在 onStart 方法中使用它,因为只有在应用程序重新启动时才会调用 onCreate 方法。阅读此doc 以了解 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();

    

【讨论】:

我更新了我的代码。您必须在 if 条件内移动 editor.clear();。否则,在计数大于 2 之前,该值被清除。希望这能解决问题 尝试在if ( preferences.getInt("count", 0) > 2) 调试您的代码,检查问题出在广告上还是计数上。即检查if条件是否正常 问题是当我从详细活动导航返回时,if 语句没有在我的主要活动中执行,为了好奇,我试图将相同的代码放在我的视图持有者适配器中,并且效果很好 你在哪里有这个代码?能发下完整代码吗 更新了我的答案。希望这将有助于解决问题

以上是关于共享首选项值更改时视图不更新的主要内容,如果未能解决你的问题,请参考以下文章

当我更改视图时,为啥我的按钮首选项/参数会重置?

共享首选项编辑器需要花费大量时间来提交更改

Flutter:共享首选项的奇怪行为

在导致空指针的活动中使用共享首选项,这让我起了作用

java 更改摘要共享首选项

我的共享首选项存储列表视图的数据并检索它不起作用