Ich versuche, einige einfache Zwischenspeicherung in meiner Anwendung zu implementieren, und ich habe einige Probleme.ArrayList in Datei speichern - FC beim Erstellen von ObjectOutputStream
Grundsätzlich kratzt mein Code eine Webseite, bekommt einige Regex-Übereinstimmungen und fügt sie in eine ArrayList ein. Dies dauert eine Weile (ein paar Sekunden, aber das passiert häufig), also versuche ich ein einfaches Caching-System zu implementieren, das überprüft, wann die Cache-Datei geändert wurde, wenn diese älter als eine Woche ist, Cache aktualisieren.
Mein Problem liegt in der Speicherung der ArrayList, kann mir jemand dabei helfen?
Ich habe ursprünglich (das funktioniert)
private List<String> getVideoIDS(final String url2) {
if (android.os.Environment.getDataDirectory().equals(android.os.Environment.MEDIA_MOUNTED)) //android.os.Environment.getExternalStorageState().equals(android.os.Environment.MEDIA_MOUNTED))
cacheDir=new File(android.os.Environment.getDataDirectory(),"PL" + url.getQuery());
else
cacheDir=mContext.getCacheDir();
if(!cacheDir.exists())
cacheDir.mkdirs();
File f = new File(cacheDir, "PL"+url.getQuery());
if (f.lastModified() > 604800000 || f.exists() == false) {
String expr = "(?<=v=)[a-zA-Z0-9-_]{11}(?=&)|(?<=[0-9]/)[^&\n]{11}|(?<=v=)[^&\n]{11}";
int count = 0;
Pattern patt = Pattern.compile(expr,
Pattern.DOTALL | Pattern.UNIX_LINES | Pattern.CASE_INSENSITIVE);
try {
url = new URL(url2);
} catch (MalformedURLException e) {
e.printStackTrace();
}
try {
m = patt.matcher(getURLContent(url));
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
while (m.find()) {
if ("default.jpg".equals(m.group(0)) || "videos?view".equals(m.group(0))) {
//Do nothing
} else {
allMatches.add(m.group(0));
count++;
Log.i("", m.group(0));
}
}
//Remove duplicates
List<String> noDupes = new ArrayList<String>();
Iterator iterator = allMatches.iterator();
while (iterator.hasNext())
{
String o = (String) iterator.next();
if(!noDupes.contains(o)) noDupes.add(o);
}
allMatches = noDupes;
return allMatches; }
Nun, was ich versuche, dies zu ändern, ist dies zu sein (in der Theorie, wie es zur Zeit nicht funktioniert)
private List<String> getVideoIDS(final String url2) {
if (android.os.Environment.getDataDirectory().equals(android.os.Environment.MEDIA_MOUNTED)) //android.os.Environment.getExternalStorageState().equals(android.os.Environment.MEDIA_MOUNTED))
cacheDir=new File(android.os.Environment.getDataDirectory(),"PL" + url.getQuery());
else
cacheDir=mContext.getCacheDir();
if(!cacheDir.exists())
cacheDir.mkdirs();
File f = new File(cacheDir, "PL"+url.getQuery());
if (f.lastModified() > 604800000 || f.exists() == false) {
String expr = "(?<=v=)[a-zA-Z0-9-_]{11}(?=&)|(?<=[0-9]/)[^&\n]{11}|(?<=v=)[^&\n]{11}";
int count = 0;
Pattern patt = Pattern.compile(expr,
Pattern.DOTALL | Pattern.UNIX_LINES | Pattern.CASE_INSENSITIVE);
try {
url = new URL(url2);
} catch (MalformedURLException e) {
e.printStackTrace();
}
try {
m = patt.matcher(getURLContent(url));
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
while (m.find()) {
if ("default.jpg".equals(m.group(0)) || "videos?view".equals(m.group(0))) {
//Do nothing
} else {
allMatches.add(m.group(0));
count++;
Log.i("", m.group(0));
}
}
//Remove duplicates
List<String> noDupes = new ArrayList<String>();
Iterator iterator = allMatches.iterator();
while (iterator.hasNext())
{
String o = (String) iterator.next();
if(!noDupes.contains(o)) noDupes.add(o);
}
allMatches = noDupes;
ObjectOutputStream save = null;
FileOutputStream saveFile = null;
try {
saveFile = new FileOutputStream(cacheDir + "PL"+url.getQuery());
} catch (FileNotFoundException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}
// Create an ObjectOutputStream to put objects into save file.
try {
save = new ObjectOutputStream(saveFile);
} catch (IOException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}
try {
save.writeObject(allMatches);
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
try {
save.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return allMatches;}
else {
try{
// Open file to read from, named SavedObjects.sav.
FileInputStream saveFile = new FileInputStream(cacheDir + "PL"+url.getQuery());
// Create an ObjectInputStream to get objects from save file.
final ObjectInputStream save = new ObjectInputStream(saveFile);
// Now we do the restore.
// readObject() returns a generic Object, we cast those back
// into their original class type.
// For primitive types, use the corresponding reference class.
allMatches = (ArrayList) save.readObject();
// Close the file.
save.close();
} catch (FileNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (StreamCorruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (ClassNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} finally {
// This also closes saveFile.
}
} return allMatches;
}
Hinweis: Ich versuche, mehrere Dateien zu speichern, da diese Methode für verschiedene Kategorien aufgerufen wird. Dies sollte mit dem Aufruf der Datei ein anderer Dateiname basierend auf was geöffnet werden behandelt werden. Ich denke ich habe das richtig umgesetzt.
Stacktrace ist als
04-03 17:41:20.846: E/AndroidRuntime(2438): java.lang.RuntimeException: Unable to start activity ComponentInfo{com.test.test/com.test.test.VideoGrid}: java.lang.NullPointerException
04-03 17:41:20.846: E/AndroidRuntime(2438): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2194)
04-03 17:41:20.846: E/AndroidRuntime(2438): at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2229)
04-03 17:41:20.846: E/AndroidRuntime(2438): at android.app.ActivityThread.access$600(ActivityThread.java:139)
04-03 17:41:20.846: E/AndroidRuntime(2438): at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1261)
04-03 17:41:20.846: E/AndroidRuntime(2438): at android.os.Handler.dispatchMessage(Handler.java:99)
04-03 17:41:20.846: E/AndroidRuntime(2438): at android.os.Looper.loop(Looper.java:154)
04-03 17:41:20.846: E/AndroidRuntime(2438): at android.app.ActivityThread.main(ActivityThread.java:4944)
04-03 17:41:20.846: E/AndroidRuntime(2438): at java.lang.reflect.Method.invokeNative(Native Method)
04-03 17:41:20.846: E/AndroidRuntime(2438): at java.lang.reflect.Method.invoke(Method.java:511)
04-03 17:41:20.846: E/AndroidRuntime(2438): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:784)
04-03 17:41:20.846: E/AndroidRuntime(2438): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:551)
04-03 17:41:20.846: E/AndroidRuntime(2438): at dalvik.system.NativeStart.main(Native Method)
04-03 17:41:20.846: E/AndroidRuntime(2438): Caused by: java.lang.NullPointerException
04-03 17:41:20.846: E/AndroidRuntime(2438): at java.io.DataOutputStream.writeShort(DataOutputStream.java:192)
04-03 17:41:20.846: E/AndroidRuntime(2438): at java.io.ObjectOutputStream.writeStreamHeader(ObjectOutputStream.java:1815)
04-03 17:41:20.846: E/AndroidRuntime(2438): at java.io.ObjectOutputStream.<init>(ObjectOutputStream.java:279)
04-03 17:41:20.846: E/AndroidRuntime(2438): at com.test.test.VideoGrid.getVideoIDS(VideoGrid.java:204)
04-03 17:41:20.846: E/AndroidRuntime(2438): at com.test.test.VideoGrid.onCreate(VideoGrid.java:74)
04-03 17:41:20.846: E/AndroidRuntime(2438): at android.app.Activity.performCreate(Activity.java:4524)
04-03 17:41:20.846: E/AndroidRuntime(2438): at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1071)
04-03 17:41:20.846: E/AndroidRuntime(2438): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2150)
Das habe ich
com.test.test.VideoGrid.getVideoIDS(VideoGrid.java:204)
Punkte
save = new ObjectOutputStream(saveFile);
folgt android.permission.WRITE_EXTERNAL_STORAGE
In meinem Manifest
Ich habe versucht, den Dateinamen in etwas statisches (1) anstelle meiner url.getQuery imcase ändern, das war das Problem - ändert nichts, exakt das gleiche Problem.
Ich fühle, dass ich hier einen grundlegenden Fehler mache. Kann jemand sehen, wo ich mit dem Speichern/Lesen der ArrayList falsch liege?
Veröffentlichen Sie die Protokollanweisungen, wenn der Absturz auftritt – Kavitha
Wie ich im OP erwähnt mein Logcat funktioniert nicht ordnungsgemäß. Es liefert mir eine NullPointerException von einem anderen Projekt vollständig. Dies passiert die ganze Zeit, wenn ich ein Projekt kopiere. Wenn dieses Projekt jedoch ordnungsgemäß funktioniert, gibt es bei diesem anderen Projekt keinen Fehler.Da ich keine Ahnung habe, warum dies passiert oder wie ich es beheben kann, habe ich gehofft, dass jemand einen offensichtlichen Fehler sehen könnte. – CitizenSmif
Ja, ich habe den offensichtlichen Fehler gefunden: Posten in SO * ohne * fokussierte Frage und * ohne * sogar nützlich Ausnahmebedingungsinformationen. Versuchen Sie eine "Code-Review" -Seite, wenn Sie ein anderes Augenpaar wünschen. :-) Grundsätzlich, wenn die * Frage * im Titel nicht ausreichend zusammengefasst werden kann, gehört sie hier nicht dazu. –