Viewelemente neu zeichnen

H

HalloIchBinsDochNur

Neues Mitglied
1
Hallo erst mal,
ich bin noch ganz neu und relativ unbedarft in der App Entwicklung. Ganz früher habe ich mal ein Wenig mit Delphi gebastelt.
Und glaubt mir ich habe schon ganz wunde Finger von der Recherche und vom Ausprobieren.
Jetzt komme ich einfach nicht mehr weiter.
Eigentlich dachte ich, es muss ganz einfach sein zur Laufzeit einen Butten umzufärben.
Zum Ausprobieren habe ich eine Activity erstellt mit einem Butten der umgefärbt werden soll dann soll eine Weile gewartet werden bis die Activity beendet wird.
Später sollen mehrere Butten in einer bestimten Reihenfolge mit etwa einer Sekunde umgefäbt werden.

Schaut euch doch bitte mal den Code an was ich bisher habe (ich habe schon diverses ausprobiert) Vielleicht hat ja jemand einen Codeschnipsel den ich versuchen kann zu verstehen wenn er in meinen Code eingebaut ist.

Hier mein Code:

import android.graphics.Color;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.widget.Button;

public class PlaySequence extends AppCompatActivity {

Button button_1;

@override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_play_sequence);

button_1 = (Button) findViewById(R.id.button_1);
button_1.setBackgroundColor(Color.GREEN); //Button soll jetzt eigentlich Grün angezeigt werden.

//Pause für 1000 Millisekunden
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}

//finish();

}
}

Das finish(); habe ich auskommentiert damit ich sehe was passiert.
Und ich stelle fest das der Butten erst neu gezeichnet (eingefährbt) wird nach meiner Pause.

Ich freue mich über jede hilfreiche Antwort.
Aber bitte nichts im Stile von Google ist dein Freund oder so. Am liebsten wäre mir ein Codeschnipsel direkt für mein Programm. Da begreife ich am Besten was passiert ;-)

Und nein, ihr sollt mein Programm nicht schreiben. Ich will es einfach nur kapieren :-D

Danke schon mal
Tschüss
 
Hallo, dein Problem ist, dass deine GUI einfriert durch das Sleep.

Du musst für so etwas ein Asnc Task oder Thread verwenden.

Wenn du es jedoch vorerst etwas einfacher machen möchtest dann mit einem Timer
 
  • Danke
Reaktionen: swa00
Hallo,

wie Thomas schon richtig erwähnte, läuft Android Thread lastig.

Auch wenn es dir nicht genehm ist, Google zu fragen , so würde ich dir trotzdem anraten,
sich in die Eigenschaften von Android inbesondere in die Grundlagen einzulesen - und da bleibt nun mal nur Tante Google übrig .

Dir hier die Grundlagen mittels eines Schnipsel zu erklären , wäre mühseelig.

Hier aktuelle Literatur zu Threads und Tasks..
Android background processing with Handlers, AsyncTask and Loaders - Tutorial
 
  • Danke
Reaktionen: 123thomas
@swa00
Im C# Forum ließt man aktuell immer öfter, dass Tasks anstatt Threads verwendet werden sollten, aufgrund des besseren Handlings. Ist das bei Java/Android auch so?
 
Hallo Thomas,

Frohes Neues nachträglich.!!

Ich verdiene meine Brötchen schon seit jahrzehnten mit C/C++ und ich weis, was du meinst :)

Unter Android sind - vereinfacht ausgedrückt - Tasks = Threads und überhaupt nicht mit denen aus C#/C/C++ zu vergleichen.
Sleeps sind tödlich, es sei denn , man bastelt sie wiederum in Threads ein.

Ein AsyncTask ist eigentlich nur ein Wrapper eines Threads - ich hatte auch anfangs meine Probleme damit , zu verstehen , was die Unterschiede sind
und vermehrt AsynTasks eingesetzt .
Die sind aber für lange Operationen nicht gedacht - da hat mich Markus.Tullius auch erst drauf bringen müssen.
(Steht versteckt in einem Nebensatz)


