Bild offenbar zu groß um geladen zu werden?

Robokopp

Bekanntes Mitglied
Hallo,

ich hab schon in einem anderen Thread gefragt, wie man unter Android am geschicktesten Bilder läd.
Das hat sich jetzt offenbar erledigt, denn ich habe versucht, das Standart Applogo von Android zu laden mit
Bitmap _scratch = BitmapFactory.decodeResource(getResources(),R.Drawable.....)

Das funktioniert tadellos.Aber sobald ich versuche, meine eigenen Png´s zu laden, gibt es eine NullpointerException(warum auch immer??), obwohl die bilder im selben Ordner wie das Applogo liegen.

Kann es sein dass die Bilder einfach zu groß sind um als Bitmap geladen zu werden?Aber warum dann die Nullpointer?
 
Das File liegt ja offensichtlich im Resource-Verzeichnis. Auch im richtigen?

res/drawable-mdpi/my_icon.png // bitmap for medium density
res/drawable-hdpi/my_icon.png // bitmap for high density
res/drawable-xhdpi/my_icon.png // bitmap for extra high density

Siehe hier
 
Die Files haben alle die selbe Größe und liegen im hdpi Ordner.
Mittlerweile schaffe ich es, das 1 Bild geladen werden kann. Sobald ich mehrere lade, kommt wieder der Fehler
 
konzentriert auf
> Aber warum dann die Nullpointer?

wenn ein Bild nicht geladen werden kann oder sonst eine Aktion auf der Welt, die wie hier ein Objekt zurückgibt, scheitert,
musst du eben mit den drei in der Computer-Natur vorgesehenen Möglichkeiten rechnen:
- einer Exception,
- Rückgabe eines kaputten Objektes
- oder eben Rückgabe von null
(Zusatz mag noch Beschändigung des Restprogramms/ sonstigen Speichers sein, so dass z.B. gar keine Bilder mehr geladen werden)
 
konzentriert auf
> Aber warum dann die Nullpointer?

wenn ein Bild nicht geladen werden kann oder sonst eine Aktion auf der Welt, die wie hier ein Objekt zurückgibt, scheitert,
musst du eben mit den drei in der Computer-Natur vorgesehenen Möglichkeiten rechnen:
- einer Exception,
- Rückgabe eines kaputten Objektes
- oder eben Rückgabe von null
(Zusatz mag noch Beschändigung des Restprogramms/ sonstigen Speichers sein, so dass z.B. gar keine Bilder mehr geladen werden)

Okay. Dann verstehe ich dennoch nicht warum die Bilder nicht geladen werden können.
Sie sind alle vorhanden.
Gestern hab ich es sogar einmal geschafft, dass zwei bilder gleichzeitig geladen wurden. Manchmal stürzt die App ab, ein anderes mal dann wieder nicht.

Ein try{} finalize{} würde daran wahrscheinlich auch nichts ändern oder?
 
sofern du bisher keine richtigen Fehlermeldungen zu lesen bekommen hast kann sich das schon lohnen, um Exceptions oder gar Throwables zu fangen und zu loggen,
wer weiß wo du sonst Fehler nicht ausgibst und die NullPointerException erst ganz woanders auftritt

was genau bei den Bildern passiert kann ich persönlich nicht sagen,
ist das 'Standart Applogo' auch ein PNG? ähnliche Größe? kannst du das 3x gleichzeitig laden (evtl. auf 3 Dateien kopiert)?
wenn du das mit einem Bildprogramm öffnest und einen Pixel änderst und 3x abspeicherst, geht es dann noch?
auch bei mehreren Änderungen bis hin zu deinem Bild, wann kommt der Fehler?
 
sofern du bisher keine richtigen Fehlermeldungen zu lesen bekommen hast kann sich das schon lohnen, um Exceptions oder gar Throwables zu fangen und zu loggen,
wer weiß wo du sonst Fehler nicht ausgibst und die NullPointerException erst ganz woanders auftritt

was genau bei den Bildern passiert kann ich persönlich nicht sagen,
ist das 'Standart Applogo' auch ein PNG? ähnliche Größe? kannst du das 3x gleichzeitig laden (evtl. auf 3 Dateien kopiert)?
wenn du das mit einem Bildprogramm öffnest und einen Pixel änderst und 3x abspeicherst, geht es dann noch?
auch bei mehreren Änderungen bis hin zu deinem Bild, wann kommt der Fehler?
Ich hab weitestgehend png´s. die Jpg´s funktionieren nach meiner Erfahrung garnicht, weswegen ich die auch immer weglasse.
Ich hab hier mal die aktuelle Logausgabe:

