- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我正在尝试使用 HttpResponseCache 来缓存网络数据,但是当我将安装缓存代码放入 OnCreate 和 OnPause 方法时,应用崩溃。我使用了 HttpResponseCache documentation 中的代码.并出现如下所示的编译错误。使用后
@TargetApi(Build.VERSION_CODES.ICE_CREAM_SANDWICH)
为了解决错误然后它消失了,我运行应用程序但仍然崩溃。当我删除该代码时,它会恢复正常行为。
protected void onCreate(Bundle savedInstanceState) {
...
try {
File httpCacheDir = new File(context.getCacheDir(), "http");
long httpCacheSize = 10 * 1024 * 1024; // 10 MiB
HttpResponseCache.install(httpCacheDir, httpCacheSize); //error
} catch (IOException e) {
Log.i(TAG, "HTTP response cache installation failed:" + e);
}
}
protected void onStop() {
...
HttpResponseCache cache = HttpResponseCache.getInstalled();//error
if (cache != null) {
cache.flush();//error
}
}}
我是初学者,如果有人能提供帮助,我将不胜感激。这是 MainActivity 代码
public class MainActivity extends AppCompatActivity {
private MovieAdapter movieAdapter;
private Context context;
@TargetApi(Build.VERSION_CODES.ICE_CREAM_SANDWICH)
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
// ------ caching data ------------------
try {
File httpCacheDir = new File(context.getCacheDir(), "http");
long httpCacheSize = 2 * 1024 * 1024; // 10 MiB
HttpResponseCache.install(httpCacheDir, httpCacheSize); //error
} catch (IOException e) {
Log.i("caching failed", "HTTP response cache installation failed:" + e);
}
//-----------------------
DataSyncTask dataSyncTask = new DataSyncTask();
dataSyncTask.execute();
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
MenuInflater inflater = getMenuInflater();
inflater.inflate(R.menu.menu_main, menu);
return true;
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
int id = item.getItemId();
if (id == R.id.action_settings) {
startActivity(new Intent(this, SettingsActivity.class));
return true;
}
return super.onOptionsItemSelected(item);
}
private class DataSyncTask extends AsyncTask<Void, Void, ArrayList<Movie>> {
@Override
protected ArrayList<Movie> doInBackground(Void... params) {
JSONHttpClient jsonHttpClient = new JSONHttpClient(MainActivity.this);
JSONDataParser finalData = new JSONDataParser();
/*
using shared preference to obtain data
*/
SharedPreferences sharedPreferences =
PreferenceManager.getDefaultSharedPreferences(getApplicationContext());
String sortingOrder = sharedPreferences.getString(
getString(R.string.pref_findMovies_key),
getString(R.string.pref_popular_value));
String streamData = jsonHttpClient.getData(sortingOrder);
return finalData.getParsedData(streamData);
}
@Override
protected void onPostExecute(final ArrayList<Movie> movies) {
movieAdapter = new MovieAdapter(getApplicationContext(), movies);
GridView gridView = (GridView) findViewById(R.id.movies_grid);
gridView.setAdapter(movieAdapter);
gridView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> adapterView, View view, int i, long l) {
Movie movie = (Movie) adapterView.getItemAtPosition(i);
Intent intent = new Intent(MainActivity.this, DetailActivity.class);
intent.putExtra("MovieTitle", movie.getTitle());
intent.putExtra("voteAverage", movie.getVoteAverage());
intent.putExtra("ReleaseDate", movie.getReleaseDate());
intent.putExtra("MovieOverview", movie.getOverview());
intent.putExtra("PosterPath", movie.getPosterPath());
startActivity(intent);
}
});
}
}
@Override
protected void onResume() {
DataSyncTask dataSyncTask = new DataSyncTask();
dataSyncTask.execute();
super.onResume();
}
@TargetApi(Build.VERSION_CODES.ICE_CREAM_SANDWICH)
@Override
protected void onStop() {
HttpResponseCache cache = HttpResponseCache.getInstalled();
if (cache != null) {
cache.flush();
}
super.onStop();
}
}
应用程序崩溃后 logcat 中出现的内容
12-19 19:22:58.465 17548-17548/com.example.geekymind.displayjsondatafrominternet W/dalvikvm﹕ VFY: unable to find class referenced in signature (Landroid/view/SearchEvent;)
12-19 19:22:58.465 17548-17548/com.example.geekymind.displayjsondatafrominternet I/dalvikvm﹕ Could not find method android.view.Window$Callback.onSearchRequested, referenced from method android.support.v7.internal.view.WindowCallbackWrapper.onSearchRequested
12-19 19:22:58.465 17548-17548/com.example.geekymind.displayjsondatafrominternet W/dalvikvm﹕ VFY: unable to resolve interface method 14585: Landroid/view/Window$Callback;.onSearchRequested (Landroid/view/SearchEvent;)Z
12-19 19:22:58.465 17548-17548/com.example.geekymind.displayjsondatafrominternet I/dalvikvm﹕ Could not find method android.view.Window$Callback.onWindowStartingActionMode, referenced from method android.support.v7.internal.view.WindowCallbackWrapper.onWindowStartingActionMode
12-19 19:22:58.465 17548-17548/com.example.geekymind.displayjsondatafrominternet W/dalvikvm﹕ VFY: unable to resolve interface method 14589: Landroid/view/Window$Callback;.onWindowStartingActionMode (Landroid/view/ActionMode$Callback;I)Landroid/view/ActionMode;
12-19 19:22:58.505 17548-17548/com.example.geekymind.displayjsondatafrominternet I/dalvikvm﹕ Could not find method android.content.res.TypedArray.getChangingConfigurations, referenced from method android.support.v7.internal.widget.TintTypedArray.getChangingConfigurations
12-19 19:22:58.505 17548-17548/com.example.geekymind.displayjsondatafrominternet W/dalvikvm﹕ VFY: unable to resolve virtual method 451: Landroid/content/res/TypedArray;.getChangingConfigurations ()I
12-19 19:22:58.515 17548-17548/com.example.geekymind.displayjsondatafrominternet I/dalvikvm﹕ Could not find method android.content.res.TypedArray.getType, referenced from method android.support.v7.internal.widget.TintTypedArray.getType
12-19 19:22:58.515 17548-17548/com.example.geekymind.displayjsondatafrominternet W/dalvikvm﹕ VFY: unable to resolve virtual method 473: Landroid/content/res/TypedArray;.getType (I)I
12-19 19:22:58.585 17548-17548/com.example.geekymind.displayjsondatafrominternet W/dalvikvm﹕ threadid=1: thread exiting with uncaught exception (group=0x415ffc80)
最佳答案
Enable caching of all of your application's HTTP requests by installing the cache at application startup.
所以你应该使用如下:
我的应用程序.java:
public class MyApplication extends Application {
private final Context mContext = this;
public void onCreate() {
super.onCreate();
// Install the cache
try {
File httpCacheDir = new File(mContext.getCacheDir(), "http");
long httpCacheSize = 10 * 1024 * 1024; // 10 MiB
HttpResponseCache.install(httpCacheDir, httpCacheSize);
} catch (IOException e) {
Log.i("CacheHttpUrlConnection", "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 implements ActivityLifecycleCallbacks {
@Override
public void onActivityCreated(Activity activity, Bundle savedInstanceState) {
}
@Override
public void onActivityStarted(Activity activity) {
}
@Override
public void onActivityResumed(Activity activity) {
}
@Override
public void onActivityPaused(Activity activity) {
}
public void onActivityStopped(Activity activity) {
flushCache();
}
@Override
public void onActivitySaveInstanceState(Activity activity, Bundle outState) {
}
@Override
public void onActivityDestroyed(Activity activity) {
}
}
}
MainActivity.java:
AsyncTask
类的 doInBackground
内部:
...
URL url = new URL(address);
HttpURLConnection urlConnection = (HttpURLConnection) url.openConnection();
int maxStale = 60 * 60 * 24 * 28; // tolerate 4-weeks stale
urlConnection.addRequestProperty("Cache-Control", "max-stale=" + maxStale);
// Checks cache
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.ICE_CREAM_SANDWICH) {
cache = HttpResponseCache.getInstalled();
if (cache != null) {
cacheInfo = "Request count: "
+ cache.getRequestCount() + ", hit count "
+ cache.getHitCount() + ", network count "
+ cache.getNetworkCount() + " size = "
+ cache.size() + " <-----------------";
Log.i(LOG_TAG, cacheInfo);
}
}
// Gets stream
Log.i(LOG_TAG, "RespCode: " + urlConnection.getResponseCode());
if (urlConnection.getResponseCode() < HttpURLConnection.HTTP_BAD_REQUEST) {
inputStream = urlConnection.getInputStream();
} else {
inputStream = urlConnection.getErrorStream();
}
// Parses stream to string
BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(inputStream));
String temp, response = "";
while ((temp = bufferedReader.readLine()) != null) {
response += temp;
}
...
AndroidManifest.xml:
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.example.cachehttpurlconnection" >
<uses-permission android:name="android.permission.INTERNET" />
<application
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:supportsRtl="true"
android:theme="@style/AppTheme"
android:name="com.example.cachehttpurlconnection.MyApplication" >
<activity android:name=".MainActivity" >
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
</application>
</manifest>
关于android - 使用 HttpResponseCache 会使应用程序崩溃,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34373336/
我关注了 developers guide并且我通过在应用程序的 onCreate() 方法中包含以下代码来安装 HttpResponseCache: try { File httpCacheDi
我很快将在一个项目上工作,该项目使用大量 HTTPRequests 主要用于 JSON 和 Images,所以我认为它是考虑缓存是个好主意。基本上我正在寻找 的解决方案 启动具有给定生命周期(例如 3
我正在尝试使用 HttpResponseCache,但没能成功。 我是这样安装的: SdCardManager manager = SdCardManager.getSdCardMan
我想使用 HttpResponseCache 我的场景如下: 当互联网连接可用时,服务器上的数据会正常检索并保存到缓存中。 当没有互联网连接时,将检索并显示缓存数据。 我在以下 GitHub API
我正在尝试缓存此文件:http://media.admob.com/sdk-core-v40.js与 HttpResponseCache。基本上我调用了 getFileFromUrl 函数两次,以便第
我在 Android 中缓存来自 Web 服务器的 http(s) 响应时遇到问题,文档很差,所以我在这里寻求帮助。这是我的代码: String encodedString = String.
我正在尝试使用 HttpResponseCache 来缓存网络数据,但是当我将安装缓存代码放入 OnCreate 和 OnPause 方法时,应用崩溃。我使用了 HttpResponseCache d
我正在使用 gridview 显示数百张图像(甚至可能是几千张)。图片位于服务器上,我正在使用 HttpResponseCache 缓存图片.我遇到的问题是,当我向下滑动 gridview 时,回收的
我正在开发一个与 API 14( Ice Cream Sandwich )兼容的 Android 应用程序。我找到了可用于缓存 HTTP 请求的类 HttpResponseCache。我想将缓存与我的
我正在使用 HttpResponseCache在我的 Android 应用程序中启用响应缓存(用于 Web 请求),并且离线缓存不工作。我正在做离线缓存作为 documentation告诉我去做。 在
我需要缓存 http 响应,并基于此 blog post该功能内置于 ICS 中。但是,我需要支持 1.6 版及更高版本,因此想在查看向后移植 ICS 功能需要什么之前先看看是否有可用的库。 更新:
我正在尝试在导入的Android Studio中编译一个Android项目: com.squareup.okhttp.HttpResponseCache 我收到错误消息“无法解析符号'HttpResp
我一直在我的应用程序中成功使用 HttpResponseCache,但是当我的手机更新到 Lollipop 时,我意识到 HttpResponseCache 现在永远不会“命中”,总是执行网络请求。我
您好,我正在尝试使用 Android 4 中引入的 HttpResponseCache。文档确实清楚地讨论了如何安装缓存,但我完全不知道如何缓存从网络下载的图像。之前我使用的是 DiskLruCach
我正在尝试使用 httpResponseCache缓存我的一些请求。问题是,我想知道在发出请求之前是否缓存了请求。 我在源代码中看到了 HttpResponseCache有一个 get 方法接受 (U
最初的目标是同时使用磁盘和内存缓存。这需要实现 LRU 缓存和 DiskLruCache。但是,由于 HTTPResponse 缓存使用磁盘空间,我选择使用 LRU 缓存并执行 con.setUseC
我正在尝试在一个新的 Android 项目中测试这个缓存库。 当我运行项目时,我得到这个 Logcat: 01-24 03:45:31.109: E/AndroidRuntime(1983): FAT
我有以下方法从 wiktionary.org 请求页面,问题是服务器在 header 中返回 Cache-control => private, must-revalidate, max-age=0
我正在开发一个基于 WebView 的应用程序,该应用程序当前在 v3.1 平板电脑上运行。我似乎无法让 WebView 缓存 css、js 和图像(或使用缓存)。该应用似乎总是连接到服务器,服务器返
我正在尝试在我的应用程序中使用内置的 HTTPResponseCache(通过 HTTPURLConnection API 发出请求)但是在尝试让它缓存任何响应时遇到了问题请求时包含一个 Author
我是一名优秀的程序员,十分优秀!