2015-01-16 4 views
1

Я делаю много чтения об этом в настоящее время, но думал, что никогда не помешает спросить у хорошо осведомленной группы разработчиков. Это популярная проблема, и, похоже, существует много разных способов ее обработки.Android Activity Memory

У меня есть приложение для Android. Он использует OpenGL, поэтому, когда он запускается, происходит значительное количество загрузки данных как с диска, так и с VRAM. Когда экран вращается, а также когда нажата кнопка питания (чтобы перевести телефон в спящий режим), я теряю все данные, и активность убивается.

Я не хочу этого. Приложение занимает около 7 секунд, чтобы загружать и загружать свои данные, и это действительно раздражает, если вы просто спите свой телефон на секунду, а затем должны ждать, пока приложение снова загрузит все.

Я знаком с жизненным циклом приложения, описанным Google, но с трудом реализуя решение, которое работает для моего конкретного случая.

Любые предложения? Моя общая цель - сохранить следующее в памяти при смене телефона: 1. Память приложения на куче 2. Память приложения в VRAM

Спасибо!

До сих пор:

public class MainActivity 

    private FH_SurfaceView fGLSurfaceView; 

    @Override 
    public void onSaveInstanceState(Bundle outState) 
    { 
     super.onSaveInstanceState(outState); 
    } 

    @Override 
    public void onRestoreInstanceState(Bundle savedState) 
    { 
     super.onRestoreInstanceState(savedState); 
    } 

    @Override 
    public void onCreate(Bundle savedInstanceState) 
    { 
     super.onCreate(savedInstanceState); 

     // Check if the system supports OpenGL ES 2.0. 
     final ActivityManager activityManager = (ActivityManager) getSystemService(Context.ACTIVITY_SERVICE); 
     final ConfigurationInfo configurationInfo = activityManager.getDeviceConfigurationInfo(); 

     final boolean supportsEs2 = configurationInfo.reqGlEsVersion >= 0x20000; 
     if (savedInstanceState != null) { 
      /* NEED TO DO SOMETHING HERE?? */ 
      return; 
     } 

     else{ 
      this.fGLSurfaceView = new FH_SurfaceView(this); 
      setContentView(fGLSurfaceView); 
     }  

    } 

    @Override 
    protected void onResume() 
    { 
     super.onResume(); 
    } 

    @Override 
    protected void onPause() 
    { 
     super.onPause(); 
    } 
} 
+0

Это поможет, если вы разместите код своего действия, чтобы сделать вопрос более конкретным. – EJK

+0

Отложите загрузку данных в другой поток. Вероятно, он убит из-за ANR, потому что он блокирует основной поток вашего приложения, который выполняет загрузку/обработку данных. –

+0

@Larry: что такое ANR? Мне нужно только один раз загрузить данные, и все это содержится в моем классе класса поверхности и его подклассах. Я просто не хочу, чтобы все массивы и т. Д. Вытерли, когда приложение приостановлено ... – Fra

ответ

0

Проблема заключается в том, что ваш Activity держит большое количество данных. Когда телефон спит, он, скорее всего, нацелит его на уничтожение по разным причинам, прежде всего, чтобы убедиться, что есть память для других задач, но также и потому, что он может переваривать циклы обработки, а Android знает, что он не виден. Отсюда и ваша проблема. Это происходит не со всеми приложениями, а с «тяжелыми».

Там не может быть ничего, что вы можете сделать по этому поводу, но вот несколько советов:

  1. Проанализируйте вашу загрузку данных. Возможно, некоторые части являются дорогостоящими вычислительными, и поэтому они замедляют процесс, в то время как другие части тяжелы в памяти, но свет при обработке. Затем в сбрасывайте тяжелую часть памяти, чтобы улучшить вероятность того, что Android не убьет ваше приложение. Возможно, вы сможете получить время загрузки на 1-2 секунды вместо текущего. 0.

  2. Рассмотрите возможность создания Service, где данные находятся, а затем привязаны к нему, чтобы получить к нему доступ. Android не ожидает, что Service будет виден, и вы можете обработать сигнал, чтобы прекратить работу в или onStop вашего Activity, чтобы предотвратить урон от Android. Я понимаю, что это «сложно», так как ваши данные в настоящее время находятся в обычном классе SurfaceView - и сохранение отображаемых данных, не связанных с потоком пользовательского интерфейса, является болью.

  3. Кроме того, вы можете поместить данные в класс Application по тем же причинам. Преимущество этого в том, что вам не нужны связующие для доступа к данным. Недостатком является то, что Android, скорее всего, уничтожит это, чем Service Я думаю (но это опыт общения, а не тестирование - так, образованные догадки?). Кроме того, возиться с классом Application следует с осторожностью.

  4. Если все остальное не удается, попробуйте провести развлекательный переход, который подтверждает глупость ситуации. Другими словами, сообщение о том, что вы знаете о неприятной ситуации для пользователя, намного лучше, чем игнорировать его и надеяться, что они не против.

+0

Полная обработка обрабатывается openGL. Поэтому я думаю, что это может быть память. Я не знаю пределов, хотя из того, что «слишком много». С опцией largeheap в моем файле AndroidManifest.xml я получаю 256 Мб. Я не прихожу никуда рядом с этим. Моя общая память, выделенная на куче при максимальном размере, меньше 10 МБ. Я мог бы потенциально освободить их, если понадобится, но я бы не подумал, что это то, что убивает процесс. Мысли? Я не совсем хорошо знаю, как правильно хранить данные в «комплекте», а затем получить доступ к нему позже. Что-то посмотреть сегодня вечером. – Fra

+0

Для загрузки 10 МБ данных не требуется 7 секунд - это похоже на использование старой точки доступа WiFi (около 10 Мбит). И вам даже не нужно иметь опцию largeHeap. Так происходит что-то еще - или вы только смотрите на основную кучу - openGL, вероятно, имеет дело с собственной памятью; прочитайте об этом: https://source.android.com/devices/graphics/architecture.html – Jim

+0

Извините, я должен быть более понятным. Я разбираю сотни мегабайт данных, используя некоторые алгоритмы сортировки и т. Д. НО, в конце концов, я выделяю около 10 Мб в пространстве для хранения. Мне нужна опция LargeHeap для моих текстур для OpenGL. Некоторые из моих текстур имеют размер 60 МБ. Но, как отмечается в статье, они хранятся в видеопамяти не на куче. Тем не менее, есть время загрузки, чтобы получить их там, и именно поэтому у меня больше времени запуска. – Fra