gpt4 book ai didi

java - 如何避免在每个 Activity 和服务上安装和关闭 'HttpResponseCache'?

转载 作者:行者123 更新时间:2023-11-29 21:02:25 24 4
gpt4 key购买 nike

我正在开发一个与 API 14( Ice Cream Sandwich )兼容的 Android 应用程序。我找到了可用于缓存 HTTP 请求的类 HttpResponseCache。我想将缓存与我的 HTTP 请求代码(带有一堆 public static 方法的通用类)集成。
HttpResponseCache 文档解释说,必须在使用的每个 Activity 或服务上安装和关闭缓存。我希望在我的应用程序上始终启用缓存,但我不想记住安装缓存并在我开发的每个新 Activity 中关闭它。

是否有实现此目的的模式?

最佳答案

创建应用程序进程时,Application实例首先被创建。在 Application 中安装缓存的 onCreate方法是最好的地方。 Application.onCreate在创建任何 Activity/服务/广播接收器实例之前调用方法。

当 Activity 停止时,我们需要将缓冲的内容刷新到文件系统,以便下次 Activity 启动时缓存可读。我们可以注册到 Activity 生命周期回调并调用 HttpResponseCache.flush onActivityStopped 中的方法回调。

public class MyApplication extends Application {
public void onCreate() {
super.onCreate();

// Install the cache
try {
File httpCacheDir = new File(this.getCacheDir(), "http");
long httpCacheSize = 10 * 1024 * 1024; // 10 MiB
HttpResponseCache.install(httpCacheDir, httpCacheSize);
catch (IOException e) {
Log.i(TAG, "HTTP response cache installation failed:" + e);
}

// Register for activity lifecycle callbacks,
// specifically interested in activity stop callbacks.
registerActivityLifecycleCallbacks(
new MyApplicationActivityLifeCycleCallbacks());
}

// method to flush cache contents to the filesystem
public void flushCache() {
HttpResponseCache cache = HttpResponseCache.getInstalled();
if (cache != null) {
cache.flush();
}
}

private class MyApplicationActivityLifeCycleCallbacks extends ActivityLifecycleCallbacks {
public void onActivityStopped (Activity activity) {
flushCache();
}

// other methods
}
}

以上是基本答案;以下是特殊情况。

服务

对于服务,没有这种通用的回调接口(interface)。因此 flush必须从每个服务的 onDestroy 调用方法。

public class MyService extends Service {
public void onDestroy() {
super.onDestroy();

MyApplication application = (MyApplication) getApplication();
application.flushCache();
}
}

记得在 android list 文件的 <application> 中指定应用程序名称标签。

替代解决方案:要刷新所有服务中的内容,您可以编写一个基本服务,以刷新其 onDestroy 中的内容。 .然后,您的应用程序中的所有服务都可以从基础服务扩展。

public class BaseService extends Service {
public void onDestroy() {
super.onDestroy();

HttpResponseCache cache = HttpResponseCache.getInstalled();
if (cache != null) {
cache.flush();
}
}
}

public class MyService extends BaseService {
....
}

关闭缓存

如果您特别关注在最后一个组件退出时关闭缓存,您可以跟踪应用程序中组件实例的数量。第一个实例创建缓存,最后一个实例关闭缓存。

MyApplication.java:跟踪应用程序中组件实例的数量。

public class MyApplication extends Application {
private int instanceCount;

public void incrementInstanceCount() {
instanceCount++;
}

public int decrementInstanceCount() {
return --instanceCount;
}
}

BaseActivity.java:您所有的 Activity 类都扩展了这个 BaseActivity。

public class BaseActivity extends Activity {
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);

if( // cache is not installed ) {
// install the cache
}
getApplication().incrementInstanceCount();
}

public void onStop() {
super.onStop();
// flush the cache
}

public void onDestroy() {
super.onDestroy();

if( getApplication().decrementInstanceCount() == 0) {
// close the cache
}
}
}

BaseService.java :从 BaseService 扩展所有服务类

public class BaseService extends Service {
public void onCreate() {
super.onCreate();

if( // cache is not installed ) {
// install the cache
}
getApplication().incrementInstanceCount();
}

public void onDestroy() {
super.onDestroy();

if( getApplication().decrementInstanceCount() == 0) {
// close the cache
} else {
// flush the cache
}
}
}

关于java - 如何避免在每个 Activity 和服务上安装和关闭 'HttpResponseCache'?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25621942/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com