2014-01-05 26 views
3

我不是很熟悉Android的活動,以及如何,所有的作品;任何關於這個話題的指導都會很棒。我遇到了將廣告SDK與我的遊戲集成的問題。我將介紹幾個課程,以充分理解我的代碼。本質上,我試圖確定一個將StartApp sdk(廣告SDK)與我的libGDX遊戲集成的好方法。我得到了什麼似乎是由startAppAd.show()造成的活套錯誤;和startAppAd.load();被稱爲。尺蠖誤差libGDX

這裏是堆棧跟蹤(提一個UI線程,並在不同的線程加載廣告):

01-05 15:55:27.646: W/webview_proxy(14876): java.lang.Throwable: Warning: A WebView method was called on thread 'GLThread 8584'. All WebView methods must be called on the UI thread. Future versions of WebView may not support use on other threads. 
01-05 15:55:27.646: W/webview_proxy(14876):  at android.webkit.WebView.checkThread(WebView.java:1895) 
01-05 15:55:27.646: W/webview_proxy(14876):  at android.webkit.WebView.ensureProviderCreated(WebView.java:1878) 
01-05 15:55:27.646: W/webview_proxy(14876):  at android.webkit.WebView.setOverScrollMode(WebView.java:1935) 
01-05 15:55:27.646: W/webview_proxy(14876):  at android.view.View.<init>(View.java:3316) 
01-05 15:55:27.646: W/webview_proxy(14876):  at android.view.View.<init>(View.java:3383) 
01-05 15:55:27.646: W/webview_proxy(14876):  at android.view.ViewGroup.<init>(ViewGroup.java:432) 
01-05 15:55:27.646: W/webview_proxy(14876):  at android.widget.AbsoluteLayout.<init>(AbsoluteLayout.java:52) 
01-05 15:55:27.646: W/webview_proxy(14876):  at android.webkit.WebView.<init>(WebView.java:505) 
01-05 15:55:27.646: W/webview_proxy(14876):  at android.webkit.WebView.<init>(WebView.java:482) 
01-05 15:55:27.646: W/webview_proxy(14876):  at android.webkit.WebView.<init>(WebView.java:468) 
01-05 15:55:27.646: W/webview_proxy(14876):  at android.webkit.WebView.<init>(WebView.java:457) 
01-05 15:55:27.646: W/webview_proxy(14876):  at android.webkit.WebView.<init>(WebView.java:447) 
01-05 15:55:27.646: W/webview_proxy(14876):  at com.startapp.android.publish.Ad.load(Unknown Source) 
01-05 15:55:27.646: W/webview_proxy(14876):  at com.startapp.android.publish.HtmlAd.load(Unknown Source) 
01-05 15:55:27.646: W/webview_proxy(14876):  at com.startapp.android.publish.StartAppAd.loadAds(Unknown Source) 
01-05 15:55:27.646: W/webview_proxy(14876):  at com.startapp.android.publish.StartAppAd.load(Unknown Source) 
01-05 15:55:27.646: W/webview_proxy(14876):  at com.startapp.android.publish.StartAppAd.loadAd(Unknown Source) 
01-05 15:55:27.646: W/webview_proxy(14876):  at com.startapp.android.publish.StartAppAd.loadAd(Unknown Source) 
01-05 15:55:27.646: W/webview_proxy(14876):  at com.startapp.android.publish.StartAppAd.onResume(Unknown Source) 
01-05 15:55:27.646: W/webview_proxy(14876):  at com.audiack.freetappgame.MainActivity.resume(MainActivity.java:41) 
01-05 15:55:27.646: W/webview_proxy(14876):  at Screens.GameScreen.resume(GameScreen.java:699) 
01-05 15:55:27.646: W/webview_proxy(14876):  at com.badlogic.gdx.Game.resume(Game.java:41) 
01-05 15:55:27.646: W/webview_proxy(14876):  at com.badlogic.gdx.backends.android.AndroidGraphics.onDrawFrame(AndroidGraphics.java:480) 
01-05 15:55:27.646: W/webview_proxy(14876):  at android.opengl.GLSurfaceView$GLThread.guardedRun(GLSurfaceView.java:1516) 
01-05 15:55:27.646: W/webview_proxy(14876):  at android.opengl.GLSurfaceView$GLThread.run(GLSurfaceView.java:1240) 
01-05 15:55:27.656: W/IInputConnectionWrapper(14876): getSelectedText on inactive InputConnection 
01-05 15:55:27.656: D/SensorManager(14876): onAccuracyChanged :: accuracy = 3 
01-05 15:55:27.656: W/IInputConnectionWrapper(14876): setComposingText on inactive InputConnection 
01-05 15:55:27.676: W/webview_proxy(14876): java.lang.Throwable: Warning: A WebView method was called on thread 'GLThread 8584'. All WebView methods must be called on the UI thread. Future versions of WebView may not support use on other threads. 
01-05 15:55:27.676: W/webview_proxy(14876):  at android.webkit.WebView.checkThread(WebView.java:1895) 
01-05 15:55:27.676: W/webview_proxy(14876):  at android.webkit.WebView.getFactory(WebView.java:1889) 
01-05 15:55:27.676: W/webview_proxy(14876):  at android.webkit.WebView.ensureProviderCreated(WebView.java:1882) 
01-05 15:55:27.676: W/webview_proxy(14876):  at android.webkit.WebView.setOverScrollMode(WebView.java:1935) 
01-05 15:55:27.676: W/webview_proxy(14876):  at android.view.View.<init>(View.java:3316) 
01-05 15:55:27.676: W/webview_proxy(14876):  at android.view.View.<init>(View.java:3383) 
01-05 15:55:27.676: W/webview_proxy(14876):  at android.view.ViewGroup.<init>(ViewGroup.java:432) 
01-05 15:55:27.676: W/webview_proxy(14876):  at android.widget.AbsoluteLayout.<init>(AbsoluteLayout.java:52) 
01-05 15:55:27.676: W/webview_proxy(14876):  at android.webkit.WebView.<init>(WebView.java:505) 
01-05 15:55:27.676: W/webview_proxy(14876):  at android.webkit.WebView.<init>(WebView.java:482) 
01-05 15:55:27.676: W/webview_proxy(14876):  at android.webkit.WebView.<init>(WebView.java:468) 
01-05 15:55:27.676: W/webview_proxy(14876):  at android.webkit.WebView.<init>(WebView.java:457) 
01-05 15:55:27.676: W/webview_proxy(14876):  at android.webkit.WebView.<init>(WebView.java:447) 
01-05 15:55:27.676: W/webview_proxy(14876):  at com.startapp.android.publish.Ad.load(Unknown Source) 
01-05 15:55:27.676: W/webview_proxy(14876):  at com.startapp.android.publish.HtmlAd.load(Unknown Source) 
01-05 15:55:27.676: W/webview_proxy(14876):  at com.startapp.android.publish.StartAppAd.loadAds(Unknown Source) 
01-05 15:55:27.676: W/webview_proxy(14876):  at com.startapp.android.publish.StartAppAd.load(Unknown Source) 
01-05 15:55:27.676: W/webview_proxy(14876):  at com.startapp.android.publish.StartAppAd.loadAd(Unknown Source) 
01-05 15:55:27.676: W/webview_proxy(14876):  at com.startapp.android.publish.StartAppAd.loadAd(Unknown Source) 
01-05 15:55:27.676: W/webview_proxy(14876):  at com.startapp.android.publish.StartAppAd.onResume(Unknown Source) 
01-05 15:55:27.676: W/webview_proxy(14876):  at com.audiack.freetappgame.MainActivity.resume(MainActivity.java:41) 
01-05 15:55:27.676: W/webview_proxy(14876):  at Screens.GameScreen.resume(GameScreen.java:699) 
01-05 15:55:27.676: W/webview_proxy(14876):  at com.badlogic.gdx.Game.resume(Game.java:41) 
01-05 15:55:27.676: W/webview_proxy(14876):  at com.badlogic.gdx.backends.android.AndroidGraphics.onDrawFrame(AndroidGraphics.java:480) 
01-05 15:55:27.676: W/webview_proxy(14876):  at android.opengl.GLSurfaceView$GLThread.guardedRun(GLSurfaceView.java:1516) 
01-05 15:55:27.676: W/webview_proxy(14876):  at android.opengl.GLSurfaceView$GLThread.run(GLSurfaceView.java:1240) 
01-05 15:55:27.706: W/dalvikvm(14876): threadid=11: thread exiting with uncaught exception (group=0x4159a438) 
01-05 15:55:27.716: E/AndroidRuntime(14876): FATAL EXCEPTION: GLThread 8584 
01-05 15:55:27.716: E/AndroidRuntime(14876): java.lang.RuntimeException: Can't create handler inside thread that has not called Looper.prepare() 
01-05 15:55:27.716: E/AndroidRuntime(14876): at android.os.Handler.<init>(Handler.java:121) 
01-05 15:55:27.716: E/AndroidRuntime(14876): at android.webkit.WebViewClassic$PrivateHandler.<init>(WebViewClassic.java:10636) 
01-05 15:55:27.716: E/AndroidRuntime(14876): at android.webkit.WebViewClassic.<init>(WebViewClassic.java:1258) 
01-05 15:55:27.716: E/AndroidRuntime(14876): at android.webkit.WebViewClassic$Factory.createWebView(WebViewClassic.java:2031) 
01-05 15:55:27.716: E/AndroidRuntime(14876): at android.webkit.WebView.ensureProviderCreated(WebView.java:1882) 
01-05 15:55:27.716: E/AndroidRuntime(14876): at android.webkit.WebView.setOverScrollMode(WebView.java:1935) 
01-05 15:55:27.716: E/AndroidRuntime(14876): at android.view.View.<init>(View.java:3316) 
01-05 15:55:27.716: E/AndroidRuntime(14876): at android.view.View.<init>(View.java:3383) 
01-05 15:55:27.716: E/AndroidRuntime(14876): at android.view.ViewGroup.<init>(ViewGroup.java:432) 
01-05 15:55:27.716: E/AndroidRuntime(14876): at android.widget.AbsoluteLayout.<init>(AbsoluteLayout.java:52) 
01-05 15:55:27.716: E/AndroidRuntime(14876): at android.webkit.WebView.<init>(WebView.java:505) 
01-05 15:55:27.716: E/AndroidRuntime(14876): at android.webkit.WebView.<init>(WebView.java:482) 
01-05 15:55:27.716: E/AndroidRuntime(14876): at android.webkit.WebView.<init>(WebView.java:468) 
01-05 15:55:27.716: E/AndroidRuntime(14876): at android.webkit.WebView.<init>(WebView.java:457) 
01-05 15:55:27.716: E/AndroidRuntime(14876): at android.webkit.WebView.<init>(WebView.java:447) 
01-05 15:55:27.716: E/AndroidRuntime(14876): at com.startapp.android.publish.Ad.load(Unknown Source) 
01-05 15:55:27.716: E/AndroidRuntime(14876): at com.startapp.android.publish.HtmlAd.load(Unknown Source) 
01-05 15:55:27.716: E/AndroidRuntime(14876): at com.startapp.android.publish.StartAppAd.loadAds(Unknown Source) 
01-05 15:55:27.716: E/AndroidRuntime(14876): at com.startapp.android.publish.StartAppAd.load(Unknown Source) 
01-05 15:55:27.716: E/AndroidRuntime(14876): at com.startapp.android.publish.StartAppAd.loadAd(Unknown Source) 
01-05 15:55:27.716: E/AndroidRuntime(14876): at com.startapp.android.publish.StartAppAd.loadAd(Unknown Source) 
01-05 15:55:27.716: E/AndroidRuntime(14876): at com.startapp.android.publish.StartAppAd.onResume(Unknown Source) 
01-05 15:55:27.716: E/AndroidRuntime(14876): at com.audiack.freetappgame.MainActivity.resume(MainActivity.java:41) 
01-05 15:55:27.716: E/AndroidRuntime(14876): at Screens.GameScreen.resume(GameScreen.java:699) 
01-05 15:55:27.716: E/AndroidRuntime(14876): at com.badlogic.gdx.Game.resume(Game.java:41) 
01-05 15:55:27.716: E/AndroidRuntime(14876): at com.badlogic.gdx.backends.android.AndroidGraphics.onDrawFrame(AndroidGraphics.java:480) 
01-05 15:55:27.716: E/AndroidRuntime(14876): at android.opengl.GLSurfaceView$GLThread.guardedRun(GLSurfaceView.java:1516) 
01-05 15:55:27.716: E/AndroidRuntime(14876): at android.opengl.GLSurfaceView$GLThread.run(GLSurfaceView.java:1240) 
01-05 15:57:29.236: E/System(14876): Uncaught exception thrown by finalizer 
01-05 15:57:29.246: E/System(14876): java.lang.NullPointerException 
01-05 15:57:29.246: E/System(14876): at android.webkit.WebViewClassic.destroy(WebViewClassic.java:2954) 
01-05 15:57:29.246: E/System(14876): at android.webkit.WebViewClassic.finalize(WebViewClassic.java:5366) 
01-05 15:57:29.246: E/System(14876): at java.lang.Daemons$FinalizerDaemon.doFinalize(Daemons.java:186) 
01-05 15:57:29.246: E/System(14876): at java.lang.Daemons$FinalizerDaemon.run(Daemons.java:169) 
01-05 15:57:29.246: E/System(14876): at java.lang.Thread.run(Thread.java:856) 

