Как сделать (и сохранить в оперативной памяти) sparsearray при запуске приложения? (Андроид)
Я делаю приложение для Android. В приложении есть действие, которое при запуске создает разреженный массив и заполняет его данными. Теперь этот процесс занимает до 1 минуты на эмуляторе, что очень долго. Поэтому я хочу создать этот sparsearray один раз, прямо при запуске приложения, и сохранить sparsearray в оперативной памяти на весь срок службы приложения. И всякий раз, когда активность запускается, он должен получить доступ к sparsearray в оперативной памяти, а не создавать новый, тем самым экономя время и вычислительную мощность. Можно ли это сделать, если да, то как? Извините, если этот вопрос глуп, я новичок в Android. Спасибо! * Редактировать: Вот как выглядит функция создания sparsearray: // функция, которая обращается к функции создания sparsearray
public String[] process(){
InputStream is = context.getAssets().open("feedtitlesandaddresses.txt");
InputStreamReader iz=new InputStreamReader(is);
BufferedReader br = new BufferedReader(iz);
String line = null;
while((line=br.readLine())!=null) {
readLine(line);
}}
//sparsearray making function
private void readLine(String line) {
//some string processing(omitted here)
int num1 = Integer.parseInt(firstNumber);
//int num2 = Integer.parseInt(secondNumber);
if(sparseArray.get(num1) == null) {
sparseArray.put(num1, new SparseArray<String>());
}
temporarySparseArray = sparseArray.get(num1);
for(int w=0;w<size;w++){
temporarySparseArray.put(w, array1[w]);
}
sparseArray.put(num1, temporarySparseArray);
temporarySparseArray = null;
}
2 ответа
Я чувствую, что этот вопрос заслуживает ответа, и я был уверен, что кто-то придумает его, но, хм, не совсем так; и если бы я был Томом Вонгом, мне бы сейчас показалось, что Stackru - это место, где эксперты-любители начинают бороться за вопросы, а не отвечать на них.;) Итак, поехали.
Сделайте что-нибудь при запуске, результат которого длится, пока ваше приложение находится в памяти: правильное место, чтобы сделать это
Application.onCreate()
, для которого нужно подклассApplication
, Можно сохранить результат вApplication
объект в этом случае, где вы можете получить к нему доступ из любогоActivity
путем получения контекста приложения.Сделайте то, что займет некоторое время: в общем, это хорошая идея для использования
AsyncTask
на Android, но он специализируется на выполнении действий, которые относятся к пользовательскому интерфейсу, но не должны блокировать его. Кроме того, без какой-либо явной настройки его поведение будет варьироваться в зависимости от версии Android. В настоящее время, без дополнительных мер, если бы вы выполняли вычисления через AsyncTask, другие AsyncTasks должны были бы сначала подождать. Кроме того, то, что вы хотите сделать, не является классической задачей для использования AsyncTask, поэтому используйте одноразовый поток, который просто сохраняет свой результат в конечном итоге вvolatile
ссылка.
Следующий фрагмент кода должен дать вам идею.
final class MyApplication extends Application {
public volatile String[] expensiveToCompute;
@Override
public void onCreate() {
expensiveToCreate = null;
(new Thread() {
@Override
public void run() {
String[] result = computeMyData();
// it is important to assign the locally created data at once here
expensiveToCompute = result;
}
}).start();
}
}
В этом случае, expensiveToCompute
будет null
пока асинхронное вычисление не закончится.
Важно понимать, что этот поток будет работать до его завершения, и что он содержит ссылку на ваш MyApplication
объект. Это означает, что даже если пользователь покинет ваше приложение, ваш поток все равно продолжит работу, если он не завершился до этого момента.
Это на самом деле хорошо, потому что либо Android решает оставить ваш объект Application живым только потому, что может, и в этом случае пользовательский опыт улучшается. Или Android убивает весь процесс с помощью объекта Application, вашего Thread и любых сохраненных данных, и в этом случае он начнется с нуля в следующий раз.
Еще одна вещь о предложениях по переносу дорогостоящих вычислений в AsyncTask
и т.д.: Android назначает фоновый приоритет по умолчанию таким потокам, и все фоновые потоки (в настоящее время) должны будут жить с 10% процессорного времени в целом, независимо от того, в противном случае система Android простаивает. Так много людей, которые переводят интенсивные вычисления в фоновые задачи, замечают, что это займет в десять раз больше времени. Следовательно, вы можете прочитать мои предложения о том, как справиться с этим здесь и / или здесь.
Вы можете написать свой объект во внутренней или внешней файловой системе Android, и вы можете прочитать объект, когда вы хотите его использовать.