Так что это мой первый раз по потоку, и я использую для обновления сцены с непрерывными интервалами. Я работаю над этой проблемой и везде оглядываюсь за объяснением, это мое последнее средство от моей головной боли. В моем 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
}
Честно говоря, я даже не знаю, если я резьб право больше.