AsyncTask | Android Developers
AsyncTask is designed to be a helper class around Thread and Handler and does not constitute a generic threading framework. AsyncTasks should ideally be used for short operations (a few seconds at the most.) If you need to keep threads running for long periods of time, it is highly recommended you use the various APIs


Für UI -Updates kann man AsyncTasks in Kombination nehmen - z.b.
runOnUiThread(new Runnable()
{
@override
public void run()
{
// paint
}
});

Ich habe mir angewöhnt , richtige schöne Threads zu verwenden , egal für was.
Habe ich Operationen, die nur kurzweilig sind (z.b. einlesen einer Liste aus einer DB) dann nehme ich AsyncTask.

Für HTTP - Operationen , bin ich auf die ION Library umgestiegen. (oder z.b. OKHttp)







.
 
Zuletzt bearbeitet:
  • Danke
Reaktionen: 123thomas
Vielen Dank für die vielen Antworten.
Jetzt muss ich mich da erst mal durchwurschteln.
Ich denke aber ich werde da schon irgend etwas hinbekommen.

@swa00 Ich habe grundsätzlich kein Problem mir Informationen mit meiner Lieblingssuchmaschine zu suchen. Auf diese Weise habe ich schon einiges gelernt. Aber bei Android bin ich noch ziemlich am Anfang. Und da brauchts schon mal ein Erfolgserlebnis. Ich muss mit der Programmiererei ja nicht mein Leben finanzieren.
Das mache ich mit Möbelbau ;-)
Und ich vermute mal wenn du dir zu Hause was aus Holz bastelst, gehst du auch nicht in den Wald und schlägst einen Baum, sondern gehst in dem Baumarkt um die fertig gehobeltes Holz zu kaufen ;-)

Ich hoffe du nimmst mir mein Gleichnis nicht übel aber vielleicht verstehst du was ich damit sagen will.
Ich will es schon verstehen ....

Der passende Schnipsel wäre dann vielleicht ein Brett aus dem richtigen Holz um die Eigenschaften zu verstehen und es dann auf den ganzen Schrank anzuwenden ;-))

Jetzt versuche ich erst mal eure Tipps zu verstehen um sie in meinem Projekt anzuwenden.

Tschüss
 
Hallo Hallo,

natürlich habe ich verstanden , was Du damit uns sagen möchtest. :)

Das "Problem" an der Sache ist allerdings, dass man erst mal erklären müsste , was Holz resp. ein Baum ist und was eine Säge ist.

Frage : Kann mir jemand erklären, wie ich ein Brett sägen kann - ohne dass ich weis, was ein Baum ist . :)
Antwort von uns : "Na schlichweg : rischte raschte" :) Das hilft dir natürlich nicht weiter :)

Die Säge hast du als Link oben schon bekommen, Forstwirtschaft wäre dein Part :)
 
Kapiert :)
Ich bin auch schon dran. Im Wald bin ich schon...

Nee. im Ernst. So langsam komme ich auf den richtigen Weg. Ganz glücklich bin ich noch nicht.
Hier ist mal mein vorläufiges Ergebnis.

Nach dem der Button Grün ist wird nun 5000 Millisekunden gewartet bis die Aktivity beendet wird.
Jetzt hätte ich noch gerne das ich den Button nach der Wartezeit z.B. Blau machen kann bevor die Aktivity beendet wird.

Also
Button grün
Warten
Button blau
Warten
finish();

Deshalb habe ich das ganze in eine Methode gepackt.

Das bekomme ich noch nicht hin. Aber jetzt muss der Hund raus und ich brauche auch frische Luft ;-)

import android.graphics.Color;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.widget.Button;
import android.os.Handler;

public class PlaySequence extends AppCompatActivity {

Button button_1;

@override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_play_sequence);



button_1 = (Button) findViewById(R.id.button_1);
button_1.setBackgroundColor(Color.GREEN);
//Pause für 5000 Millisekunden
Pause();
}

