java.lang.stackoverflowerror im Thread ?!?

  • 3 Antworten
  • Letztes Antwortdatum
G

Greenstar

Gast
Hallo,
ich wurde gestern von einem Freund angesprochen, dass er ein Problem bei einem Spiel hat. Er hat mir den Code hier geschickt:
Code:
package com.KingofkingsHD.Game;

import android.app.*;
import android.content.*;
import android.graphics.*;
import android.os.*;
import android.view.*;
import android.util.*;
import android.annotation.*;

public class GameActivity extends Activity
{
	public boolean isRunning = true;
	public int y = 0;
	public final Activity me = this;
	
	public void onCreate(Bundle savedInstanceState)
	{
		super.onCreate(savedInstanceState);
		setContentView(new GameView(this));
	}
	
	private class GameView extends SurfaceView
	{
		private SurfaceHolder surfaceHolder;
		private Bitmap bmp;
		private GameRender gameThread = new GameRender(this);
		
		
		//@SuppressLint("WrongCall") - neu hinzugefügt am 14.02.14
		@SuppressLint("WrongCall")public GameView(Context context)
		{
[color="#FF0000"]			super(context);[/color]
			surfaceHolder = getHolder();
			surfaceHolder.addCallback(new SurfaceHolder.Callback() 
			{
				public void surfaceDestroyed(SurfaceHolder holder)
				{
					boolean retry = true;
					gameThread.setRunning(false);
					
					while(retry)
					{
						try 
						{
							gameThread.join();
							
							retry=false;
						}catch(InterruptedException e)
						{
							
						}
					}
				}
				
				public void surfaceCreated(SurfaceHolder holder)
				{
					gameThread.start();
				}
				
				public void surfaceChanged(SurfaceHolder holder, int format, int width, int height)
				{
					// TODO Auto-generated method stub
				}
			});
			
			bmp = BitmapFactory.decodeResource(getResources(), R.drawable.ic_launcher);
		}
		
		@Override
		protected void onDraw(Canvas canvas)
		{
			canvas.drawColor(Color.CYAN);
			if(y != 10)
			{
				y = y + 1;
				canvas.drawBitmap(bmp, 0, y, null);
			}
			
		}
	}
	
	private class GameRender extends Thread
	{
		GameView theView = new GameView(me);
		
		public GameRender(GameView theView)
[color="#FF0000"]		{[/color]
			this.theView = theView;
		}
		
		public void setRunning(boolean run)
		{
			isRunning = run;
		}
		
		public void run()
		{
			while(isRunning)
			{
				if(y == 10)
				{
					isRunning = false;
				}
				Canvas theCanvas = null;
				try
				{
					theCanvas = theView.getHolder().lockCanvas();
					synchronized(theView.getHolder())
					{
						theView.onDraw(theCanvas);
					}
				}finally
				{
					if(theCanvas != null)
					{
						theView.getHolder().unlockCanvasAndPost(theCanvas);
						try
						{
							sleep(10000);
						}
						catch (InterruptedException e)
						{
							
						}
					}
				}
			}
		}
	}
}

Der Logcat sagt folgendes:
Code:
FATAL EXCEPTION: main
java.lang.StackOverflowError

at java.lang.IntegralToString.convertLong(IntegralToString.java:317)
at java.lang.IntegralToString.appendLong(IntegralToString.java:307)
at java.lang.StringBuilder.append(StringBuilder.java:154)
at java.lang.Thread.create(Thread.java:428)
at java.lang.Thread.<init>(Thread.java:208)

Darauf folgt dann ca. 10-20 mal:
Code:
at com.KingofkingsHD.Game.GameActivity$GameThread.<init>(GameActivity.java:88)
at com.KingofkingsHD.Game.GameActivity$GameView.<init>(GameActivity.java:33)

Ich habs zwar schon seit heute Mittag probiert zu lösen, hab aber leider keine Fortschritte gemacht. Daher hoffe ich mal das ihr mir helfen könnt ^^
[/Code]
 
Rekursion ist eine schöne Sache:
In GameView:
Code:
private GameRender gameThread = new GameRender(this);
und in GameRender:

Code:
GameView theView = new GameView(me);
Kein Wunder, dass das Programm sich aufhängt. Viele Threads sind des Jägers tot. Ich vermute, das die dalvik die App beendet hat, weil der Stack im Object ThreadLocal übergelaufen ist. Entfernt die Rekursion.


Und ich vermute, die IDE hat den Fehler "Suspicious method call; should probably call "draw" rather than "onDraw" " gemeldet. Weshalb über der Klasse GameView "@SuppressLint("WrongCall")" steht. Warum nicht den Vorschlag befolgen, und onDraw(...) in draw() ändern.
 
Danke, genau das war es :D
Und danke für den Hinweis, ich werd ihm das mal sagen.
 

naja.. das Problem fängt ja wie geschrieben schon hiermit an:
@SuppressLint("WrongCall")

Irgendwelche Warnungen zu unterdrücken ist meisten der falsche weg.
Das kann man machen, wenn man wirklich weiß das die Warnung hier falsch ist.
 
Zurück
Oben Unten