1

答えは一番下にあります。

4.0.4ブラウザーに変更を加えて、新しい設定セクションを追加しました。ブラウザを起動すると、値が正しく読み込まれ、キャッシュされているように見えます。getMaxTabsがController.javaによって使用され、最初の起動時にのみ読み取られるログイベントを追加しました。設定を変更しても何も起こりません。しかし、設定を変更した後にブラウザを強制終了して再起動すると、新しい値が正しく読み込まれます。変更時にこの設定を強制的に再キャッシュする方法はありますか?

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オブジェクトは、ブラウザの起動時に1回作成されます。ここでは、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