SurfaceView Callback wird nie aufgerufen

  • Antworten:2
  • Bentwortet
Mac Systems
  • Forum-Beiträge: 1.727

07.01.2011, 18:02:14 via Website

Hallo,

irgendwie stehe ich mal wieder auf dem Schlauch dabei erscheint der Code recht einfach zu sein:


Ich habe einen CustomView (HandView) welchen ich mittels eine Threads triggern will, hierfür scheint der SurfaceView geeignet zu sein. Meine boolean variablen sind volatile nur um hier Missverständnisse auszuschließen!

Der Constructor sieht so aus:
1private volatile boolean isRunning = false;
2
3 private volatile boolean hasSurface = false;
4
5 public HandView(final Context context, final AttributeSet attrs)
6 {
7 super(context, attrs);
8
9 holder = getHolder();
10 holder.addCallback(this);

Dieser wird auch durchlaufen! Weiter unten erzeuge und starte Ich einen Thread:

1private void startThread()
2 {
3 isRunning = true;
4
5 trigger = new Runnable()
6 {
7
8 @Override
9 public final void run()
10 {
11 Log.d(LOG_TAG, "run entered");
12 while (!hasSurface && isRunning)
13 {
14 try
15 {
16 Thread.sleep(50L);
17 }
18 catch (InterruptedException e)
19 {
20 Log.e(LOG_TAG, "Problem while wait", e);
21 }
22 }
23 Log.d(LOG_TAG, "init finised");
24 while (hasSurface && isRunning)
25 {
26 final Canvas canvas = holder.lockCanvas();
27 System.out.println("draw loop");
28 try
29 {
30 synchronized (holder)
31 {
32 draw(canvas);
33 }
34 }
35 catch (Exception e)
36 {
37 Log.e(LOG_TAG, "Problem while draw", e);
38 }
39 finally
40 {
41 if (canvas != null)
42 {
43 holder.unlockCanvasAndPost(canvas);
44 }
45 }
46
47 }
48 Log.d(LOG_TAG, "thread finished.");
49 }
50 };
51 final Thread t = new Thread(trigger);
52 t.start();
53 }


Ich sehe ebenfalls das die run() Methode den ersten Log eintrag ausgibt und wartet das der SurfaceViewCallback#surfaceCreated aufgerufen wird:

1@Override
2 public void surfaceCreated(SurfaceHolder holder)
3 {
4 Log.d(LOG_TAG, "surfaceCreated");
5 hasSurface = true;
6 }

Leider findet das nie statt und mein Thread wartet ewig. Ich sehe nie den Log Eintrag "surfaceCreated".

Hat jemand noch eine Idee wieso das so ist?

mfg,
Mac

Windmate HD, See you @ IO 14 , Worked on Wundercar, Glass V3, LG G Watch, Moto 360, Android TV

Antworten
Mac Systems
  • Forum-Beiträge: 1.727

08.01.2011, 14:50:45 via Website

Hallo,

inzwischen rennt mein Thread der den SurfaceView refreshen soll. Allerdings ist SurfaceView weiterhin eine Klasse die sich sehr merkwürdig verhält:

Ich habe in der onDraw Methode meines View ein Sysout platziert, die Ausgaben sehe Ich auch. Ebenfall Zeichnet sich das View anfangs einmalig selbst.
Danach allerdings werden die aufrufe mittels Thread und Canvas ignoriert, als ob hier ein Canvas benutzt wird der nicht gezeigt wird, dennoch aber gültige
Dimensionen hat:

1@Override
2 public void onDraw(final Canvas canvas)
3 {
4 super.onDraw(canvas);
5 System.out.println("draw");
6 final int N = boundingBoxes.size();
7 for (int i = 0; i < N; i++)
8 {
9 final MatchBoundingBox rect = boundingBoxes.get(i);
10 rect.draw(canvas);
11 }
12 // finally draw the overlay image
13 canvas.drawBitmap(overlayBitmap, 0, 0, null);
14
15 final float density = getResources().getDisplayMetrics().density;
16 float densityX = dip_point.x * density;
17 float densityY = dip_point.y * density;
18
19 final float radius = 20 * density;// DIP
20 canvas.drawCircle(densityX, densityY, radius, new Paint());
21 }
So langsam aber sicher gehen mir die Ideen aus.
Hier mein Runnable, die ClipBound etc sehen alle gut aus.

1final Runnable runnable = new Runnable()
2 {
3 @Override
4 public final void run()
5 {
6 Log.d(LOG_TAG, "run entered");
7 while (hasSurface && isRunning)
8 {
9 final Canvas canvas = holder.lockCanvas(null);
10
11// if(canvas == null)
12 {
13 Log.d(LOG_TAG,"canvas.height:"+canvas.getHeight());
14 Log.d(LOG_TAG,"canvas.width:"+canvas.getWidth());
15 Log.d(LOG_TAG,"canvas clip :"+canvas.getClipBounds().toShortString());
16 }
17
18 try
19 {
20 synchronized (holder)
21 {
22 HandView.this.onDraw(canvas);
23 }
24 }
25 catch (Exception e)
26 {
27 Log.e(LOG_TAG, "Problem while draw", e);
28 }
29 finally
30 {
31 if (canvas != null)
32 {
33 holder.unlockCanvasAndPost(canvas);
34 }
35 }
36
37 }
38 Log.d(LOG_TAG, "thread finished.");
39 }
40 };

Hilfe an der Stelle wäre echt nett,
Mac

— geändert am 08.01.2011, 14:51:36

Windmate HD, See you @ IO 14 , Worked on Wundercar, Glass V3, LG G Watch, Moto 360, Android TV

Antworten
Mac Systems
  • Forum-Beiträge: 1.727

09.01.2011, 15:42:09 via Website

Gelöst: Merke: Niemals ein android:backround="#abc" im XML hinterlegen. Irgendwo beeinflusst das dass Zeichnen, selbst wenn kein super.onDraw aufgerufen wird.

Windmate HD, See you @ IO 14 , Worked on Wundercar, Glass V3, LG G Watch, Moto 360, Android TV

Antworten