Я разрабатываю игровой движок Android, используя SurfaceView для рисования растровых изображений, с аналогичной структурой для LunarLander. Моя основная деятельность игрового движка создает макет такой, что должны отображать класс расширения SurfaceView, как показано ниже:(SurfaceHolder.Callback) surfaceCreated никогда не назывался
super.onCreate(savedInstanceState);
setContentView(R.layout.ss_layout);
SSSurfaceView ssSurfaceView = (SSSurfaceView)findViewById(R.id.surface_view);
SSSurfaceView.SSViewThread renderThread =
(SSSurfaceView.SSViewThread) ssSurfaceView.getThread();
Метод findViewById успешно возвращает экземпляр моего класса расширения SurfaceView, и я могу запустить нить я определить внутри класса, который создается в этом методе, конструктор класса:
public SSSurfaceView(Context context, AttributeSet attributes)
{
super(context, attributes);
SurfaceHolder holder = getHolder();
holder.addCallback(this);
thread = new SSViewThread(holder, context);
}
конструктор должен быть получения ссылки на связанный SurfaceHolder, которые он затем переходит к нити строи тор. У меня возникла проблема внутри метода запуска потока, где owner.lockCanvas (null) возвращал значение null. Я где-то читал, что это может означать, что поверхность не была создана, поэтому я добавил оператор if, используя логическое значение, которое я установил для true в обратном вызове surfaceCreated.
public void run()
{
Canvas canvas = null;
try
{
canvas = holder.lockCanvas(null);
//I added the condition below
if(surfaceCreated)
{
drawAll(canvas);
}
}
catch(Exception e)
{
Log.wtf("SurfaceView", "exception");
}
finally
{
if(canvas != null)
{
holder.unlockCanvasAndPost(canvas);
}
}
}
А вот обратный вызов:
public void surfaceCreated(SurfaceHolder holder)
{
surfaceCreated = true;
}
И, как выясняется, surfaceCreated никогда не вызывается. Мое приложение отображает серый экран и ничего не делает, поскольку метод drawAll никогда не повторяется. Вот файл layout.xml для загрузки:
<?xml version="1.0" encoding="utf-8"?>
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent" >
<com.bostonwalker.sseng.SSSurfaceView
android:id="@+id/surface_view"
android:layout_width="match_parent"
android:layout_height="match_parent" />
</FrameLayout>
EDIT: Это не мой весь код, я попытался ограничить свои примеры в соответствующих разделах. Поток вызывается в основном цикле, но с учетом времени обратный вызов никогда не срабатывает.
EDIT: Вот цикл итеративно в потоке пользовательского интерфейса:
while(!halt)
{
//EDIT: Changed from .run() to .start()
renderThread.start();
gameThread.start();
//Wait for both threads to proceed before continuing
try
{
renderThread.join();
gameThread.join();
}
catch (InterruptedException e)
{
//Do nothing
}
Thread.currentThread();
try
{
Thread.sleep(2);
}
catch (Exception e)
{
//Do nothing
}
}
извините, но ваш 'while (! Halt)' цикл и контент выглядят действительно злобно ... конечно, вам нужно сделать это именно так? – WarrenFaith
Хотя это не проблема, я ценю вашу заботу. На данный момент меня не интересует оптимизация или даже гибкость, просто с получением моего SurfaceView для отображения и обратного вызова для запуска. –