它似乎有事情做,試圖啓動活動中加載廣告。這裏是我的發射活動(以及由於libGDX唯一的活動只在運行了Android一個活動):

package com.audiack.freetappgame; 

import Screens.FreeTappGame; 
import UtilityClasses.StartAppResolver; 
import android.os.Bundle; 
import android.os.Looper; 

import com.badlogic.gdx.backends.android.AndroidApplication; 
import com.badlogic.gdx.backends.android.AndroidApplicationConfiguration; 
import com.badlogic.gdx.graphics.Texture; 
import com.searchboxsdk.android.StartAppSearch; 
import com.startapp.android.publish.StartAppAd; 

public class MainActivity extends AndroidApplication implements StartAppResolver{ 
    public StartAppAd startAppAd = new StartAppAd(this); 
    public StartAppSearch startAppSearch= new StartAppSearch(); 
    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 

     AndroidApplicationConfiguration cfg = new AndroidApplicationConfiguration(); 

     StartAppAd.init(this, "101164873", "201640058"); 
     StartAppSearch.init(this, "101164873", "201640058"); 

     Texture.setEnforcePotImages(false); 
     cfg.useGL20 = true; 

     initialize(new FreeTappGame(this), cfg); 
     StartAppSearch.showSearchBox(this); 
    } 
    @Override 
    public boolean showAds() { 
     startAppAd.load(); 
     startAppAd.show(); 
     return true; 
    } 

    @Override 
    public boolean resume() { 
     startAppAd.onResume(); 
     return true; 
    } 
    @Override 
    public boolean backButton() { 

     return true; 
    } 
    @Override 
    public boolean pause() { 
     startAppAd.onPause(); 
     return true; 
    } 
} 

