Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/335.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 For循环导致异常_Java_Android_Multithreading - Fatal编程技术网

Java For循环导致异常

Java For循环导致异常,java,android,multithreading,Java,Android,Multithreading,我想用draw()方法中的代码描述的文本绘制动画 if(条件) 新线程(newrunnable()){ @凌驾 公开募捐{ 对于(int j=0;j>>pl.jawegiel.grarpg.pl.jawegiel.grarpg,您不能从UI(主)线程以外的线程在视图画布上执行方法。此外,您不能在onDraw()之后保留对画布的引用已返回;在绘制过程完成后不久,这些对象会在本机端频繁更改/回收。您可能会注意到,下次调用onDraw()时,会传递一个完全不同的Canvas对象 此外,据我所知,Can

我想用draw()方法中的代码描述的文本绘制动画

if(条件)
新线程(newrunnable()){
@凌驾
公开募捐{

对于(int j=0;j>>pl.jawegiel.grarpg.pl.jawegiel.grarpg,您不能从UI(主)线程以外的线程在
视图
画布上执行方法。此外,您不能在
onDraw()之后保留对
画布
的引用
已返回;在绘制过程完成后不久,这些对象会在本机端频繁更改/回收。您可能会注意到,下次调用
onDraw()
时,会传递一个完全不同的
Canvas
对象

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

坦率地说,我很惊讶您的循环在没有SIGSEGV的情况下成功地进行了不止一次迭代

解决方案:只从UI线程制作动画。将循环分开,并将其转换为一个循环,它将跟踪您要绘制的位置

例如:

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
        }
        ...
    }
    ...
}
class MyViewClass扩展了视图
{
...
私有int mJ=0;
...
@凌驾
受保护的void onDraw(画布)
{
...

如果(mJ)您有两个嵌套的
for
循环,它们具有相同的初始值设定项,即
i
,请尝试将其中一个更改为其他名称。谢谢,但错误并未消失。这不是
chibi1.getY()-i
应该是
chibi1.getY()-j
现在?你是对的,但它不会改变任何错误。我不知道你的整个代码库,但我猜线程中使用的对象也会在主线程中被访问或修改。你可能必须使用同步机制,或者只是等到线程完成后再继续在主线程中。快速测试是调用thread.join().thread th=新线程…;th.start();th.join();
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)
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
        }
        ...
    }
    ...
}