View aus einem Thread aktualisieren funktioniert nicht.

  • Antworten:7
Phil
  • Forum-Beiträge: 40

28.02.2011, 15:23:09 via Website

Hallo,
ich habe mir eine GraphicsActivity angelegt. In dieser Activity habe ich meinen View (SampleView) angelegt.


Nun habe ich die onDraw Methode der View überschrieben und lasse mir ein Spielfeld auf meinen Bildschrim zeichnen. Funktioniert ohne Probleme.

Nun möchte ich gerne mit einem MainLoop (Thread) in einem bestimmten Intervall wieder die onDraw Methode ausführen.

Ich habe schon einiges versucht, leider bin ich noch nicht zum gewünschen Ergebnis gekommen.

Fall (1)
Ich habe mir mein View (SampleView) als Globale Variable in der Activity "gemerkt" und rufe in dem Thread "meinView.invalidate()" auf. -> Nichts passiert.

Fall (2)
Ich habe mir einen Handler angelegt und diesen an den Thread übergeben. Im Thread sende ich eine "emptyMessage()" an den Handler, welcher dann meinView.invalidate() aufruft. -> Nichts passiert.

Beende ich den MainLoop, werden nach und nach die gesendeten Events von dem Handler bearbeitet, aber eben nur zu spät.

Kann mir jemand vllt sagen, wie der richtige Weg aussieht, oder was ich falsch gemacht habe? Der MainLoop besitzt auch noch eine sleep ;o)

Vielen dank.
hibbert

Antworten
Phil
  • Forum-Beiträge: 40

28.02.2011, 15:48:30 via Website

Rafael K.
Ein bisschen Quellcode wäre gut ;)
Hach, da muss ich jetzt ja noch was für tun, ich dachte ihr könnt mir schon mein fertiges Programm geben :P Ne mal im ernst: Ich dachte, dass in diesem Fall die Beschreibung reicht, aber OK :)

Moment...

1public class MeinProgramm extends GraphicsActivity implements OnGestureListener {
2
3 private SampleView mView;
4 private boolean i_is_invalidating = false;
5 private Handler SomeHandler = null;
6 private clsMainLoop mainLoop;
7//...
8protected void onCreate(Bundle icicle) {
9 super.onCreate(icicle);
10 mView = new SampleView(this);
11 setContentView(mView);
12
13 SomeHandler = new Handler() {
14 public void handleMessage(Message msg) {
15 mView.invalidate();
16
17 }
18 };
19
20
21 mainLoop = new clsMainLoop();
22 mainLoop.setHandler(SomeHandler);
23 mainLoop.run();
24 }
25//...
26
27private class SampleView extends View {
28 private Paint mPaint = new Paint();
29 private Path i_raster = new Path();
30
31
32 public SampleView(Context context) {
33 super(context);
34//...
35}
36//...
37
38@Override
39protected void onDraw(Canvas canvas) {
40 Paint paint = mPaint;
41 i_is_invalidating = true;
42//...
43 i_is_invalidating = false;
44}
45
46public class clsMainLoop extends Thread {
47 private int t_sleeptime = 250;
48 private boolean run = true;
49 private Handler t_handler = null;
50
51 public void setHandler(Handler hand) {
52 t_handler = hand;
53 }
54
55 public void run() {
56 try {
57 while(run){
58 Thread.sleep(t_sleeptime);
59 if (!i_is_invalidationg){
60 t_handler.sendEmptyMessage(0);
61 mView.invalidate();
62 }
63 }
64 }catch (Exception ex) {
65 }
66
67 }
68 }

So ich hoffe, dass ich die wichtigsten Stellen kopiert habe und alles andere unwichtige weggelassen habe.

Antworten
Rafael K.
  • Forum-Beiträge: 2.359

28.02.2011, 15:57:42 via Website

Man startet einen Thread nicht über run(), sondern über start().

Nur start() führt dazu, dass er wirklich als eigener Thread gestartet wird.
run() dient nur als Einstiegspunkt fürs Überschreiben und läuft beim direkten Aufruf im aktuellen Thread.

Antworten
Phil
  • Forum-Beiträge: 40

28.02.2011, 16:06:38 via Website

Ich habe das "run" in "start" geändert. Das Resultat bleibtdas gleiche.

Antworten
Phil
  • Forum-Beiträge: 40

28.02.2011, 16:12:14 via Website

Ich hatte in dem MainLoop noch ein mView.invalidate() drin, und das funktioniert natürlich nicht. Dumm wenn ich die Exception nicht beachte *autsch*

Nun geht es so wie ich es haben möchte.

Danke für den Hinweis.

Antworten
Dominic Bartl
  • Forum-Beiträge: 180

01.03.2011, 18:59:39 via Website

Veruschs mal mit Ausgaben, dass du weißt wie weit du kommst und dann poste wieder hier ...

Antworten