正如你可以看到我有這個活動實現我創建了一個接口,然後我通過活動本身ApplicationListener,允許libGDX方法與活動交互。 這是接口;基於關我小時的研究,這是對中libGDX廣告整合的最佳方式(但這些方法都是類似的廣告SDK的沒有的startApp直接):

package UtilityClasses; 

public interface StartAppResolver { 
    public boolean showAds(); 
    public boolean resume(); 
    public boolean backButton(); 
    public boolean pause(); 
} 

最後了ApplicationListener(在FreeTappGame類):

package Screens; 


import UtilityClasses.Assets; 
import UtilityClasses.StartAppResolver; 

import com.badlogic.gdx.ApplicationListener; 
import com.badlogic.gdx.Game; 
import com.badlogic.gdx.Gdx; 

public class FreeTappGame extends Game implements ApplicationListener { 
    static float Width; 
    static float Height; 

    public StartAppResolver startAppResolver; 

    public SplashScreen splash_screen; 
    public MenuScreen menu_screen; 
    public GameScreen game_screen; 
    public HighscoreScreen highscore_screen; 
    public AboutScreen about_screen; 

    public FreeTappGame(StartAppResolver startAppResolver) { 
     this.startAppResolver = startAppResolver; 
    } 

    @Override 
    public void create() { 
     Width = Gdx.graphics.getWidth(); 
     Height = Gdx.graphics.getHeight(); 
     Assets.load(); 

     splash_screen = new SplashScreen(this); 
     menu_screen = new MenuScreen(this); 
     game_screen = new GameScreen(this); 
     highscore_screen = new HighscoreScreen(this); 
     about_screen = new AboutScreen(this); 

     setScreen(splash_screen); 
    } 
} 

謝謝你這麼多的時間。

+1

我想通了,我會盡快發佈解決方案。 –

回答

0

你需要調用

Looper.prepare(); 

而且一定要在只有一個線程調用它一次。這個工作對我來說:

boolean looperprepare = false; 


public void yourmethod(){ 
    if (!looperprepare) { 
     Looper.prepare(); 
     looperprepare = true; 
    } 
    .... 
} 
+0

當我這樣做時,它說我只能創建一個活套。我發現了一個工作解決方案。當我被允許時我會發布它。 –

2

我會刪除此線程,因爲有一個類似的問題在這裏:WebView Methods is not called in android 但目前還沒有計算器上許多的startApp解決方案,我認爲這個問題將是有益的人誰正在嘗試整合startapp。我換成

@Override 
    public boolean showAds() { 
     startAppAd.load(); 
     startAppAd.show(); 
     return true; 
    } 

@Override 
public boolean showAds() { 
    this.runOnUiThread(new Runnable() { 
     @Override 
     public void run() { 
     startAppAd.show(); 

     } 
    }); 
    return true; 
} 

和我的初始化方法後,就把startAppAd.load():

initialize(new FreeTappGame(this), cfg); 
startAppAd.load(); 

該訣竅我;我希望這可以幫助別人。