gpt4 book ai didi

java - 子 Activity 线程导致应用在抑制时被卡住

转载 作者:行者123 更新时间:2023-12-03 13:10:15 25 4
gpt4 key购买 nike

我组织了我的代码如下:
MainMenu (一个 Activity )在 Game 上开始一个 Intent (另一项 Activity )。 GameGamePanel (表面支架)开始GameThread (一个线程)。

MainMenu.java :

public void buttonPlay(View view) {
Intent intent = new Intent(this, Game.class);
startActivity(intent);
}

游戏.java :
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
requestWindowFeature(Window.FEATURE_NO_TITLE);
getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,WindowManager.LayoutParams.FLAG_FULLSCREEN);
setContentView(new GamePanel(this));
}

GamePanel.java :
@Override
public void surfaceCreated(SurfaceHolder surfaceHolder) {
gameThread = new GameThread(surfaceHolder, this);
gameThread.setRunning(true);
gameThread.start();
}
@Override
public void surfaceDestroyed(SurfaceHolder surfaceHolder) {
gameThread.setRunning(false);
try {
gameThread.join();
gameThread = null;
} catch (InterruptedException e) { e.printStackTrace(); }
}

GameThread.java
@Override
public void run() {
while (running) {
frameDelay.setStart();
canvas = null;
try {
canvas = this.surfaceHolder.lockCanvas();
synchronized (surfaceHolder) {
this.gamePanel.update();
this.gamePanel.draw(canvas);
}
} catch (Exception e) { e.printStackTrace(); }
finally {
if (canvas != null) {
try {
surfaceHolder.unlockCanvasAndPost(canvas);
} catch (Exception e) {e.printStackTrace();}
}
}
try {
sleep(frameDelay.setDelay());
} catch (Exception e) { e.printStackTrace(); }
frameDelay.displayFPS();
}
try {
sleep(1000000);
} catch (Exception e) { e.printStackTrace(); }
}

当我从 Game 返回时出现问题 Activity 。应用程序显示 MainMenu Activity 但不再响应,很快系统要求杀死它。除此之外, Activity 和线程运行良好。

我不知道是 Activity 生命周期还是线程问题。当我不开始 GameThread总之,应用程序运行良好。但是 GamePanel surfaceDestroyed 被调用,所以我假设线程已正确停止。

我试着打电话:
  • Game onDestroy 捕捉后退按钮。
  • Game完成捕捉后退按钮。
  • Game onDestroy 通过 onPause。
  • Game通过 onPause 完成。
  • 在 GameThread 上中断。

  • 以上都没有解决任何问题(有些会导致崩溃)。

    当我打开应用程序和它被杀死时,就会发生此错误:
    E/WindowState(3143): Error happens during resized 
    E/WindowState(3143): android.os.DeadObjectException
    E/WindowState(3143): at android.os.BinderProxy.transactNative(NativeMethod)
    E/WindowState(3143): at android.os.BinderProxy.transact(Binder.java:496)
    E/WindowState(3143): at android.view.IWindow$Stub$Proxy.resized(IWindow.java:333)
    E/WindowState(3143): at com.android.server.wm.WindowState.reportResized(WindowState.java:1420)
    E/WindowState(3143): at com.android.server.wm.WindowManagerService.performLayoutAndPlaceSurfacesLockedInner(WindowManagerService.java:10129)
    E/WindowState(3143): at com.android.server.wm.WindowManagerService.performLayoutAndPlaceSurfacesLockedLoop(WindowManagerService.java:8887)
    E/WindowState(3143): at com.android.server.wm.WindowManagerService.performLayoutAndPlaceSurfacesLocked(WindowManagerService.java:8829)
    E/WindowState(3143): at com.android.server.wm.WindowManagerService.access$400(WindowManagerService.java:164)
    E/WindowState(3143): at com.android.server.wm.WindowManagerService$H.handleMessage(WindowManagerService.java:7782)
    E/WindowState(3143): at android.os.Handler.dispatchMessage(Handler.java:102)
    E/WindowState(3143): at android.os.Looper.loop(Looper.java:135)
    E/WindowState(3143): at android.os.HandlerThread.run(HandlerThread.java:61)
    E/WindowState(3143): at com.android.server.ServiceThread.run(ServiceThread.java:46)

    当应用程序没有响应时:
    E/ActivityManager(3143): ANR in com.game.app (com.game.app/.MainMenu)
    E/ActivityManager(3143): PID: 27828
    E/ActivityManager(3143): Reason: Input dispatching timed out (Waiting to send non-key event because the touched window has not finished processing certain input events that were delivered to it over 500.0ms ago. Wait queue length: 5. Wait queue head age: 5534.6ms.)

    编辑解决方案:

    我终于找到了问题!它来自 GameThread 中我的 run 方法中的最后一次 sleep ,删除它可以解决问题(并且不会错过它,因为它没有任何意义)。如果有人可以解释毫秒如何导致应用程序完全卡住,请随意!

    最佳答案

    DeadObjectException当您调用死对象时发生。我怀疑您的线程在 onSurfaceDestroyed 发生时正在运行。您的线程使用 Surfaceholder 作为输入,如果它在被销毁时发出一次调用,则可能会产生此错误。为什么你有一个while条件。如果它不满足并且线程在没有损坏的表面保持器的情况下运行怎么办。我看不到你的线程类,但我想你应该把 gameThread.setRunning(false);在 while 循环之前。

    关于java - 子 Activity 线程导致应用在抑制时被卡住,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36482366/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com