public void Pause() {
final Handler handler = new Handler();
handler.postDelayed(new Runnable() {
@override
public void run() {
finish();
}
}, 5000);
}
}
[doublepost=1483547326,1483542857][/doublepost]Die frische Luft war gut.
Wenn das was ich unterwegs überlegt habe stimmt, dann ist meine Idee mit der Methode doof.

Ich denke (ohne es schon probiert zu haben) es wird das wo ich im Moment finish(); stehen habe alle 5000ms ausgeführt. Das heißt ich kann alle 5000ms eine Methode aufrufen in der ich z.B. eine Variable hochzähle.

Liege ich da richtig?

Ich werde das später auf jeden Fall testen.
 
Hallo Förster :)

grundsätzlich ist das nicht falsch , was Du da machst , führt dich aber in eine gewisse Sackgasse.
(Das hast du aber selbst schon treffend festgestellt)

Du musst das Ganze in einem AsyncTask lösen

private class _async_meinWald extends AsyncTask<Void, Void,Integer>
{


@override
protected Integer doInBackground(Void... params)
{
runOnUiThread(new Runnable()
{
public void run()
{
SystemClock.sleep(5000);
button_1.setBackgroundColor(Color.GREEN);
SystemClock.sleep(5000);
button_1.setBackgroundColor(Color.BLUE);

});
return null;
}
@override
protected void onPostExecute(Integer d)
{
super.onPostExecute(d);
finish();
}
}

Aufruf in OnCreate

new _async_meinWald().executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR);
 
Zuletzt bearbeitet:
@swa00
Noch mal vielen Dank. Mit deinem Beispiel komme ich nicht so richtig klar. Kann es sein das sich da evtl. irgendwo ein Fehler eingeschlichen hat den ich nicht lokalisieren kann. Was ich herausgefunden habe ist das man @override mit einem großen "O" schreibt. Das war aber leicht zu finden ;-)

Aber mal unabhängig davon und auf die Gefahr hin das ich nerve. Nachdem ich so einiges probiert und mein Projekt noch mal überdacht habe, glaube ich, dass ich eigentlich kein Delay brauche sondern eher einen Timer der regelmäßig alle x Millisekunden etwas tut (eine Methode aufrufen und dann die Button umfärben wie ich es im vorherigen Post schon angedeutet habe).

Ich meine mich zu erinnern das es in Delphi ein Procedure "Timer" gab die z.B. alle halbe Sekunde die Uhranzeige aktualisiert hat.

Laut meiner Recherche (ja, das tue ich wirklich ;-)) scheint das in Android nicht ganz so einfach zu sein.
Vielleicht hast du da noch eine Idee??

Danke für deine/eure Geduld mit mir
Tschüss
 
Hallo ,

für die Typos in meinem Code bitte ich um entschuldigung , ich schreibe das auch nur hier aus
aus dem Kopf herunter, um lediglich Dir den Weg zu zeigen ...

Timer :
Grundsätzlich ist ein Timer nichts anderes als ein Thread , der in einer Loop läuft , also kannst du das
Beispiel oben nehmen und eine Endlosschliefe mit einem "warte-Zeitglied" .
Und wenn man fertig ist , kannst du das Ganze dann mit einem Flag beenden.


protected Void doInBackground(Void... params)
{
while (! MachMichSchluss)
{
SystemClock.sleep(1000);
runOnUiThread(new Runnable()
{
public void run()
{
button_1.setBackgroundColor(Color.GREEN);
}
});
}
return null;
}
 
@swa00
Das sollte keine Kritik sein. Das war eine ernst gemeinte Frage, die du mir aber damit beantwortet hast das du die Codeschnipsel aus dem Kopf raus schreibst. Ich hatte mich einfach nur gewundert das Android Studio so viel rummeckert :)
Also alles gut,.

Das mit dem "Timer" das probiere ich später aus.

Danke ein weiteres Mal
 
einfacher Timer Beispiel:
Code:
 Timer t1 = new Timer();
        t1.scheduleAtFixedRate(new TimerTask() {
            @Override
            public void run() {
               //mach was alle 500 ms nach dem du 5000 ms gewartet hast
            }
        }, 5000,500);

