2012-04-02 5 views
0

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?

+0

Veröffentlichen Sie die Protokollanweisungen, wenn der Absturz auftritt – Kavitha

+0

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

+0

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. –

Antwort

0

Es sieht so aus, als ob Ihre Sicherungsdatei nicht gefunden wurde. aber es ist schwer zu sagen, da Ihr Code derzeit alle Ausnahmen verschlingt. anstelle von:

Versuchen Sie stattdessen, Ihre Ausnahmen zu protokollieren, da e.printStackTrace(); tut nichts standardmäßig auf Android.

catch(FileNotFoundException e1) { 
    Log.e(getClass().getName(), "File not found:" + cacheDir + "PL" + url.getQuery()", e1); 
} 

Wie auch immer, das ist meine Theorie - Ihr Dateipfad irgendwo verweist, für welchen Gründen auch immer geschrieben werden kann (die docs haben einige mögliche Erklärungen); SaveFile kommt dann aus der Ausnahme als Null, und dann übergeben Sie den NULL-Parameter in den OutputStream-Konstruktor

+0

Danke. Dies führt nun zu '04 -04 20: 36: 05.958: E/com.test.test.VideoGrid (3777): java.io.FileNotFoundException:/data/PLPL8F5A29F57DB58FCB: Öffnen fehlgeschlagen: EACCES (Berechtigung verweigert) '. Ich kann wenig über dieses Problem im Internet finden, es scheint nicht ein tatsächlicher Erlaubnisfehler zu sein (ich habe alle relevanten versucht) – CitizenSmif

+0

@CitizenSmif Gibt es einen Grund, den Sie "getDataDirectory()' anstelle '' verwenden getExternalStorageDirectory() '? – JRaymond

+0

Es stellte sich heraus, dass ein paar verschiedene Dinge falsch waren, hauptsächlich verwendete ich den falschen Dateinamen und der Fehler wurde erzeugt, weil ich versuchte, auf externen Speicher falsch zu schreiben. Deine Antwort hat mich dazu gebracht, das zu beheben. Vielen Dank JR – CitizenSmif

Verwandte Themen