1

答案在底部。

我添加了对 4.0.4 浏览器的修改,它添加了一个新的首选项部分。当浏览器启动时,该值被正确读取并且似乎被缓存了。每当 Controller.java 使用 getMaxTabs 时,我都添加了一个日志事件,并且它仅在首次启动时读取。如果我更改设置,则不会发生任何事情。但是,如果我在更改设置后终止浏览器并重新启动,则会正确读取新值。有没有办法强制此设置在更改时重新缓存?

我正在查看 SharedPreferences.OnSharedPreferenceChangeListener 但我看不到如何强制重新读取该变量。

int getMaxTabs() {
    Context mContext = mActivity.getApplicationContext();
    SharedPreferences mPrefs = PreferenceManager.getDefaultSharedPreferences(mContext);
    String numTabs = mPrefs.getString(PreferenceKeys.PREF_MAX_TABS, "20");
    int t = Integer.parseInt(numTabs);
    Log.i("max open tabs", "max: " + t);
    return t;
    // The original content of getMaxTabs is below
    // return mActivity.getResources().getInteger(R.integer.max_tabs);
}

所以日志项只在浏览器第一次启动时出现。设置了新的首选项,因为如果我更改它并杀死/重新启动浏览器,则会反映新值。我需要不缓存此设置或强制在更改时刷新缓存,这样会更有效率。

src/com/android/browser/preferences/TabsPreferencesFragment.java

package com.android.browser.preferences;

import android.os.Bundle;
import android.preference.Preference;
import android.preference.PreferenceFragment;

import com.android.browser.BrowserSettings;
import com.android.browser.PreferenceKeys;
import com.android.browser.R;
import com.android.browser.search.SearchEngine;

public class TabsPreferencesFragment extends PreferenceFragment {

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        // Load the XML preferences file
        addPreferencesFromResource(R.xml.tabs_preferences);
    }
}

res/xml/tabs_preferences.xml

<?xml version="1.0" encoding="utf-8"?>
<PreferenceScreen
        xmlns:android="http://schemas.android.com/apk/res/android" >
    <ListPreference
        android:key="max_open_tabs"
        android:defaultValue="20"
        android:title="@string/pref_max_open_tabs"
        android:entries="@array/pref_max_open_tabs_choices"
        android:entryValues="@array/pref_max_open_tabs_values"
         />
</PreferenceScreen>

这就是它在 src/com/android/browser/TabControl.java 中的调用方式

private int mMaxTabs;

TabControl(Controller controller) {
    mController = controller;
    mMaxTabs = mController.getMaxTabs();
    mTabs = new ArrayList<Tab>(mMaxTabs);
    mTabQueue = new ArrayList<Tab>(mMaxTabs);
}

boolean canCreateNewTab() {
    return mMaxTabs > mTabs.size();
}

解决方案
答案就在这里,在 packages/apps/Browser/src/com/android/browser/TabControl.java

在第 55 行附近,我们看到:

/**
 * Construct a new TabControl object
 */
TabControl(Controller controller) {
    mController = controller;
    mMaxTabs = mController.getMaxTabs();
    mTabs = new ArrayList<Tab>(mMaxTabs);
    mTabQueue = new ArrayList<Tab>(mMaxTabs);
}

TabControl 对象在浏览器启动时构建一次。这里我们通过调用 mController.getMaxTabs() 来定义 mMaxTabs。

在第 155 行附近,使用 mMaxTabs 定义了 canCreateNewTab。

boolean canCreateNewTab() {
    return mMaxTabs > mTabs.size();
}

由于 mMaxTabs 是一个静态值,它永远不会在首选项更新时改变。

解决方案是这样的。

/**
 * Construct a new TabControl object
 */
TabControl(Controller controller) {
    mController = controller;
    mTabs = new ArrayList<Tab>(mMaxTabs);
    mTabQueue = new ArrayList<Tab>(mMaxTabs);
}

boolean canCreateNewTab() {
    return mController.getMaxTabs() > mTabs.size();
}

现在,每次请求新的浏览器选项卡时,都会验证首选项设置。

4

0 回答 0