В целом использование Assets в Android не представляет из себя ничего сложного: знай себе читай из InputStream. Но тут есть некоторые подводные камни. В частности производительность, которая при использовании метода list() падает ниже плинтуса. Связано это, по видимому, с тем, что ассеты хранятся в сжатом виде и при каждом считывании приходиться производить манипуляции с архивом. О том как с этим боролся я ниже.
В случае если вы вынужденны часто вызывать list() имеет смысл закэшировать результаты ее выполнения. Так как assets во время выполнения доступны только на чтения, то в этом нет ничего сложного. Вот класс, который я написал и использую в реальном проекте:
В случае если вы вынужденны часто вызывать list() имеет смысл закэшировать результаты ее выполнения. Так как assets во время выполнения доступны только на чтения, то в этом нет ничего сложного. Вот класс, который я написал и использую в реальном проекте:
public class AssetsAccessHelper { private static AssetsAccessHelper helperObj = null; private AssetManager am; private Map<String, List<String>> assetsMap = new HashMap<String, List<String>>(); public static AssetsAccessHelper getInstance(Context ctx){ if(helperObj == null) helperObj = new AssetsAccessHelper(ctx); return helperObj; } private AssetsAccessHelper(Context ctx){ am = ctx.getAssets(); } private void loadAssetsFolder(String folder) throws IOException{ String[] fList = am.list(folder); assetsMap.put(folder, Arrays.asList(fList)); } public String[] list(String folder) throws IOException{ if(assetsMap.containsKey(folder)) return assetsMap.get(folder).toArray(new String[assetsMap.get(folder).size()]); loadAssetsFolder(folder); return list(folder); } public boolean isBaseInAssets(String folder){ if(assetsMap.containsKey(folder)) return assetsMap.get(folder).size() == 1; try { loadAssetsFolder(folder); } catch (IOException e) { return false; } return isBaseInAssets(folder); } }Как видите ничего сложного, однако при использовании данного подхода удалось сократить время запуска приложения более чем в два раза.
Спасибо за внимание, хорошего кода.
No comments:
Post a Comment
Post your comment here