Java 为什么我的Surface View类在主活动繁忙时停止渲染?
我正在为Android扩展SurfaceView实现一个简单的渲染视图类。我的主要活动类包括一个用于其他操作的无限while循环 然而,当主要活动在无限循环中时,应用程序会显示一个黑屏。据我所知,主活动和表面视图类有各自独立的线程,所以表面视图类应该在主活动类繁忙时保持渲染。当我通过在代码中设置“running”布尔变量false来阻止无限循环时,应用程序运行得很好 当我的主要活动处于无限循环中时,曲面视图类停止渲染的原因可能是什么 我的主要活动和表面视图课程如下:Java 为什么我的Surface View类在主活动繁忙时停止渲染?,java,android,multithreading,surfaceview,Java,Android,Multithreading,Surfaceview,我正在为Android扩展SurfaceView实现一个简单的渲染视图类。我的主要活动类包括一个用于其他操作的无限while循环 然而,当主要活动在无限循环中时,应用程序会显示一个黑屏。据我所知,主活动和表面视图类有各自独立的线程,所以表面视图类应该在主活动类繁忙时保持渲染。当我通过在代码中设置“running”布尔变量false来阻止无限循环时,应用程序运行得很好 当我的主要活动处于无限循环中时,曲面视图类停止渲染的原因可能是什么 我的主要活动和表面视图课程如下: import android
import android.app.Activity;
import android.os.Bundle;
import android.view.Window;
import android.view.WindowManager;
public class MainActivity extends Activity{
RenderSurfaceView renderView;
public boolean running = true;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate ( savedInstanceState );
requestWindowFeature(Window.FEATURE_NO_TITLE);
getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,
WindowManager.LayoutParams.FLAG_FULLSCREEN);
renderView = new RenderSurfaceView(this);
setContentView(renderView);
loop();
}
public void loop(){
running = true;
while(running){
}
}
protected void onResume() {
super.onResume();
renderView.resume();
}
protected void onPause() {
super.onPause();
renderView.pause();
}
}
这是我扩展SurfaceView的渲染类:
import java.util.Random;
import android.content.Context;
import android.graphics.Canvas;
import android.view.SurfaceHolder;
import android.view.SurfaceView;
public class RenderSurfaceView extends SurfaceView implements Runnable{
Thread renderThread = null;
SurfaceHolder holder;
volatile boolean running = false;
Random r = new Random();
public RenderSurfaceView(Context context) {
super(context);
holder = getHolder();
}
public void resume() {
running = true;
renderThread = new Thread(this);
renderThread.start();
}
public void run() {
while(running) {
if(!holder.getSurface().isValid())
continue;
render();
}
}
private void render(){
Canvas canvas = holder.lockCanvas();
canvas.drawRGB(r.nextInt(255), r.nextInt(255), r.nextInt(255));
holder.unlockCanvasAndPost(canvas);
}
public void pause() {
running = false;
while(true) {
try {
renderThread.join();
} catch (InterruptedException e) {
// retry
}
}
}
}
这个
不会立即显示视图。相反,它必须首先进行布局遍历,这不是立即进行的,而是与活动
生命周期方法异步进行的,它发生在主线程上。因此,在onCreate()
的末尾运行无限循环可防止视图层次结构的布局遍历,这意味着您的SurfaceView
将永远不会显示
理论上,您可以尝试使用处理程序延迟启动无限循环,可能是出于实验目的。总的来说,主线程上的无限循环是一个非常糟糕的主意,除了实验之外,我看不出你为什么要这样做
我对这个问题的自我回答更详细地描述了幕后发生的事情。这个问题与你在这里提出的问题没有直接关系,但我相信背景是一样的。
不会立即显示视图。相反,它必须首先进行布局遍历,这不是立即进行的,而是与活动
生命周期方法异步进行的,它发生在主线程上。因此,在onCreate()
的末尾运行无限循环可防止视图层次结构的布局遍历,这意味着您的SurfaceView
将永远不会显示
理论上,您可以尝试使用处理程序延迟启动无限循环,可能是出于实验目的。总的来说,主线程上的无限循环是一个非常糟糕的主意,除了实验之外,我看不出你为什么要这样做
我对这个问题的自我回答更详细地描述了幕后发生的事情。这个问题与您在这里提出的问题没有直接关系,但我相信背景是一样的。您的视图实现了一个runnable,但您从未调用run
方法在单独的线程中开始执行。尝试调用run
您的视图实现了runnable,但从未调用run
方法在单独的线程中开始执行。尝试调用run
您的视图实现了runnable,但从未调用run
方法在单独的线程中开始执行。尝试调用run
除了主要活动
和SurfaceView
之外,我是否应该为游戏逻辑循环使用另一个线程,如状态更改、物理引擎等。?讨论这个问题,并建议游戏逻辑循环可以包含在主线程中。是的,它说如果你没有做任何“过于激烈”的事情,你可以在主线程中进行。根据定义,无限循环是非常激烈的。您可以使用处理程序
/可运行
组合在主线程上实现这一点。一些额外的建议阅读:除了主活动
和表面视图
,我是否应该使用另一个线程进行游戏逻辑循环,例如状态更改,物理引擎等。?讨论这个问题,并建议游戏逻辑循环可以包含在主线程中。是的,它说如果你没有做任何“过于激烈”的事情,你可以在主线程中进行。根据定义,无限循环是非常激烈的。您可以使用处理程序
/可运行
组合在主线程上实现这一点。一些额外的建议阅读:除了主活动
和表面视图
,我是否应该使用另一个线程进行游戏逻辑循环,例如状态更改,物理引擎等。?讨论这个问题,并建议游戏逻辑循环可以包含在主线程中。是的,它说如果你没有做任何“过于激烈”的事情,你可以在主线程中进行。根据定义,无限循环是非常密集的。您可以使用处理程序
/可运行
组合在主线程上实现这一点。一些额外的建议阅读:和
renderView = new RenderSurfaceView(this);
setContentView(renderView);