Android MessageBox

Mathias1000

Mitglied
Ich will eine MessageBox, so wie unter Windows, nun habe ich folgendes versucht:

Bei InputStreamReader funktioniert es mit dem MeinContext, die Daten werden ohne Fehler eingelesen.

Aber bei AlertDialog.Builder geht der MeinContext nicht mehr.

Was mache ich falsch ?


Java:
class VectorBuffer {

	public FloatBuffer Vector;
	public FloatBuffer Normal;
	public int VertexCount;
	public float[] Color;

	static int anzVertex;	
	
	public static void MessageBox(String Msg, String Title) {
		AlertDialog.Builder dlgAlert = new AlertDialog.Builder(OpenGLES20Activity.MeinContext);

		dlgAlert.setMessage("Meldung");
		dlgAlert.setTitle("Titel");
		dlgAlert.setPositiveButton("OK", null);
		dlgAlert.setCancelable(true);
		dlgAlert.create().show();
	}	

	private float[] ReadVector(String Datei) {
		int i = 0;
		float[] vec = null;
		try {
			BufferedReader f = new BufferedReader(new InputStreamReader(OpenGLES20Activity.MeinContext.getAssets().open(Datei)));
			String s = f.readLine();
			anzVertex = Integer.parseInt(s);
			vec = new float[anzVertex];
			while ((s = f.readLine()) != null) {
				float fl = Float.parseFloat(s);
				vec[i] = fl;
				i++;
			}
			f.close();
		} catch (IOException e) {
			Log.e(null, "Fehler beim Lesen der Datei", e);
		}

		MessageBox("Hello World", "Hello world");
		return vec;
	}

	private FloatBuffer GetVectorBuffer(String Datei) {

		float[] vectoren = ReadVector(Datei);

		ByteBuffer bb;
		FloatBuffer VectorBuffer;
		bb = ByteBuffer.allocateDirect(vectoren.length * 4);
		bb.order(ByteOrder.nativeOrder());
		VectorBuffer = bb.asFloatBuffer();
		VectorBuffer.put(vectoren);
		VectorBuffer.position(0);

		return VectorBuffer;
	}

