2010-11-11 4 views

Antwort

4

Sie haben eine eigene Kontrollen durchzuführen. Wie ich weiß, gibt es für diesen Job keine Methode.

+0

Ich denke auch so. Vielen Dank. – Mudassir

+3

Verständlich, dass es dafür vielleicht keine Methode gibt, aber wenn Sie keine Alternative zur Verfügung stellen können, dann sollte dies keine Antwort sein. – Gowiem

13

Ich habe eine Hilfsmethode zu einer meiner Anwendungsklassen hinzugefügt. Ich nehme das an;

  1. Die Liste der Assets ändert sich nicht, während die App ausgeführt wird.
  2. die List<String> ist kein Speicher Schwein (nur 78 Assets in meiner App).
  3. checking exists() auf der Liste ist schneller als der Versuch, eine Datei zu öffnen und eine Ausnahme zu behandeln (ich habe dies eigentlich nicht profiliert).
AssetManager am; 
List<String> mapList; 

/** 
* Checks if an asset exists. 
* 
* @param assetName 
* @return boolean - true if there is an asset with that name. 
*/ 
public boolean checkIfInAssets(String assetName) { 
    if (mapList == null) { 
     am = getAssets(); 
     try { 
      mapList = Arrays.asList(am.list("")); 
     } catch (IOException e) { 
     } 
    } 
    return mapList.contains(assetName); 
} 
+6

'List.contains()' gibt bereits boolean zurück, keine Notwendigkeit für den ternären Ausdruck am Ende der Funktion. –

9

Sie könnten auch nur versuchen, den Stream zu öffnen, wenn es die Datei nicht nicht da ist, und wenn es nicht die Datei nicht da sein sollte:

/** 
* Check if an asset exists. This will fail if the asset has a size < 1 byte. 
* @param context 
* @param path 
* @return TRUE if the asset exists and FALSE otherwise 
*/ 
public static boolean assetExists(Context context, String path) { 
    boolean bAssetOk = false; 
    try { 
     InputStream stream = context.getAssets().open(ASSET_BASE_PATH + path); 
     stream.close(); 
     bAssetOk = true; 
    } catch (FileNotFoundException e) { 
     Log.w("IOUtilities", "assetExists failed: "+e.toString()); 
    } catch (IOException e) { 
     Log.w("IOUtilities", "assetExists failed: "+e.toString()); 
    } 
    return bAssetOk; 
} 
+0

Diese Lösung viel schneller, dann den gesamten Ordner des Assets als Liste abrufen und das Containment überprüfen. (Ich habe ~ 50ms vs ~ 800ms auf meinem Gerät gemessen) – azendh

Verwandte Themen