当前位置: 首页 > 知识库问答 >
问题:

表面视图,重新打开应用程序后黑屏

公良安邦
2023-03-14

我有一个activity,它调用一个扩展SurfaceView并实现Runnable的类,并将activity类的contentView()设置为surfaceview类的实例。最小化活动后,我暂停并销毁线程:

public void pause(){
    running = false;
    while(true){
        try{
            renderThread.join();
            break;
        }catch(InterruptedException e){
            //retry
        }
    }
}

当活动恢复时,我重新创建线程:

 public void resume(){
    running = true;
    renderThread = new Thread(this);
    renderThread.start();
}

请注意,这些是在onP()和onResume()活动方法中调用的。

public void run(){
    while(running){//thred loop
            if(!holder.getSurface().isValid())
                continue;
                if(puzzleDrawn!=true)   {
                    canvas = holder.lockCanvas();
                    drawPuzzle(canvas);
                    holder.unlockCanvasAndPost(canvas);
                    }
    }
}
    public void drawPuzzle(canvas){
    //draws on canvas
    }

当我尝试重新打开应用程序时,我看到一个黑屏。我需要抽奖(画布)方法被绘制一次。有什么技巧吗?

如果你需要更多的信息,让我知道!谢谢

共有1个答案

狄彬彬
2023-03-14

在你的暂停方法中,你在错误的地方调用了break。您应该做的是在try-and-catch括号之后的while循环结束时调用break,并在循环范围之外以及在结束暂停方法之前再次将线程设置为null,如下所示:

public void pause(){
 running = false;
 while(true){
    try{
        renderThread.join();
    }catch(InterruptedException e){
        //retry
    }
      break;
 }
 renderThread = null;
}
 类似资料:
  • 下面给出的错误 process:com.example.rahul.maptask,pid:21986 java.lang.runtimeException:无法启动活动ComponentInfo{com.example.rahul.maptask/com.example.rahul.maptask.mainactivity}:java.lang.nullpointerException:试图在A

  • 使用以下代码时: 以下用户行为创建了一种不一致的通知方法: null null

  • 嗨,我有问题打开新窗口fxml视图后单击按钮。主窗口显示,在主视图中我有六个按钮。我想我点击按钮打开新窗口。但是,当我单击按钮时,显示异常: java.lang.Reflect.InvocationTargetException 我尝试在internet上找到的不同解决方案,但显示此异常。主要是尝试在切换函数中修改代码,负责显示新视图。我认为问题出在这里或者是在主类中的代码。

  • 一段时间以来,我一直面临着一个关于星际触觉(意图)的问题。我正在开发的是一种关键字检测,比如“ok google”,当用户说出这个词时会触发警报。为了实现这一点,当用户不使用该应用程序时,我有一个LifecycleService在前台运行并听取用户的意见。当用户说出这个词并且应用程序被终止时,它会使用服务中的startActivity打开我需要的活动,但问题是,如果我一直在听并切换到其他活动(正常

  • 我的应用程序的通知工作良好,在后台和前台接收通知,使用Firebase原生插件。现在,我的客户端需要在收到通知时打开应用程序,而不需要任何用户迭代。 我找到了这个,但没有正确的答案。 在调试中,我意识到通知是通过FireBaseInstanceIDReceiver广播接收的。所以,我试过: 修改 plugins/cordova-plugin-firebase-lib/plugin.xml 我的问题

  • 问题内容: 我有一个View Controller,其中我的值为0(标签),而当我从另一个视图控制器中打开该View Controller时,我已设置为将label的值设置为20。它可以正常工作,但是当我关闭我的应用程序并再次打开我的应用程序时,该值不会更改,因为,并且没有任何调用。打开我的应用程序时该怎么打电话。我需要做些什么吗? 问题答案: 我对事件的确切顺序感到好奇,所以我对应用程序进行了如