	public VectorBuffer(String Datei, float[] col) {
		Vector = GetVectorBuffer(Datei + "Vectoren.txt");
		Normal = GetVectorBuffer(Datei + "Normale.txt");
		VertexCount = anzVertex / 3;
		Color = col;
	}
}
Hier wird MeinContext mit einem Wert beschrieben.
Java:
	public MyGLSurfaceView(Context context) {
		super(context);
		
		OpenGLES20Activity.MeinContext = context;
Und hir ist er deklariert.
Java:
public class OpenGLES20Activity extends Activity {

	private GLSurfaceView mGLView;
	
	
	static Context MeinContext;
 
Zuletzt bearbeitet:

anti-held

Bekanntes Mitglied
Füge doch bitte in die [c]onCreate[/c] Methode deiner Activity die Zeile

Java:
MeinContext = getContext();

ein und setze es nicht in deiner SurfaceView (was auch immer die ist).

P.S. Bitte schreibe Methoden und Variablennamen klein.
 

Mathias1000

Mitglied
Füge doch bitte in die onCreate Methode deiner Activity die Zeile
Dies habe ich jetzt gemacht, aber der Fehler ist immer noch der selbe.
getContext hat Eclipse nicht gefressen, dafür hat es mit getBaseContext vorgeschlagen.

Java:
public class OpenGLES20Activity extends Activity {

	private GLSurfaceView mGLView;	
	
	static Context MeinContext;
	
	@Override
	public void onCreate(Bundle savedInstanceState) {
		MeinContext = getBaseContext();
		super.onCreate(savedInstanceState);

		// Create a GLSurfaceView instance and set it
		// as the ContentView for this Activity
		mGLView = new MyGLSurfaceView(this);
		setContentView(mGLView);		
	}

P.S. Bitte schreibe Methoden und Variablennamen klein.
Was hat dies für ein Vorteil ?
 
Zuletzt bearbeitet:

anti-held

Bekanntes Mitglied
Dass Methoden und Variablen kleingeschrieben werden und Klassen groß ist einfach eine Java-Convention.


Ich meinte getApplicationContext() (konnte es leider nicht testen)
 

anti-held

Bekanntes Mitglied
Der Kontext für die MessageBox muss die der gerade aktiven Activity sein.
Für das Auslesen der Datei ist es im Grunde egal welcher Kontext verwendet wird.

Versuche es mal folgendermaßen in deiner OpenGLES20Activity:

Java:
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
         // Create a GLSurfaceView instance and set it
        // as the ContentView for this Activity
        mGLView = new MyGLSurfaceView(this);
        setContentView(mGLView);
        MeinContext = this;
    }
 

Mathias1000

Mitglied
Versuche es mal folgendermaßen in deiner OpenGLES20Activity:
Geht auch nicht.

Ich habe noch folgendes versucht:

Java:
class MessageBox {
	
	public MessageBox(String Msg, String Title) {
		AlertDialog.Builder dlgAlert = new AlertDialog.Builder(OpenGLES20Activity.MeinContext);
		dlgAlert.setMessage(Msg);
		dlgAlert.setTitle(Title);
		dlgAlert.setPositiveButton("OK", null);
		dlgAlert.setCancelable(true);
		dlgAlert.create().show();
	}
}
Da geht es:
Java:
public class OpenGLES20Activity extends Activity {

	private GLSurfaceView mGLView;

	static Context MeinContext;

	@Override
	public void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);

		mGLView = new MyGLSurfaceView(this);
		setContentView(mGLView);
		MeinContext = this;
		
		new MessageBox("Hello World", "Hello world");	// Hier geht es.	
	}
Hier geht es nicht mehr:
Java:
class VectorBuffer {

	public FloatBuffer Vector;
	public FloatBuffer Normal;
	public int VertexCount;
	public float[] Color;

	static int anzVertex;

	private float[] ReadVector(String Datei) {

		int i = 0;
		float[] vec = null;
		try {
			BufferedReader f = new BufferedReader(new InputStreamReader(OpenGLES20Activity.MeinContext.getAssets().open(Datei)));
			String s = f.readLine();
			anzVertex = Integer.parseInt(s);
			vec = new float[anzVertex];
			while ((s = f.readLine()) != null) {
				float fl = Float.parseFloat(s);
				vec[i] = fl;
				i++;
			}
			f.close();
		} catch (IOException e) {
			Log.e(null, "Fehler beim Lesen der Datei", e);
		}
		
		new MessageBox("Datei ohne Fehler gelesen", "Titel"); // Da geht es nicht mehr.
		return vec;
	}

	private FloatBuffer GetVectorBuffer(String Datei) {
...
 
Zuletzt bearbeitet:

anti-held

Bekanntes Mitglied
Und wo erzeugst du denn das VectorBuffer Objekt und rufst die Methode auf?

Auch interessant wäre die Fehlermeldung.
 
Zuletzt bearbeitet:

Mathias1000

Mitglied
Java:
public class Triangle {

	private float RohrColor[] = { 0.6f, 0.6f, 1.0f, 1.0f };
	private float SchwimmerColor[] = { 0.7f, 0.7f, 0.7f, 1.0f };
	private float SchnittColor[] = { 1.0f, 0.0f, 0.0f, 1.0f };
	private float WasserColor[] = { 0.0f, 0.0f, 1.0f, 0.5f };

	private VectorBuffer FluegeliBuffer = new VectorBuffer("Fluegeli", RohrColor);
	private VectorBuffer SchwimmerBuffer = new VectorBuffer("Schwimmer", SchwimmerColor);
	private VectorBuffer SchwimmerSchnittBuffer = new VectorBuffer("SchwimmerSchnitt", 
SchwimmerColor);
....

Auch interessant wäre die Fehlermeldung.
Code:
Unfortunately, Weka Niveau-Anzeiger has stopped.
 

Mathias1000

Mitglied
Hier:
Java:
public class MyGLRenderer implements GLSurfaceView.Renderer {

	private Triangle mTriangle;

	private final float[] mMVPMatrix = new float[16];
	private final float[] mProjectionMatrix = new float[16];
	private final float[] mViewMatrix = new float[16];
	private final float[] mRotationMatrix = new float[16];

	static public float mAngle;

	@Override
	public void onSurfaceCreated(GL10 unused, EGLConfig config) {
		mTriangle = new Triangle();
	}

	@Override
	public void onDrawFrame(GL10 unused) {
		float[] scratch = new float[16];

		Matrix.setLookAtM(mViewMatrix, 0, 0, 0, 5, 0f, 0f, 0f, 0f, 1.0f, 0.0f);
		Matrix.multiplyMM(mMVPMatrix, 0, mProjectionMatrix, 0, mViewMatrix, 0);
		Matrix.setRotateM(mRotationMatrix, 0, mAngle, 0.0f, 1.0f, 0.0f);
		Matrix.multiplyMM(scratch, 0, mMVPMatrix, 0, mRotationMatrix, 0);
		mTriangle.Render(scratch);
	}

	@Override
	public void onSurfaceChanged(GL10 unused, int width, int height) {
		GLES20.glViewport(0, 0, width, height);
		float ratio = (float) width / height;
		Matrix.frustumM(mProjectionMatrix, 0, -ratio, ratio, -1, 1, 3, 7);
	}
}
 

anti-held

Bekanntes Mitglied
Die Klasse Triangle wird initialisiert, wenn das erste Objekt vom Typ MyGlRenderer erstellt wird.

Wenn zu dieser Zeit jedoch die Variable MeinContext in der Klasse OpenGLES20Activity noch null ist, tritt eine NPE innerhalb des UI-Threads auf, die nicht abgefangen wird. Deshalb wird die App geschlossen -> Unfortunately, Weka Niveau-Anzeiger has stopped.
 

dzim

Top Contributor
Auf LogCat kannst du auch immer per [c]android.util.Log.<v|d|i|w|e|wtf>(tag, message[, throwable])[/c] etwas rausbringen - aber eben nicht auf den Bildschirm. Brauchst dann aber auch keinen Context...
 

dzim

Top Contributor
Vermiesen? Nein, eher nicht. Deine App läuft in einer Sandbox, wenn du da irgendwie Daten speichern willst, oder auf Hardware zugreifen möchtest, passiert das nun mal im Kontext deiner Anwendung. Und (von root mal abgesehen) es erlaubt dir, das die Daten deiner App auch vor anderen Anwendungen sicher sind.

Auf StackOverflow wurde die Frage, was denn ein Context überhaupt ist so beantwortet:
What is Context in Android? - Stack Overflow

Vielleicht solltest du dir aber auch die JavaDocs von Google einmal durchlesen:
Context | Android Developers
... und wenn du dabei bist, dann auch gleich von Application
Application | Android Developers
... und Activity
Activity | Android Developers
...


Das alles sind Subklassen und für die Steuerung deiner Anwendung zuständig. Der Context ist also nicht da, um dich zu ärgern, sondern um im Kontext deiner Anwendung dir den Zugriff auf alle Ressourcen, die du so brauchen könntest, zu ermöglichen!
 

Mathias1000

Mitglied
Ich habe noch was anderes probiert, geht leider auch nur bei OnCrrate. :(
Java:
public class OpenGLES20Activity extends Activity {

	private GLSurfaceView mGLView;

	static Context MeinContext;
	
	public static void MessageBox(String Msg, String Title) {
		AlertDialog.Builder dlgAlert = new AlertDialog.Builder(MeinContext);
		dlgAlert.setMessage(Msg);
		dlgAlert.setTitle(Title);
		dlgAlert.setPositiveButton("OK", null);
		dlgAlert.setCancelable(true);
		dlgAlert.create().show();
	}
	
	@Override
	public void onCreate(Bundle savedInstanceState) {
		MeinContext = this;
		super.onCreate(savedInstanceState);

		mGLView = new MyGLSurfaceView(this);
		setContentView(mGLView);
		
		MessageBox("Hello World", "Hello world");	// Geht ohne Probleme	
	}
Java:
	private float[] ReadVector(String Datei) {

		int i = 0;
		float[] vec = null;
		try {
			BufferedReader f = new BufferedReader(new InputStreamReader(OpenGLES20Activity.MeinContext.getAssets().open(Datei)));
			String s = f.readLine();
			anzVertex = Integer.parseInt(s);
			vec = new float[anzVertex];
			while ((s = f.readLine()) != null) {
				float fl = Float.parseFloat(s);
				vec[i] = fl;
				i++;
			}
			f.close();
		} catch (IOException e) {
			Log.e(null, "Fehler beim Lesen der Datei", e);
		}
		
		OpenGLES20Activity.MessageBox("Datei ohne Fehler gelesen", "Titel");// Hier kommt wie der Fehler		

		return vec;
	}
 

dzim

Top Contributor
Argh!

Du bist aber auch ein beratungsresitenter Fall, oder??? Oder einfach noch nicht lang genug bei Java dabei.

Zum Einen: Das ist Java und nicht .NET! Schreibe Klassen-Variablen und Methodennamen NICHT gross. Es macht es (etwas) schwerer deinen Code zu lesen, weil er nicht "wie gewohnt" aussieht...
Und gewöhn' dir bloss keinen Denglischen Code an. Schreib gleich ganz auf English, dann bleibt es wenigstens in einer Sprache...

Zum Anderen: Hast du dir jemals angeschaut, wie der Lebenzyklus der Activity aussieht? Lies dir die Devloper-Seite von Android mal ganz in Ruhe durch!
Vor dem Aufruf deiner #readVector()-Methode wurde wahrscheinlich die OpenGLES20Activity noch nie aufgerufen und somit ist die Activty natürlich nicht vorhanden --> NullPointerException
Wenn du sie schon mal irgendwann offen hattest, sie aber nicht mehr angezeigt wird, gibt es vermutlich andere Exceptions - eben weil die Activity nicht mehr aktiv ist.

Lösung: Übergib deiner #messageBox()-Methode einen Context und kümmere dich beim aufrufen darum, das einer da ist. Das ist eigentlich keine Hexerei...
 

dzim

Top Contributor
Nur woher soll ich den Context nehmen und nicht stehlen ?
Noch einmal: Deine Anwendung läuft IMMER in einem Context. Oder in einer davon abgeleiteten Klasse. Punkt.

Wo rufst du #readVector() auf? Diese Klasse möchte ich (in Auszügen, also die Deklaration) einmal sehen. Wenn es "nur" eine Hilfsklasse (z.B. so etwas wie Utils ist, wonach es bei dir aber nicht aussieht, dann die Klasse, die wiederum diese aufruft). Beziehungsweise geht es mir um die UI-Klasse, den Service, ... die diese Methode verwendet. Zeige mir das und vielleicht ist dir dann zu helfen.
 

Mathias1000

Mitglied
Ich habe es jetzt mit einer eigenen Classe für MessageBox probiert, auch ohne Erfolg.

Ich hänge mal den ganzen QuellText an den Anhang.

In OpenGLES20Activity.java Zeile 19 geht es.
In MyGLSurfaceView.java Zeile 35 geht es.

In Triangle.java Zeile 202 geht es nicht.
 

Anhänge

  • opengl.zip
    6,5 KB · Aufrufe: 3
Zuletzt bearbeitet:

dzim

Top Contributor
Was ist das für ein Konstrukt?
Java:
VectorBuffer = bb.asFloatBuffer();
Wo ist da die Zuweisung für eine Variable?

Warum schreibst du Variablen-Namen immer (noch) gross? Kein C#!!!

Die Datei heisst Triangle.java - die Klasse dazu musste ich erst mal suchen...
Java:
package opengl;
// package ist in java meist etwas mehr: "<com|de|ch|...>.<autor|firma|...>.programmname[.*] oder so
// deine Variante ist wieder eher C#-Like

// imports

class VectorBuffer {
// ...
}

public class Triangle {
// ...
}
Ich glaube mich zwar auch zu erinnern, dass das erlaubt ist, aber es ist mehr als ungewöhlich. In der Regel bekommt jede Klasse seine eigene Datei, es sei denn, sie wird wirklich nur lokal benutzt, ist sehr klein oder ein Interface (meist Listener) oder eine Enumeration (z.B. ein Dateitype, etc.), wobei die inneren Interfaces oder Enums auch nicht von allen gern gesehen werden.

Also mal einfach eine ganz andere Frage: Kompiliert das Teil überhaupt?????

Aber machen wir es kurz: Deinem etwas wirren Code, der ja sogar eine Activity (also für Android den Start deiner UI) enthält, entnehme ich, dass du die Triangle-Klasse von dort irgendwo aufrufst. Damit hast du dort auch einen Context (in der Activity wäre das this, im View z.B. via #getContext()). Jetzt musst du nur deinen Konstruktor erweitern, dass du ihn übergeben kannst und dann steht er dir in dieser Klasse auch zur Verfügung.

BTW: Biste ein Eidgenosse? Einige Begriffe lassen es vermuten... ;-)
 

Mathias1000

Mitglied
Also mal einfach eine ganz andere Frage: Kompiliert das Teil überhaupt?????
Ja das macht er ohne Probleme, die App läuft dann bis zum fehlerhaften Messagebox-Aufruf.

Der Befehl wird nicht erkannt, er schlägt mir getBaseContext vor.

Jetzt musst du nur deinen Konstruktor erweitern, dass du ihn übergeben kannst und dann steht er dir in dieser Klasse auch zur Verfügung.
Dummerweise steht der context bei MyGLRenderer schon nicht mehr zu Verfügung. Auch hat es in MyGLRenderer keinen Konstructor. In MyGLRenderer wird mTriangle erzeugt.

Ist das normal, das Android immer den context wechselt ?


Meine App habe ich auf diese Sample aufgebaut: Displaying Graphics with OpenGL ES | Android Developers

BTW: Biste ein Eidgenosse? Einige Begriffe lassen es vermuten...
Ja das bin ich, somit ist Hochdeutsch fast eine Fremdsprache für mich. :D;)

PS: Das ist meine erste App die ich schreibe, vielleicht habe ich mich ein bischen übernommen ;)
 
Zuletzt bearbeitet:

dzim

Top Contributor
Der BaseContext ist auch gut. Es gibt dann noch sozusagen "Sub-Contexte", die dann Activity-spezifisch sind. Der BaseContext bleibt also, während der spezifische abhängig von der angezeigten Activity durchaus wechseln kann.

Zum Kontext...

Das hier ist deine eigentliche Oberfläche, das ist der Context, in dem dein OpenGL-Teil läuft.
Dazu wird der View MyGLSurfaceView angelegt und als alleiniger Inhalt der Activity gesetzt - hier könnten theoretisch auch noch mehr sein und dein OpenGL-Teil wäre dann nur ein kleines Rädchen im Getriebe.
Java:
public class OpenGLES20Activity extends Activity {

	private GLSurfaceView mGLView;

	@Override
	public void onCreate(Bundle savedInstanceState) {
		MessageBox.context = this;
		super.onCreate(savedInstanceState);

		mGLView = new MyGLSurfaceView(this);
		setContentView(mGLView);
		
		MessageBox.MessageBox("Hello World", "Hello world");	// geht	
	}

	@Override
	protected void onPause() {
		super.onPause();

		mGLView.onPause();
	}

	@Override
	protected void onResume() {
		super.onResume();
	
		mGLView.onResume();
	}

}

Und hier übergibst du die Referenz auf deine Activity an deinen View
Code:
mGLView = new MyGLSurfaceView(this);
.

Java:
public class MyGLSurfaceView extends GLSurfaceView {
	
	private final MyGLRenderer mRenderer;	
	
	public MyGLSurfaceView(Context context) {
		super(context);
		
		// Create an OpenGL ES 2.0 context.
		setEGLContextClientVersion(2);

		// Set the Renderer for drawing on the GLSurfaceView
		mRenderer = new MyGLRenderer();
		setRenderer(mRenderer);

		// Render the view only when there is a change in the drawing data
		setRenderMode(GLSurfaceView.RENDERMODE_WHEN_DIRTY);		
	}
// ...

und deine Zeile im Kontruktor
Code:
public MyGLSurfaceView(Context context) {
spiegelt das auch wieder.
Änder die Klasse also leicht ab, nach:
Java:
public class MyGLSurfaceView extends GLSurfaceView {
	
	private final MyGLRenderer mRenderer;	
	private final Context mContext;
	
	public MyGLSurfaceView(Context context) {
		super(context);
		this.mContext = context;
		
		// Create an OpenGL ES 2.0 context.
		setEGLContextClientVersion(2);

		// Set the Renderer for drawing on the GLSurfaceView
		mRenderer = new MyGLRenderer();
		setRenderer(mRenderer);

		// Render the view only when there is a change in the drawing data
		setRenderMode(GLSurfaceView.RENDERMODE_WHEN_DIRTY);		
	}
// ...
Das ist natürlich nur der Anfang - der Rest bleibt (erst einmal).

Jetzt füge in deinem MyGLRenderer einen Kontruktor hinzu:
Java:
	private final Context mContext;

	public MyGLRenderer(Context context) {
		this.mContext = context;
	}
...und schon steht dir hier der Context zur Verfügung.

Jetzt noch einmal MyGLSurfaceView anpassen:
Java:
public class MyGLSurfaceView extends GLSurfaceView {
	
	private final MyGLRenderer mRenderer;	
	private final Context mContext;
	
	public MyGLSurfaceView(Context context) {
		super(context);
		this.mContext = context;
		
		// Create an OpenGL ES 2.0 context.
		setEGLContextClientVersion(2);

		// Set the Renderer for drawing on the GLSurfaceView
		mRenderer = new MyGLRenderer(mContext);
		setRenderer(mRenderer);

		// Render the view only when there is a change in the drawing data
		setRenderMode(GLSurfaceView.RENDERMODE_WHEN_DIRTY);		
	}
// ...

Den Kontruktor-Teil machst du auch noch mal für die MessageBox.

Und ja: Ich denke, das war etwas zu viel für den Anfang! ;-)

Und was Schwyzerdytsch angeht: Ich habe mich allmählich daran gewöhn... Lebe und Arbeite in Rapperswil :p
 

Mathias1000

Mitglied
Danke erstmal.

Die MessageBox Class sieht jetzt so aus:
Java:
package opengl;

import android.app.AlertDialog;
import android.content.Context;

public class MessageBox {

	private final Context mContext;

	public MessageBox(Context context) {
		mContext = context;
	}

	public void Paint(String Msg, String Title) {
		AlertDialog.Builder dlgAlert = new AlertDialog.Builder(mContext);
		dlgAlert.setMessage(Msg);
		dlgAlert.setTitle(Title);
		dlgAlert.setPositiveButton("Schliessen", null);
		dlgAlert.setCancelable(true);
		dlgAlert.create().show();
	}
}
Bei onCreate funktioniert es:
Java:
	public void onCreate(Bundle savedInstanceState) {

		super.onCreate(savedInstanceState);

		mGLView = new MyGLSurfaceView(this);
		setContentView(mGLView);

		MessageBox mb = new MessageBox(this);
		mb.Paint("Hello World", "Hello world"); // geht
	}
Hier geht es auch:
Java:
	public MyGLSurfaceView(Context context) {
		super(context);
		this.mContext=context;
		
		
		MessageBox mb = new MessageBox(context);
		mb.Paint("Hello World", "Hello world"); // geht
....
Bei MyGLRenderer gibt es dies ersten Probleme:
Java:
public class MyGLRenderer implements GLSurfaceView.Renderer {

	private Triangle mTriangle;

	private final float[] mMVPMatrix = new float[16];
	private final float[] mProjectionMatrix = new float[16];
	private final float[] mViewMatrix = new float[16];
	private final float[] mRotationMatrix = new float[16];

	static public float mAngle;
	
	private final Context mContext;
	
	public MyGLRenderer(Context context){
		this.mContext=context;

		MessageBox mb = new MessageBox(mContext);
		mb.Paint("MyGLrenderer", "Hello world"); // geht ohne Probleme
	
	}

	@Override
	public void onSurfaceCreated(GL10 unused, EGLConfig config) {

		MessageBox mb = new MessageBox(mContext);
		
		// Diese Zeile geht nicht mehr, hier kommt die erste Schutzverletztung
		//mb.Paint("onSurfaceCreated", "Hello world"); // Fehler		
		
		mTriangle = new Triangle(mContext);
	}
Somit hat er den Context in MyGlrenderer vergesssen.


Und ja: Ich denke, das war etwas zu viel für den Anfang!
Ich programmiere seit Jahren Pascal/Delphi/Lazarus, Java ist Neuland für mich.
Wen Android dies nicht brauchen würde, würde ich auf Java verzichten.


Und was Schwyzerdytsch angeht: Ich habe mich allmählich daran gewöhn... Lebe und Arbeite in Rapperswil :p
Somit sind wir gar nicht weit auseinander, ich wohne in Bäretswil. :)
 
Zuletzt bearbeitet:

dzim

Top Contributor
Ach ja, Bäretswil ist ja tatsächlich nicht weit weg... Da sieht man es mal wieder: Die Welt ist klein... :-D

Was den Fehler angeht: schicke bitte mal den StackTrace, den Logcat dir ausgibt.
Und falls ich es noch nicht gefragt (oder schon wieder vergessen haben sollte): Welche IDE verwendest du eigentlich? Eclipse oder Android Studio?
 

Mathias1000

Mitglied
Was den Fehler angeht: schicke bitte mal den StackTrace, den Logcat dir ausgibt.
Das wäre die da:
Code:
05-13 15:47:44.860: D/libEGL(1402): loaded /system/lib/egl/libEGL_genymotion.so
05-13 15:47:44.860: D/(1402): HostConnection::get() New Host Connection established 0xb920d470, tid 1402
05-13 15:47:44.924: D/libEGL(1402): loaded /system/lib/egl/libGLESv1_CM_genymotion.so
05-13 15:47:44.924: D/libEGL(1402): loaded /system/lib/egl/libGLESv2_genymotion.so
05-13 15:47:44.956: W/EGL_genymotion(1402): eglSurfaceAttrib not implemented
05-13 15:47:44.956: E/OpenGLRenderer(1402): Getting MAX_TEXTURE_SIZE from GradienCache
05-13 15:47:44.960: E/OpenGLRenderer(1402): MAX_TEXTURE_SIZE: 16384
05-13 15:47:44.972: E/OpenGLRenderer(1402): Getting MAX_TEXTURE_SIZE from Caches::initConstraints()
05-13 15:47:44.972: E/OpenGLRenderer(1402): MAX_TEXTURE_SIZE: 16384
05-13 15:47:44.976: D/OpenGLRenderer(1402): Enabling debug mode 0
05-13 15:47:45.012: W/EGL_genymotion(1402): eglSurfaceAttrib not implemented
05-13 15:47:45.028: D/(1402): HostConnection::get() New Host Connection established 0xb9218fb8, tid 1417
05-13 15:47:45.068: W/dalvikvm(1402): threadid=11: thread exiting with uncaught exception (group=0xa4d1eb20)
05-13 15:47:45.068: E/AndroidRuntime(1402): FATAL EXCEPTION: GLThread 102
05-13 15:47:45.068: E/AndroidRuntime(1402): Process: com.example.android.opengl, PID: 1402
05-13 15:47:45.068: E/AndroidRuntime(1402): java.lang.RuntimeException: Can't create handler inside thread that has not called Looper.prepare()
05-13 15:47:45.068: E/AndroidRuntime(1402): 	at android.os.Handler.<init>(Handler.java:200)
05-13 15:47:45.068: E/AndroidRuntime(1402): 	at android.os.Handler.<init>(Handler.java:114)
05-13 15:47:45.068: E/AndroidRuntime(1402): 	at android.app.Dialog.<init>(Dialog.java:109)
05-13 15:47:45.068: E/AndroidRuntime(1402): 	at android.app.AlertDialog.<init>(AlertDialog.java:114)
05-13 15:47:45.068: E/AndroidRuntime(1402): 	at android.app.AlertDialog$Builder.create(AlertDialog.java:931)
05-13 15:47:45.068: E/AndroidRuntime(1402): 	at opengl.MessageBox.Paint(MessageBox.java:20)
05-13 15:47:45.068: E/AndroidRuntime(1402): 	at opengl.MyGLRenderer.onSurfaceCreated(MyGLRenderer.java:38)
05-13 15:47:45.068: E/AndroidRuntime(1402): 	at android.opengl.GLSurfaceView$GLThread.guardedRun(GLSurfaceView.java:1501)
05-13 15:47:45.068: E/AndroidRuntime(1402): 	at android.opengl.GLSurfaceView$GLThread.run(GLSurfaceView.java:1240)
05-13 15:47:45.560: E/WindowManager(1402): android.view.WindowLeaked: Activity opengl.OpenGLES20Activity has leaked window com.android.internal.policy.impl.PhoneWindow$DecorView{527e22d8 V.E..... R.....I. 0,0-456,152} that was originally added here
05-13 15:47:45.560: E/WindowManager(1402): 	at android.view.ViewRootImpl.<init>(ViewRootImpl.java:348)
05-13 15:47:45.560: E/WindowManager(1402): 	at android.view.WindowManagerGlobal.addView(WindowManagerGlobal.java:248)
05-13 15:47:45.560: E/WindowManager(1402): 	at android.view.WindowManagerImpl.addView(WindowManagerImpl.java:69)
05-13 15:47:45.560: E/WindowManager(1402): 	at android.app.Dialog.show(Dialog.java:286)
05-13 15:47:45.560: E/WindowManager(1402): 	at opengl.MessageBox.Paint(MessageBox.java:20)
05-13 15:47:45.560: E/WindowManager(1402): 	at opengl.MyGLRenderer.<init>(MyGLRenderer.java:28)
05-13 15:47:45.560: E/WindowManager(1402): 	at opengl.MyGLSurfaceView.<init>(MyGLSurfaceView.java:27)
05-13 15:47:45.560: E/WindowManager(1402): 	at opengl.OpenGLES20Activity.onCreate(OpenGLES20Activity.java:17)
05-13 15:47:45.560: E/WindowManager(1402): 	at android.app.Activity.performCreate(Activity.java:5231)
05-13 15:47:45.560: E/WindowManager(1402): 	at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1087)
05-13 15:47:45.560: E/WindowManager(1402): 	at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2159)
05-13 15:47:45.560: E/WindowManager(1402): 	at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2245)
05-13 15:47:45.560: E/WindowManager(1402): 	at android.app.ActivityThread.access$800(ActivityThread.java:135)
05-13 15:47:45.560: E/WindowManager(1402): 	at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1196)
05-13 15:47:45.560: E/WindowManager(1402): 	at android.os.Handler.dispatchMessage(Handler.java:102)
05-13 15:47:45.560: E/WindowManager(1402): 	at android.os.Looper.loop(Looper.java:136)
05-13 15:47:45.560: E/WindowManager(1402): 	at android.app.ActivityThread.main(ActivityThread.java:5017)
05-13 15:47:45.560: E/WindowManager(1402): 	at java.lang.reflect.Method.invokeNative(Native Method)
05-13 15:47:45.560: E/WindowManager(1402): 	at java.lang.reflect.Method.invoke(Method.java:515)
05-13 15:47:45.560: E/WindowManager(1402): 	at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:779)
05-13 15:47:45.560: E/WindowManager(1402): 	at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:595)
05-13 15:47:45.560: E/WindowManager(1402): 	at dalvik.system.NativeStart.main(Native Method)
05-13 15:47:47.040: I/Process(1402): Sending signal. PID: 1402 SIG: 9
Welche IDE verwendest du eigentlich?
Eclipse Luna 4.4


Ach ja, Bäretswil ist ja tatsächlich nicht weit weg... Da sieht man es mal wieder: Die Welt ist klein...
Aus diesem Grund war ich auch schon viel in Rappi. Früher als ich noch in Rüti wohnte war, es noch viel mehr. ;)
 

dzim

Top Contributor
Ah. Schau her, das hätte ich spontan an der Exception (ohne Google zu fragen) auch nicht gewusst. Danke für die Info!
 

anti-held

Bekanntes Mitglied
Eine Möglichkeit wäre vill statt dem Context die Activity zu übergeben und dann

Java:
runOnUiThread(new Runnable() {
    public void run() {
    	mb.Paint("onSurfaceCreated", "Hello world");
    }
});

darauf aufzurufen.
 

Mathias1000

Mitglied
Ich bin unterdessen ein grosser Schritt weiter gekommen, ich kann wenigstens Meldungen ausgeben, zwar nicht direkt auf dem Android-Gerät, dafür aber in LogCat.
:toll:
Code:
Log.e("Hello World", "Hello World");

Somit habe ich es jetzt viel einfacher Fehler in meiner App zu suchen.

Die Sache mit dem Context und der MessageBox währer trotzem interessant.

Vielen Dank an denen dir mir geholfen haben. :)


Mein nächstes Problem ist, eine Float-Array aus eine Binär-Datei auzulesen. Mit TextDateien klapp es.
Vieleicht komme ich mit Log.e weiter.
 
Zuletzt bearbeitet:

Neue Themen


Oben