Как использовать системы кэшей в направляющих?

Я сделал свою собственную реализацию Application.ActivityLifecycleCallbacks . Я использую SherlockActivity, но для обычного класса Activity может работать.

Во-первых, я создаю интерфейс, который имеет все методы для отслеживания жизненного цикла действий:

public interface ActivityLifecycleCallbacks{
    public void onActivityStopped(Activity activity);
    public void onActivityStarted(Activity activity);
    public void onActivitySaveInstanceState(Activity activity, Bundle outState);
    public void onActivityResumed(Activity activity);
    public void onActivityPaused(Activity activity);
    public void onActivityDestroyed(Activity activity);
    public void onActivityCreated(Activity activity, Bundle savedInstanceState);
}

Во-вторых, я реализовал этот интерфейс в классе моего Приложения:

public class MyApplication extends Application implements my.package.ActivityLifecycleCallbacks{

    @Override
    public void onCreate() {
        super.onCreate();           
    }

    @Override
    public void onActivityStopped(Activity activity) {
        Log.i("Tracking Activity Stopped", activity.getLocalClassName());

    }

    @Override
    public void onActivityStarted(Activity activity) {
        Log.i("Tracking Activity Started", activity.getLocalClassName());

    }

    @Override
    public void onActivitySaveInstanceState(Activity activity, Bundle outState) {
        Log.i("Tracking Activity SaveInstanceState", activity.getLocalClassName());
    }

    @Override
    public void onActivityResumed(Activity activity) {
        Log.i("Tracking Activity Resumed", activity.getLocalClassName());
    }

    @Override
    public void onActivityPaused(Activity activity) {
        Log.i("Tracking Activity Paused", activity.getLocalClassName());
    }

    @Override
    public void onActivityDestroyed(Activity activity) {
        Log.i("Tracking Activity Destroyed", activity.getLocalClassName());
    }

    @Override
    public void onActivityCreated(Activity activity, Bundle savedInstanceState) {
        Log.i("Tracking Activity Created", activity.getLocalClassName());
    }
}

В-третьих, я создаю класс, который расширяется от SherlockActivity:

public class MySherlockActivity extends SherlockActivity {

    protected MyApplication nMyApplication;

    protected void onCreate(Bundle savedInstanceState) {
        // TODO Auto-generated method stub
        super.onCreate(savedInstanceState);
        nMyApplication = (MyApplication) getApplication();
        nMyApplication.onActivityCreated(this, savedInstanceState);
    }

    protected void onResume() {
        // TODO Auto-generated method stub
        nMyApplication.onActivityResumed(this);
        super.onResume();

    }

    @Override
    protected void onPause() {
        // TODO Auto-generated method stub
        nMyApplication.onActivityPaused(this);
        super.onPause();
    }

    @Override
    protected void onDestroy() {
        // TODO Auto-generated method stub
        nMyApplication.onActivityDestroyed(this);
        super.onDestroy();
    }

    @Override
    protected void onStart() {
        nMyApplication.onActivityStarted(this);
        super.onStart();
    }

    @Override
    protected void onStop() {
        nMyApplication.onActivityStopped(this);
        super.onStop();
    }

    @Override
    protected void onSaveInstanceState(Bundle outState) {
        nMyApplication.onActivitySaveInstanceState(this, outState);
        super.onSaveInstanceState(outState);
    }   
}

В-четвертых, все классы, которые расширяются от SherlockActivity, я заменил на MySherlockActivity:

public class MainActivity extends MySherlockActivity{

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
    }

}

Теперь в logcat вы увидите журналы, запрограммированные в реализации интерфейса, выполненной в MyApplication.

ОБНОВЛЕНИЕ

Эта реализация была протестирована с API уровня 9 (пряники), API уровня 12 (сота) и API уровня 17 (желейные бобы) и работает нормально. Might работает в более старых версиях Android.

7
задан frankodwyer 8 April 2009 в 12:05
поделиться

2 ответа

Если вы хотите использовать файловую систему только для кэширования страниц и memcached для кэширования действий и фрагментов, все в порядке. Кэширование страниц всегда использует файловую систему. Просто помните, что кэширование страниц обходит ваше приложение Rails, поэтому вы не можете использовать его для страниц, которые содержат контент, изменяющийся от пользователя к пользователю, или для страниц, доступ к которым контролируется фильтрами.

Что касается удаления страниц в Unix, файл может быть удален, но фактически он не удаляется с диска, пока не будут закрыты все дескрипторы открытых файлов. Если сервер приложений открыл файл для обслуживания запроса, а команда find удаляет его через долю секунды, сервер приложений не получает внезапно ошибку при попытке чтения.

Вы также можете рассмотреть возможность использования найти удалить файлы в зависимости от времени их последнего доступа,

2
ответ дан 7 December 2019 в 14:38
поделиться

Более простой подход может заключаться в использовании http-кеша перед вашим приложением в качестве кэша страницы, а не двух хранилищ внутри рельсов. Таким образом, вы можете использовать заголовки http для управления поведением кеша, включая TTL. Эти же ограничения будут применяться и к локальным кэшам браузера в качестве приятного бонуса.

Varnish имеет примерно такую ​​же высокую производительность, как и получает, но потребует настройки другой движущейся части в вашей среде хостинга в качестве прокси. Это может иметь смысл в зависимости от того, что вы делаете.

Более простой подход может быть Rack :: Cache , который будет легко настроить, если вы используете версию рельсов с поддержкой стойки. .

2
ответ дан 7 December 2019 в 14:38
поделиться
Другие вопросы по тегам:

Похожие вопросы: