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

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

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

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

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

【问题讨论】:

    标签: android android-layout android-intent sharedpreferences


    【解决方案1】:

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

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

    2. 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 语句没有在我的主要活动中执行,为了好奇,我试图将相同的代码放在我的视图持有者适配器中,并且效果很好
      • 你在哪里有这个代码?能发下完整代码吗
      • 更新了我的答案。希望这将有助于解决问题
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-06-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多