Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/347.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 为什么我的Surface View类在主活动繁忙时停止渲染?_Java_Android_Multithreading_Surfaceview - Fatal编程技术网

Java 为什么我的Surface View类在主活动繁忙时停止渲染?

Java 为什么我的Surface View类在主活动繁忙时停止渲染?,java,android,multithreading,surfaceview,Java,Android,Multithreading,Surfaceview,我正在为Android扩展SurfaceView实现一个简单的渲染视图类。我的主要活动类包括一个用于其他操作的无限while循环 然而,当主要活动在无限循环中时,应用程序会显示一个黑屏。据我所知,主活动和表面视图类有各自独立的线程,所以表面视图类应该在主活动类繁忙时保持渲染。当我通过在代码中设置“running”布尔变量false来阻止无限循环时,应用程序运行得很好 当我的主要活动处于无限循环中时,曲面视图类停止渲染的原因可能是什么 我的主要活动和表面视图课程如下: import android

我正在为Android扩展SurfaceView实现一个简单的渲染视图类。我的主要活动类包括一个用于其他操作的无限while循环

然而,当主要活动在无限循环中时,应用程序会显示一个黑屏。据我所知,主活动和表面视图类有各自独立的线程,所以表面视图类应该在主活动类繁忙时保持渲染。当我通过在代码中设置“running”布尔变量false来阻止无限循环时,应用程序运行得很好

当我的主要活动处于无限循环中时,曲面视图类停止渲染的原因可能是什么

我的主要活动和表面视图课程如下:

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);