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

为什么rununuithread仍然是导致循环的原因。prepare()错误消息

庄康胜
2023-03-14

我有一个使用Libgdx游戏引擎的Android游戏。我有一个Android活动(mAndroidLauncher),它扩展了Libgdx的AndroidApplication类。有一种方法可以创建Android警报对话框:

mAndroidLauncher.runOnUiThread(new Runnable() {
    @Override
    public void run() {
        AlertDialog.Builder builder = new AlertDialog.Builder(mAndroidLauncher.getContext());
        builder.setTitle("Notice");
        builder.setMessage("Alert!!!");
        builder.setNeutralButton("OK", new DialogInterface.OnClickListener() {
            public void onClick(DialogInterface dialog, int which) {
               //OK
            }
        });
        AlertDialog dialog = builder.create();
        dialog.show();
    }
});

我在Google Play开发人员控制台中遇到了如下问题:

java.lang.RuntimeException: Can't create handler inside thread that has not called Looper.prepare()
at android.os.Handler.<init>(Handler.java:208)
at android.os.Handler.<init>(Handler.java:122)
at android.app.Dialog.<init>(Dialog.java:109)
at android.app.AlertDialog.<init>(AlertDialog.java:114)
at android.app.AlertDialog$Builder.create(AlertDialog.java:931)
at com.google.android.gms.common.e.a(Unknown Source)
at com.google.android.gms.common.e.a(Unknown Source)
at com.my.game.l.a(Unknown Source)
at com.my.game.l.g(Unknown Source)
at com.my.game.l.c(Unknown Source)
at com.my.game.a.b(Unknown Source)
at com.my.game.b.f.a(Unknown Source)
at com.my.game.q.b(Unknown Source)
at com.badlogic.gdx.backends.android.i.onDrawFrame(Unknown Source)
at android.opengl.GLSurfaceView$GLThread.guardedRun(GLSurfaceView.java:1557)
at android.opengl.GLSurfaceView$GLThread.run(GLSurfaceView.java:1263)

这是我的应用程序中唯一使用AlertDialog的地方,这就是为什么我确信这是导致崩溃的方法。为什么RUNNUITHREAD会导致此错误?我是否需要做任何其他事情来确保AlertDialog是从具有循环器的线程构建的?

编辑:谢谢CommonsWare。错误确实来自Google Play服务。具体来说,我调用了game helper . beginuserintitiedsignin(),它没有被包装在runOnUiThread()中。虽然,奇怪的是,这并没有导致所有手机的错误

共有2个答案

姬正文
2023-03-14

不能使用活动名称直接调用runOnUIThread(){},比如调用静态方法…在mAndroidLauncher中声明一个对象为

public static Activity acitivity = this;

并将runOnUIThread称为

mAndroidLauncher.activity.runOnUiThread(new Runnable() {
    @Override
    public void run() {
        AlertDialog.Builder builder = new AlertDialog.Builder(mAndroidLauncher.getContext());
        builder.setTitle("Notice");
        builder.setMessage("Alert!!!");
        builder.setNeutralButton("OK", new DialogInterface.OnClickListener() {
            public void onClick(DialogInterface dialog, int which) {
               //OK
            }
        });
        AlertDialog dialog = builder.create();
        dialog.show();
    }
});
胥博文
2023-03-14
 new Handler(Looper.getMainLooper()).postDelayed(new Runnable()
            {
                @Override
                public void run()
                {
                    //Do something here
                    AlertDialog.Builder builder = new AlertDialog.Builder(mAndroidLauncher.getContext());
        builder.setTitle("Notice");
        builder.setMessage("Alert!!!");
        builder.setNeutralButton("OK", new DialogInterface.OnClickListener() {
            public void onClick(DialogInterface dialog, int which) {
               //OK
            }
        });
        AlertDialog dialog = builder.create();
        dialog.show();
                }
            }, 0);
 类似资料:
  • minecraft 1.8.8的modcoderpack918中的有一个很大的问题。我的Java版本是1.8.0_271-B09。 我不知道我必须做什么。

  • 我想在不使用IDE的情况下执行我的程序。我已经创建了一个jar文件和一个可执行的jar文件。当我双击exe jar文件时,什么也没有发生,当我尝试在cmd中使用命令时,它给出以下信息: 我使用命令:java-jar Calculator.jar 我是如何创建jar的: 右键单击项目文件夹(计算器) 选择 单击Java文件夹并选择可执行罐文件,然后选择下一个 启动配置:主-计算器 创建出口目的地 命

  • 我是如何创建罐子的: 右键单击项目文件夹(计算器) 选择 单击Java文件夹并选择“Exectuable Jar文件”,然后选择Next 启动配置:main-calculator 创建导出目标 打“完”获利!嗯,也不是。

  • " boolean cancel(boolean mayInterruptIfRunning)尝试取消此任务的执行。如果任务已经完成、已经取消或由于其他原因无法取消,此尝试将会失败 https://docs.oracle.com/javase/7/docs/api/java/util/concurrent/Future.html#cancel(布尔值) 除了上面列出的原因之外,还有什么其他原因会无

  • 这是因为在我的系统路径中没有对grunt的引用吗?还是别的什么?我已经试着重新安装了几次。

  • 我有一个实现getItem和getCount的标准FragmentPagerAdapter子类。适配器有3个条目,所以当到达第三个条目时,第一个条目的片段应该被销毁。 我已经验证了在位置0中调用了销毁项。但是当我返回到第1页,在FragmentPagerAdapter的instantiateItem中,不是空的。导致它重新连接片段。 如何更改它,以便在调用destroyItem时,它不会在inst