无法在未调用Looper.prepare()的线程内创建处理程序 - 实现排行榜

时间:2014-08-27 19:06:42

标签: android android-studio

我正在尝试使用Google Play游戏服务在游戏中添加排行榜。

我显示排行榜和提交分数的类从Framework扩展了Screen,因此我创建了Screen扩展BaseGameActivity,这是使用Google Play游戏服务所必需的。

启动应用时出现此错误:

java.lang.RuntimeException: Can't create handler inside thread that has not called Looper.prepare()
            at android.os.Handler.<init>(Handler.java:197)
            at android.os.Handler.<init>(Handler.java:111)
            at android.app.Activity.<init>(Activity.java:784)
            at android.support.v4.app.FragmentActivity.<init>(FragmentActivity.java:76)
            at com.x.x.BaseGameActivity.<init>(BaseGameActivity.java:65)
            at com.x.framework.Screen.<init>(Screen.java:8)
            at com.x.x.LoadingScreen.<init>(LoadingScreen.java:11)
            at com.x.x.SplashLoadingScreen.update(SplashLoadingScreen.java:19)
            at com.x.framework.implementation.AndroidFastRenderView.run(AndroidFastRenderView.java:47)
            at java.lang.Thread.run(Thread.java:841)

错误指向的部分代码:

BaseGameActivity.java

...protected BaseGameActivity() {
    super();
}...

Screen.java

...public Screen(Game game) {
        this.game = game;
    }...

LoadingScreen.java

...public LoadingScreen(Game game) {

        super(game);
    }...

SplashLoadingScreen.java

...game.setScreen(new LoadingScreen(game));...

AndroidFastRenderView.java

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

有谁知道如何解决这个问题?

2 个答案:

答案 0 :(得分:1)

基于堆栈跟踪,看起来您正在尝试触摸视图并在后台线程中创建Activity。你不应该。尝试在主线程上执行它,你会没事的。

答案 1 :(得分:0)

  1. 请勿尝试从后台线程更新用户界面。使用例如runOnUiThread()Runnable发布到在主UI线程上运行的处理程序。

  2. 请勿尝试使用LoadingScreen自己实例化new等活动类。仅使用Intent间接实例化活动或更改设计,以便您实例化的类不是Activity