Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Cross-thread issues met disableButton #8

Open
robindegen opened this issue Mar 31, 2014 · 0 comments
Open

Cross-thread issues met disableButton #8

robindegen opened this issue Mar 31, 2014 · 0 comments

Comments

@robindegen
Copy link

Er lijkt een design flaw te zitten in hoe de onscreen buttons werken.

Probleem 1:
De OnScreenButtons singleton wordt pas gemaakt na de Initialize functie in GameEngine, dus daar kunnen knoppen niet uitgezet worden.

Probleem 2:
De update functie draait op een andere thread dan waar de view gemaakt is waardoor er een cross-thread probleem ontstaat bij het aanroepen van OnScreenButtons.disableButton. Voor zover ik weet is dit pas een probleem in de nieuwere versies van de Android SDK, waar deze checks zijn toegevoegd om de boel thread-safe te maken. Zelf gebruik ik 4.4.2 (laatste update)

Zie de logcat:

03-31 12:14:47.479: E/AndroidRuntime(11678): FATAL EXCEPTION: Thread-748
03-31 12:14:47.479: E/AndroidRuntime(11678): android.view.ViewRootImpl$CalledFromWrongThreadException: Only the original thread that created a view hierarchy can touch its views.
03-31 12:14:47.479: E/AndroidRuntime(11678):    at android.view.ViewRootImpl.checkThread(ViewRootImpl.java:5908)
03-31 12:14:47.479: E/AndroidRuntime(11678):    at android.view.ViewRootImpl.invalidateChildInParent(ViewRootImpl.java:869)
03-31 12:14:47.479: E/AndroidRuntime(11678):    at android.view.ViewGroup.invalidateChild(ViewGroup.java:4253)
03-31 12:14:47.479: E/AndroidRuntime(11678):    at android.view.View.invalidate(View.java:10546)
03-31 12:14:47.479: E/AndroidRuntime(11678):    at android.view.View.setFlags(View.java:8635)
03-31 12:14:47.479: E/AndroidRuntime(11678):    at android.view.View.setVisibility(View.java:5837)
03-31 12:14:47.479: E/AndroidRuntime(11678):    at android.widget.ImageView.setVisibility(ImageView.java:1201)
03-31 12:14:47.479: E/AndroidRuntime(11678):    at android.gameengine.icadroids.input.OnScreenButtons.disableButton(OnScreenButtons.java:185)
03-31 12:14:47.479: E/AndroidRuntime(11678):    at com.android.boxhead.BoxheadGame.update(BoxheadGame.java:41)
03-31 12:14:47.479: E/AndroidRuntime(11678):    at android.gameengine.icadroids.engine.GameEngine.updateGame(GameEngine.java:324)
03-31 12:14:47.479: E/AndroidRuntime(11678):    at android.gameengine.icadroids.engine.GameThread.updateGame(GameThread.java:158)
03-31 12:14:47.479: E/AndroidRuntime(11678):    at android.gameengine.icadroids.engine.GameThread.run(GameThread.java:92)

De work around is als volgt (vanuit de update()), check wel met een boolean dat je dit maar 1 keer doet.

runOnUiThread(new Runnable(){
    public void run() {
        OnScreenButtons.disableButton(R.id.buttonX);
        OnScreenButtons.disableButton(R.id.buttonY);
    }
});

Dit werkt wel, maar echt netjes is het natuurlijk niet. disableButton zou dit zelf moeten afhandelen. Ook zou ik aanraden deze singleton eerder te maken zodat je dit niet in de update hoeft te doen, maar van tevoren.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

1 participant