gpt4 book ai didi

java - for循环导致异常

转载 作者:行者123 更新时间:2023-12-01 19:46:57 24 4
gpt4 key购买 nike

我想绘制一个带有文本的动画,如draw()方法中的代码中所述。

    if (condition)
new Thread(new Runnable() {
@Override
public void run() {
for (int j = 0; j <= 100; j++) {
try {
Thread.sleep(10);
canvas.drawText("miss", (float) chibi1.getX(), (float) chibi1.getY()-j, pt.pBlack);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}).start();

它工作正常,直到可能到达最后一次迭代。

错误看起来像这样:

2019-11-30 13:02:17.295 16294-16383/pl.jawegiel.grarpg.pl.jawegiel.grarpg A/libc: Fatal signal 11 (SIGSEGV), code 1 (SEGV_MAPERR), fault addr 0x0 in tid 16383 (Thread-36), pid 16294 (jawegiel.grarpg) 2019-11-30 13:02:17.361 16414-16414/? A/DEBUG: pid: 16294, tid: 16383, name: Thread-36  >>> pl.jawegiel.grarpg.pl.jawegiel.grarpg <<< 2019-11-30 13:02:17.676 16414-16414/? E/crash_dump64: Normal dump:pl.jawegiel.grarpg.pl.jawegiel.grarpg 2019-11-30 13:02:17.727 1393-1832/? E/InputDispatcher: channel '574dd1 pl.jawegiel.grarpg.pl.jawegiel.grarpg/pl.jawegiel.grarpg.activities.Gra (server)' ~ Channel is unrecoverably broken and will be disposed! 2019-11-30 13:02:17.750 1393-1832/? E/InputDispatcher: channel '6cb9262 pl.jawegiel.grarpg.pl.jawegiel.grarpg/pl.jawegiel.grarpg.activities.MainActivity (server)' ~ Channel is unrecoverably broken and will be disposed! 2019-11-30 13:02:17.751 814-814/? E/ANDR-IOP: IOP HAL: Received pkg_name = pl.jawegiel.grarpg.pl.jawegiel.grarpg pid = 0 2019-11-30 13:02:17.928 1393-1475/? E/ActivityManager: Sending non-protected broadcast com.sonymobile.crashmonitorsystemservice.DIR_UPDATED from system 1393:system/1000 pkg android
java.lang.Throwable
at com.android.server.am.ActivityManagerService.checkBroadcastFromSystem(ActivityManagerService.java:21850)
at com.android.server.am.ActivityManagerService.broadcastIntentLocked(ActivityManagerService.java:22459)
at com.android.server.am.ActivityManagerService.broadcastIntent(ActivityManagerService.java:22601)
at android.app.ContextImpl.sendBroadcastAsUser(ContextImpl.java:1224)
at android.app.ContextImpl.sendBroadcastAsUser(ContextImpl.java:1196)
at android.content.ContextWrapper.sendBroadcastAsUser(ContextWrapper.java:525)
at com.sonymobile.crashmonitor.system.service.DumpfileObserver.onEvent(DumpfileObserver.java:32)
at android.os.FileObserver$ObserverThread.onEvent(FileObserver.java:123)
at android.os.FileObserver$ObserverThread.observe(Native Method)
at android.os.FileObserver$ObserverThread.run(FileObserver.java:86)

为什么会发生这种情况以及需要改变什么?

最佳答案

您不得从 UI(主)线程以外的线程执行 View Canvas 上的方法。此外,在 onDraw() 返回后,您不能保留对 canvas 的引用;在绘制过程完成后不久,这些对象会在 native 端频繁更改/回收。您可能会注意到,下次调用 onDraw() 时,它会传递一个完全不同的 Canvas 对象。

此外,据我所知,Canvas 对象不是线程安全的。我怀疑您的 chibi1 (无论是什么)也不是线程安全的,并且它也被以危险的方式访问。

坦率地说,我很惊讶你的循环在没有 SIGSEGV 的情况下成功地使其迭代超过 1 次。

解决方案:仅从 UI 线程执行动画。分解你的循环,并将其变成 FSM ,它将跟踪您要绘制的位置。

例如:

class MyViewClass extends View
{

...
private int mJ = 0;
...
@Override
protected void onDraw( Canvas canvas )
{
...
if(mJ <= 100)
{
canvas.drawText("miss", (float) chibi1.getX(), (float) chibi1.getY()-mJ, pt.pBlack);
mJ++;
invalidate(); //Prompt an immediate re-draw
}
...
}
...
}

关于java - for循环导致异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59115983/

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