gpt4 book ai didi

java - 带顶部 View 的自定义 ServiceView 在 6.5 分钟后导致应用程序/手机崩溃

转载 作者:行者123 更新时间:2023-12-01 18:28:18 25 4
gpt4 key购买 nike

我正在使用自定义 SurfaceView 编写一个小游戏。我想将 AdMob View 放在 SurfaceView 的底部,但在运行应用程序大约六分钟后,应用程序抛出错误,然后重新启动手机。我已经用单个按钮替换了 AdMob View ,但错误仍然发生,因此我假设问题是由于将任何 View 放在 SurfaceView 上而引起的。如果我从 SurfaceView 顶部删除任何 View ,游戏就会无限期地正常运行。

我尝试过使用RelativeLayout以外的布局,但问题仍然存在。我想知道是否有人以前遇到过这个问题,或者有任何其他途径可以探索。

自定义 SurfaceView:

public class AndroidFastRenderView extends SurfaceView implements Runnable
{
private static final String TAG = "AndroidFastRenderView";
AndroidGame game;
Bitmap framebuffer;
Thread renderThread = null;
SurfaceHolder holder;
volatile boolean running = false;

public AndroidFastRenderView(AndroidGame game, Bitmap framebuffer)
{
super(game);
this.game = game;
this.framebuffer = framebuffer;
this.holder = getHolder();
}

public AndroidFastRenderView(Context context)
{
super(context);
}

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

public void run()
{
Rect dstRect = new Rect(0,0,80,120);
long startTime = System.nanoTime();
while (running)
{
if(!holder.getSurface().isValid())
{
continue;
}

float deltaTime = (System.nanoTime() - startTime) / 1000000000.0f;
startTime = System.nanoTime();

game.getCurrentScreen().update(deltaTime);
game.getCurrentScreen().present(deltaTime);

Canvas canvas = null;

canvas = holder.lockCanvas();

if (canvas != null)
{
dstRect = canvas.getClipBounds();
canvas.drawBitmap(framebuffer, null, dstRect, null);
holder.unlockCanvasAndPost(canvas);
}
}
}

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

}

在主要 Activity 中构建界面:

public void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);

boolean isLandscape = getResources().getConfiguration().orientation == Configuration.ORIENTATION_LANDSCAPE;

int frameBufferWidth = isLandscape ? 120 : 80;
int frameBufferHeight = isLandscape ? 80 : 120;

Bitmap frameBuffer = Bitmap.createBitmap(frameBufferWidth, frameBufferHeight, Config.RGB_565);

float scaleX = (float) frameBufferWidth / getWindowManager().getDefaultDisplay().getWidth();
float scaleY = (float) frameBufferHeight / getWindowManager().getDefaultDisplay().getHeight();

renderView = new AndroidFastRenderView(this, frameBuffer);
graphics = new AndroidGraphics(getAssets(), frameBuffer);
fileIO = new AndroidFileIO(getAssets());
audio = new AndroidAudio(this);
input = new AndroidInput(this, renderView, scaleX, scaleY);
screen = this.getStartScreen();

PowerManager powerManager = (PowerManager) getSystemService(Context.POWER_SERVICE);
wakeLock = powerManager.newWakeLock(PowerManager.FULL_WAKE_LOCK, "GLGame");

if (useAds)
{
//adView = new AdView(this, AdSize.SMART_BANNER, AD_UNIT_ID);

LayoutParams params = new LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT);
params.addRule(RelativeLayout.ALIGN_PARENT_BOTTOM);

//adView.setLayoutParams(params);

RelativeLayout layout = new RelativeLayout(this);
layout.addView(renderView);
//layout.addView(adView);

Button button = new Button(this);
button.setLayoutParams(params);
button.setText("Blargle");
layout.addView(button);

//adView.loadAd(new AdRequest());

setContentView(layout);

}
else
{
setContentView(renderView);
}
}

错误的LogCat:

01-25 13:50:18.084: E/SurfaceTextureClient(10342): dequeueBuffer failed (Broken pipe)
01-25 13:50:18.084: E/SurfaceHolder(10342): Exception locking surface
01-25 13:50:18.084: E/SurfaceHolder(10342): java.lang.IllegalArgumentException
01-25 13:50:18.084: E/SurfaceHolder(10342): at android.view.Surface.lockCanvasNative(Native Method)
01-25 13:50:18.084: E/SurfaceHolder(10342): at android.view.Surface.lockCanvas(Surface.java:88)
01-25 13:50:18.084: E/SurfaceHolder(10342): at android.view.SurfaceView$4.internalLockCanvas(SurfaceView.java:754)
01-25 13:50:18.084: E/SurfaceHolder(10342): at android.view.SurfaceView$4.lockCanvas(SurfaceView.java:734)
01-25 13:50:18.084: E/SurfaceHolder(10342): at com.somethingutility.games.framework.impl.AndroidFastRenderView.run(AndroidFastRenderView.java:60)
01-25 13:50:18.084: E/SurfaceHolder(10342): at java.lang.Thread.run(Thread.java:856)

此错误会重复出现,直到手机重新启动为止。

最佳答案

通过专门将 renderRiew 设置为 ABOVE AdView 来尝试避免在 SurfaceView 上显示 AdView:

params.addRule(RelativeLayout.ABOVE, renderView.getId());

如果 renderView 没有 ID,您可能需要为其提供一个 ID。

关于java - 带顶部 View 的自定义 ServiceView 在 6.5 分钟后导致应用程序/手机崩溃,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14528764/

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