aber wie swa00 schon sagte ist das im Hintergrund gleich.
 
Nur gut das ich noch Krank geschrieben bin. Da habe ich genug Zeit zum probieren.
Und weil ihr mir so super geholfen habt will ich euch auch meinen Testcode nicht vorenthalten ;-)

Grundsätzlich läuft es jetzt schon wie ich mir das vorgestellt habe.
Jetzt muss er natürlich noch verfeinert und in mein eigentliches Projekt eingebaut werden.

Sollte ich wieder mal nicht weiterkommen darf ich mich doch bestimmt wieder an euch wenden ?!

Da isser nu:

import android.graphics.Color;
import android.os.AsyncTask;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.widget.Button;
import android.os.SystemClock;


public class PlaySequence extends AppCompatActivity {

boolean SchleifeBeenden;
boolean abbruch;
boolean TestVariable;
Button button_1;

@override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_play_sequence);

TestVariable = true;
SchleifeBeenden = true;
abbruch = true;

button_1 = (Button) findViewById(R.id.button_1);

new _async_ButtonFaerben().executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR);

}
private class _async_ButtonFaerben extends AsyncTask<Void, Void,Integer> {

@override
protected Integer doInBackground(Void... params) {
int zaehler = 0;
while (zaehler < 5) {
zaehler++;
SystemClock.sleep(1000);
runOnUiThread(new Runnable() {
public void run() {
buttonUmfaerben();
}
});
}
return null;
}
@override
protected void onPostExecute(Integer d)
{
super.onPostExecute(d);
finish();
}
}

public void buttonUmfaerben() {
if (TestVariable == true) {
button_1.setBackgroundColor(Color.GREEN);
TestVariable = false;
} else {
button_1.setBackgroundColor(Color.BLUE);
TestVariable = true;
}
}
}
 
Sollte ich wieder mal nicht weiterkommen darf ich mich doch bestimmt wieder an euch wenden ?!

Nein , Guthaben aufgebraucht :)

IBAN : DE 1234 12345 1234 1234 1234 <- Hier Ticket ziehen

Herzlichen Glückwunsch zum Erfolg :)
 
Zuletzt bearbeitet:
Hallo,
nun ist ein Jahr ins Land gezogen als ich meinen ersten Beitrag hier geschrieben habe.
Durch eure Hilfe habe ich so dieses oder jenes gelernt. Anderes begreife ich noch immer nicht.
Nichts desto trotz habe ich eine lauffähige App zusammengebastelt.

Zugegeben, der Quellcode sieht aus wie ein Teller Spaghetti. Deshalb bekommt ihn auch niemand zu sehen :p

Trotzdem will ich einfach mal ein ganz klein Wenig mit dem was ich da so gemacht habe angeben. Auch wenn es jetzt sicher genug gibt die sagen werden "Gibts ja schon und sogar viel besser". Das stimmt zwar, ist mir aber egal. Ich verdiene mein Geld zum Glück nicht Programmieren.
Mir macht es einfach nur Spaß :)

So, da isses:

SequenceMemo (Memo Spiel ähnlich wie Senso) – Android-Apps auf Google Play

Danke noch mal für eure Hilfe. So macht das Ganze wirklich viel Spaß!
 
Na dann ab in den App Vorstellungsbereich :)

Herzlichen Glückwunsch !

(Schön , von Dir ein Feedback zu bekommen)
 
swa00 schrieb:
Na dann ab in den App Vorstellungsbereich :)

Herzlichen Glückwunsch !

Sehr gerne, aber wo finde ich den ??
Ich glaube ich bin doof ;-)
 
Danke, ich habe ihn dann doch noch gefunden. Vielleicht bin ich doch nicht sooo doof.

Da werde ich mir später mal die Regeln durchlesen und mein Äppchen vorstellen.
 

Ähnliche Themen

A
  • AnimaAngelo85
Antworten
1
Aufrufe
313
swa00
swa00
MES
Antworten
10
Aufrufe
788
MES
MES
D
  • Data2006
Antworten
14
Aufrufe
449
jogimuc
J
Zurück
Oben Unten