Java:
04-12 13:43:29.135: E/AndroidRuntime(28398): FATAL EXCEPTION: main
04-12 13:43:29.135: E/AndroidRuntime(28398): java.lang.NullPointerException
04-12 13:43:29.135: E/AndroidRuntime(28398): 	at de.android.slicytowermobilelevelsystem.GameActivity.onDraw(GameActivity.java:163)
04-12 13:43:29.135: E/AndroidRuntime(28398): 	at android.view.View.draw(View.java:6933)
04-12 13:43:29.135: E/AndroidRuntime(28398): 	at android.view.ViewGroup.drawChild(ViewGroup.java:1646)
04-12 13:43:29.135: E/AndroidRuntime(28398): 	at android.view.ViewGroup.dispatchDraw(ViewGroup.java:1373)
04-12 13:43:29.135: E/AndroidRuntime(28398): 	at android.view.View.draw(View.java:6936)
04-12 13:43:29.135: E/AndroidRuntime(28398): 	at android.widget.FrameLayout.draw(FrameLayout.java:357)
04-12 13:43:29.135: E/AndroidRuntime(28398): 	at android.view.ViewGroup.drawChild(ViewGroup.java:1646)
04-12 13:43:29.135: E/AndroidRuntime(28398): 	at android.view.ViewGroup.dispatchDraw(ViewGroup.java:1373)
04-12 13:43:29.135: E/AndroidRuntime(28398): 	at android.view.View.draw(View.java:6936)
04-12 13:43:29.135: E/AndroidRuntime(28398): 	at android.widget.FrameLayout.draw(FrameLayout.java:357)
04-12 13:43:29.135: E/AndroidRuntime(28398): 	at com.android.internal.policy.impl.PhoneWindow$DecorView.draw(PhoneWindow.java:1917)
04-12 13:43:29.135: E/AndroidRuntime(28398): 	at android.view.ViewRoot.draw(ViewRoot.java:1530)
04-12 13:43:29.135: E/AndroidRuntime(28398): 	at android.view.ViewRoot.performTraversals(ViewRoot.java:1266)
04-12 13:43:29.135: E/AndroidRuntime(28398): 	at android.view.ViewRoot.handleMessage(ViewRoot.java:1868)
04-12 13:43:29.135: E/AndroidRuntime(28398): 	at android.os.Handler.dispatchMessage(Handler.java:99)
04-12 13:43:29.135: E/AndroidRuntime(28398): 	at android.os.Looper.loop(Looper.java:130)
04-12 13:43:29.135: E/AndroidRuntime(28398): 	at android.app.ActivityThread.main(ActivityThread.java:3691)
04-12 13:43:29.135: E/AndroidRuntime(28398): 	at java.lang.reflect.Method.invokeNative(Native Method)
04-12 13:43:29.135: E/AndroidRuntime(28398): 	at java.lang.reflect.Method.invoke(Method.java:507)
04-12 13:43:29.135: E/AndroidRuntime(28398): 	at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:907)
04-12 13:43:29.135: E/AndroidRuntime(28398): 	at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:665)
04-12 13:43:29.135: E/AndroidRuntime(28398): 	at dalvik.system.NativeStart.main(Native Method)


Ich hab hier nochmal einen Ausschnitt aus der Block-Klasse.
Ich übergebe beim Erstellen der Blöcke über den Konstruktor die Bitmap:
In der Mainklasse wird dann jedes Objekt gezeichnet, genau wie bei Quaxi´s Tutorial
Java:
	public class Block extends Sprite {
	
	private Bitmap bitmap=null;



	public Block(int id, double x, double y, int width, int height, Bitmap scratch) {
		super(id, x, y, width, height, scratch);
		matrix = new Matrix();
		matrix.postScale(width, height);
		this.bitmap = Bitmap.createScaledBitmap(scratch, width, height, true);

		modulo = id % 10;
		if (modulo == 0) {
			zufall = (int) (Math.random() * 2);

		}
	}



	@Override
	public void onDraw(Canvas canvas){

		canvas.drawBitmap(bitmap, (int)this.getX(), (int)this.getY(), null);
		
		
	}

Ich dachte mir halt, dass er eventuell versucht zu zeichnen oder die Logik auszuführen, bevor die Bilder geladen wurden und die Blöcke erstellt wurden, aber das ist erst der Fall, sobald alles geladen wurde..
 
Gut, war nur so eine Idee, da in R.java alle Resource-Namen in Variablen-Namen verwendet werden, was entsprechende Konventionen mit sich bringt, was aber wiederum zugegebenermaßen dann eher zu einer Compiler-Exception geführt hätte.

Zu dem Beispiel: Kann es sein, dass Du den Konstruktor der Super-Klasse aufrufst?
 
Gut, war nur so eine Idee, da in R.java alle Resource-Namen in Variablen-Namen verwendet werden, was entsprechende Konventionen mit sich bringt, was aber wiederum zugegebenermaßen dann eher zu einer Compiler-Exception geführt hätte.

Zu dem Beispiel: Kann es sein, dass Du den Konstruktor der Super-Klasse aufrufst?


Der Konstruktor wird so aufgerufen wie er da steht. Weiß nicht so recht auf was du hinaus willst
 
Ich meine damit die Instanziierung von Block.

Das war es auf jeden Fall nicht, hab den Fehler nun gefunden, aber das müsst ihr mir erklären, weil er hat absolut nichts mit den Bildern zu tun 😀

und zwar ist es so, dass ich ein Scoreboard hab, welches daran Schuld war:

Java:
	@Override
	protected void onDraw(Canvas canvas) {

		if (!paused&&created) {

			canvas.drawColor(Color.LTGRAY);
			for (ListIterator<Sprite> it = blocks.listIterator(); it.hasNext();) {
				Sprite r = it.next();
				if (r.getY() > -blockheight * 2
						&& r.getY() < displayH + blockheight * 5) {
					if(!r.isRemoveable()){
						r.onDraw(canvas);	
					}
				}

			}

			for (ListIterator<Sprite> it = players.listIterator(); it.hasNext();) {
				Sprite r = it.next();
				r.onDraw(canvas);
			}
			
			
		}
//		scoreboard.onDraw(canvas);
		invalidate();

	}
Wie man sieht, bleibt es unbeeinflusst durch die Booleans paused und created, wird also direkt beim Start gezeichnet.
Jedoch enthält es keine Bilder, sondern eben nur Werte.

Ach man, jetzt bin ich glücklich 😀
Hab grad mal alle Bilder auf einmal geladen - funzt 😉
 
Zuletzt bearbeitet:

Zurück
Oben