2010-11-11 10 views

risposta

4

È necessario eseguire i propri controlli. Come so, non esiste un metodo per questo lavoro.

+0

Anche io la penso così. Grazie. – Mudassir

+3

Comprensibile che potrebbe non esserci un metodo per questo, ma se non è possibile fornire un'alternativa, questa non avrebbe dovuto essere una risposta. – Gowiem

13

Ho aggiunto un metodo di supporto a una delle mie classi di applicazioni. Lo presumo;

  1. l'elenco delle risorse non cambia mentre l'app è in esecuzione.
  2. il List<String> non è un master di memoria (solo 78 risorse nella mia app).
  3. il controllo esiste() sull'Elenco è più veloce che provare ad aprire un File e gestire un'eccezione (non l'ho ancora profilata).
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.taintains()' restituisce già il valore booleano, non c'è bisogno dell'espressione ternaria alla fine della funzione. –

9

Si potrebbe anche solo tentare di aprire il flusso, se fallisce il file non c'è e se non manca il file dovrebbe essere lì:

/** 
* 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

Questa soluzione è molto più veloce, quindi recupera l'intera cartella della risorsa come lista e controlla il contenimento. (Ho misurato ~ 50ms vs ~ 800ms sul mio dispositivo) – azendh

Problemi correlati