2014-01-18 1 views
0

Так что это мой первый раз по потоку, и я использую для обновления сцены с непрерывными интервалами. Я работаю над этой проблемой и везде оглядываюсь за объяснением, это мое последнее средство от моей головной боли. В моем GLWorld extends GLSurfaceView классе у меня есть обработчик создается в этом:Объект в openGL-сцене становится нулевым в потоке android, когда onPause называется

private static int threadID = 0; 
private final WorldRenderer mRenderer; 
private boolean running; 
private Context context; 
Handler timeHandler; 
private int[] values; 

public GLWorld(Context context, int values[]) 
{ 
    super(context); 
    this.context = context; 
    timeHandler = new Handler(); 

    // Create an OpenGL ES 2.0 context. 
    setEGLContextClientVersion(2); 

    // Set the Renderer for drawing on the GLSurfaceView 
    Log.d("Test", "GL initialized"); 
    mRenderer = new WorldRenderer(context, values); 
    setRenderer(mRenderer); 
    this.startThread(); 
    timeHandler.postDelayed(tickThread, values[2] * 1000); 

    // Render the view only when there is a change in the drawing data 
    setRenderMode(GLSurfaceView.RENDERMODE_WHEN_DIRTY); 
} 

нить он работает это один:

private Runnable tickThread = new Runnable() 
{ 
    public void run() 
    { 
     threadID++; 
     Log.d("tick", "start " + threadID + " " + SystemClock.currentThreadTimeMillis()); 

     ArrayList<Point> points = new ArrayList<Point>(); 

     //work down and populate points not shown 

     for(int i = 0; i < values[0]; i++) 
     { 

      for(int j = 0; j < values[1]; j++) 
      { 
       updateFire(i,j,points); 
       points.clear(); 
      } 
     } 
     requestRender(); 
     Log.d("tick", "finish " + threadID + " " + SystemClock.currentThreadTimeMillis()); 
     Log.d("",""); 
     if(running) 
      timeHandler.postDelayed(this, values[2]* 1000); 

    } 
}; 

теперь объект GLWorld существует внутри деятельность называется SimulationActivity. У меня есть OnPause/onResume определяется как:

@Override 
protected void onPause() 
{ 
    super.onPause(); 
    // The following call pauses the rendering thread. 
    // If your OpenGL application is memory intensive, 
    // you should consider de-allocating objects that 
    // consume significant memory here. 
    mGLView.endThread(); 
    mGLView.onPause(); 
    Log.d("pause","pause called"); 
} 

@Override 
protected void onResume() 
{ 
    super.onResume(); 
    // The following call resumes a paused rendering thread. 
    // If you de-allocated graphic objects for onPause() 
    // this is a good place to re-allocate them. 
    mGLView.onResume(); 
    mGLView.startThread(); 
    Log.d("resume","resume called"); 
} 

где endthread/startthread просто послал работает ложь/правда, соответственно. Моя проблема в том, что когда я, скажем, нажимаю кнопку блокировки на боковой стороне экрана, чтобы заблокировать экран, он делает некоторые вещи, которые я не понимаю, почему, и я пытался понять это, а также пытается использовать объект, установленный в нуль ОС в потоке. Что я вижу это делать (только когда я блокировки экрана, я DON "T даже возобновить его еще нет) с моими бревнами, что это

1) вызывает , делает то, что внутри там правильно

2) воссоздает SimulationActivity. onCreate называется по какой-то причине!

3) воссоздает GLWorld объект внутри SimulationActivity

4) называет onResume (я не знаю, почему он это делает, он должен не от того, что я понимаю)

5) вызывает еще раз.

6) теперь нить tickThread начинает работать, я не знаю, почему, так как он должен быть остановлен с running значение ЛОЖЬ, по меньшей мере, второй

7) этой теме проходит первый то второй запуск вызывает исключение нулевого указателя в моей функции , когда я пытаюсь получить доступ к объекту внутри средства визуализации, называемому mGrid. Обратите внимание: переменная this.mRenderer сама по себе не имеет значения null. Это mGrid объект внутри него, что становится нулевой

private void updateFire(int i, int j, ArrayList<Point> surroundingPoints) 
{ 
    //check if renderer or the object is null 
    if(this.mRenderer == null) 
     Log.d("grid","null"); 
    else 
     Log.d("grid","stuff"); 
    GridSquare currGrid = this.mRenderer.mGrid[i*values[1] + j]; 
    //do non question importance stuff 
} 

Честно говоря, я даже не знаю, если я резьб право больше.

ответ

0

Это было глупо простое исправление, которое я потратил так много времени, пытаясь найти «правильный» способ сделать это.

private Runnable tickThread = new Runnable() 
{ 
    public void run() 
    { 
     if(!running) 
      return; 

это то, что я сделал. Я не знаю, правильно ли это, но это было единственное, что я понял, пробовав десятки разных «решений».

Я постараюсь больше узнать о моем вопросе на случай, если кто-то еще столкнется с этим.

Таким образом, главная причина, по которой он вызывает onResume после onCreate, связан с жизненным циклом активности приложения. android activity life cycle Кажется, что onResume всегда вызывается после onCreate. Поскольку onCreate происходит после onPause, это происходит только тогда, когда нажата клавиша блокировки, когда приложение работает на переднем плане.Я собираюсь проверить найденный ответ here, чтобы исправить эту проблему. Если эта ссылка работает так, как я надеюсь, она будет решена.

 Смежные вопросы

  • Нет связанных вопросов^_^