Schleife von start an

  • Antworten:17
  • Bentwortet
Mechamod
  • Forum-Beiträge: 8

10.10.2013, 17:09:46 via Website

Hallo,ich bin ziemlich neu in der richtung Java/Android programmierung :/ und wolte gerne für eine kleine app eine Schleife machen (die alle 5 sek von anfang an läuft),die eine zahl um 1 erweitert :) (Rechnung ist richtig,doch wenn ich alles im AVD starte und versuche die app zu starten lange ladezeiten und iwann absturz :( )

1public class Stock_Master extends Activity {
2
3 @Override
4 protected void onCreate(Bundle savedInstanceState) {
5 super.onCreate(savedInstanceState);
6 setContentView(R.layout.activity_stock__master);
7 thread.start();
8 }
9
10 @Override
11 public boolean onCreateOptionsMenu(Menu menu) {
12 // Inflate the menu; this adds items to the action bar if it is present.
13 getMenuInflater().inflate(R.menu.stock__master, menu);
14 return true;
15 }
16
17
18int a=0;
19
20
21 Thread thread = new Thread()
22{
23 public void run() {
24
25for(int i = 0; i< 50; i++) {
26 try {
27 //sending the actual Thread of execution to sleep X milliseconds
28 Thread.sleep(1000);
29 } catch(InterruptedException ie) {}
30 a=a+1;
31
32 }
33
34 }
35};



Die stellen wo ich mir unsicher bin sind Fett gemarkt :) bin mir nicht sicher ob ich in der ''onCreate'' meine Schleife starten sol (ob das überhaupt so richtig alles ist)... :( Bitte um Schnelle und präzise (möglichst leicht erklärt,weil ich ziemlich neu wie gesgat hier bin und langsam lerne :) )
MfG Mech

— geändert am 10.10.2013, 18:35:19

Antworten
Mechamod
  • Forum-Beiträge: 8

10.10.2013, 17:59:35 via Website

Weiß denn niemand weiter :( ?
Kann mir wer dann leicht vertsändlich einen Code erklären der vom Start aus ausgeführt wird und sich in gewissen zeitabständen wiederholt :( ?

Sam Browder

Antworten
Gelöschter Account
  • Forum-Beiträge: 8.246

10.10.2013, 18:25:54 via App

Hallo und herzlich Willkommen bei uns.

Ich habe deinen Thread mal in die richtige Kategorie verschoben. Hier wirst du auch eher mit Hilfe rechnen können. ;-)

Und bitte beachte auch unsre Regeln bezüglich des pushen.

Antworten
impjor
  • Forum-Beiträge: 1.793

10.10.2013, 18:29:49 via Website

1. Pushen ist doof. Wenn jemand Ahnung hat, wird er sich schon melden. Vor allem jede 1h zu pushen ist doppelt doof.
2. Quellcode bitte immer in [code]-Tags!
3.
catch (InterruptedException e){}
Wenn ein Fehler passiert (was ja anscheinend passiert), wird der Code in den geschweiften Klammern ausgeführt... Also nichts. Das hilft dir nicht wirklich weiter. Schreibe mindestens { e.printStackTrace(); }.
4. Wenn eine App abstürzt schau dir immer zuerst selber das LogCat an. Da steht dann leicht verständlich, warum die App abstürzt.

LG

Liebe Grüße impjor.

Für ein gutes Miteinander: Unsere Regeln
Apps für jeden Einsatzzweck
Stellt eure App vor!

Antworten
Fabian
  • Forum-Beiträge: 144

10.10.2013, 18:38:22 via Website

Ich verstehe deine Frage nicht wirklich, aber du meinst, du öffnest die App, es soll eine Schleife ausgeführt werden, die sich nach Ende wiederholen soll?
Also quasi, eine nie endende Schleife?

Hoffe, mit den Klammern stimmts, da ich das im Browser gemacht habe :)

edit: Am überarbeiten..

— geändert am 10.10.2013, 18:49:10

Antworten
Mechamod
  • Forum-Beiträge: 8

10.10.2013, 18:41:25 via Website

tut mir leid :(
im logCat steht nichts dazu,nur in der console

1[2013-10-10 18:37:54 - StockMaster] Installing StockMaster.apk...
2[2013-10-10 18:39:57 - StockMaster] Failed to install StockMaster.apk on device 'emulator-5554!
3[2013-10-10 18:39:57 - StockMaster] (null)
4[2013-10-10 18:39:57 - StockMaster] Launch canceled!

Edit: Ok,es funktioniert irgednwie (ohne das ich was geändert hab),abe rnur manchmal wnen ich das AVD starte :(

— geändert am 10.10.2013, 18:45:47

Antworten
Fabian
  • Forum-Beiträge: 144

10.10.2013, 18:52:44 via Website

So, habe es mal für dich kurz geschrieben:

1package com.example.schleife;
2
3import android.app.Activity;
4import android.os.Bundle;
5import android.view.Menu;
6
7public class MainActivity extends Activity {
8 Thread thread;
9 int a=0;
10
11 @Override
12 protected void onCreate(Bundle savedInstanceState) {
13 super.onCreate(savedInstanceState);
14 setContentView(R.layout.activity_main);
15 ThreadWiederholen();
16 }
17
18 @Override
19 public boolean onCreateOptionsMenu(Menu menu) {
20 getMenuInflater().inflate(R.menu.main, menu);
21 return true;
22 }
23
24 public void run() {
25 while(a<=50) {
26 a++; // a in jedem Durchgang um 1 erhöhen
27 try {
28 Thread.sleep(30);
29 } catch(InterruptedException ie) {}
30 }
31 thread = null;
32 ThreadWiederholen();
33 }
34
35 public void ThreadWiederholen() {
36 if(thread==null) {
37 a=0; // a wieder auf 0 setzen
38 thread= new Thread();
39 thread.start();
40 }
41 }
42
43}

So würde das ganze laufen, ich sehe aber den Sinn nicht, weil du keine Rückmeldung bekommen würdest und der Thread im Hintergrund vor sich hin zählen würde...

ps: So bricht er auch nicht ab :D ...

grüße Fabian!

— geändert am 10.10.2013, 18:53:30

Antworten
Mechamod
  • Forum-Beiträge: 8

10.10.2013, 19:22:04 via Website

Oh,ein While (besser als ein for-loop) :)) Danke. Hab meins größt möglich angepasst wies perfekt wäre :)

1public void Money() {
2 while (a<=49) {
3 a++;
4 try {
5 Thread.sleep(5);
6 }catch(InterruptedException ie) {}
7
8 }
9 a=0
10 Money();
11}

Das müsste jetzt machen (sagen wir bei einem anfangs wert von a=45:

a=45
a=46
a=47
a=48
a=49
a=50
a=0
a=1
...
a=49
a=50
etc etc.

??? (Wäre nähmlich eig gut für mein projekt :) ) ?

Und wie starte ich die Money Thread? habs jetzt grad so

1package stockmaster.mechamod.awesome;
2
3import android.os.Bundle;
4import android.app.Activity;
5import android.view.Menu;
6import android.view.View;
7import android.widget.TextView;
8
9public class Stock_Master extends Activity {
10
11 Thread Money;
12
13 @Override
14 protected void onCreate(Bundle savedInstanceState) {
15 super.onCreate(savedInstanceState);
16 setContentView(R.layout.activity_stock__master);
17
18 }
19
20 @Override
21 public boolean onCreateOptionsMenu(Menu menu) {
22 // Inflate the menu; this adds items to the action bar if it is present.
23 getMenuInflater().inflate(R.menu.stock__master, menu);
24 return true;
25 }

? Fast geschafft hab ich das gefühl,auf jedenfall besser als mein for-loop :)

Edit: Ich kriegs nicht hin den Money Thred zu starten habe das von oben und:

1package stockmaster.mechamod.awesome;
2
3import android.os.Bundle;
4import android.app.Activity;
5import android.view.Menu;
6import android.view.View;
7import android.widget.TextView;
8
9public class Stock_Master extends Activity {
10
11
12
13 @Override
14 protected void onCreate(Bundle savedInstanceState) {
15 super.onCreate(savedInstanceState);
16 setContentView(R.layout.activity_stock__master);
17Money;
18 }
19
20 @Override
21 public boolean onCreateOptionsMenu(Menu menu) {
22 // Inflate the menu; this adds items to the action bar if it is present.
23 getMenuInflater().inflate(R.menu.stock__master, menu);
24 return true;
25 }

probier :( nix funktioniert. beim 1. Startet er da sprogramm,aber es Money wir dnicht aktiviert,und beim 2. bleibt der Bildschirm weiß (nehme mal an es läuft permanent durch)...

— geändert am 10.10.2013, 19:45:20

Antworten
Fabian
  • Forum-Beiträge: 144

10.10.2013, 19:42:41 via Website

1.Genau, so würde der Thread zählen...
2. Erst einmal musst du deinen Thread initialisieren:
1Money = new Thread() // initialisieren in der onCreate
2Money.start(); // Thread starten

Bevor du das so startest, schau dir noch einmal meinen Code an, weil der Thread die Methode "run()" aufrufen würde und nicht "Money()"...

edit: Hast du das gemacht, was ich dir geschrieben habe?

grüße Fabian!

— geändert am 10.10.2013, 20:45:43

Antworten
Mechamod
  • Forum-Beiträge: 8

11.10.2013, 00:01:22 via Website

Also soweit sieht es jetzt so aus: (a wurde durch cost ersetzt (musste was ändern) und cost,ist eine zufallsgeneriertezahl,die mal 100 und dann gerundet wird :) 00.00-100.00 mit cost hab ich shcon relativ viel jetzt gemach tudn funktioniert prächtig,also alles wie es soll,nur der Thread Randomiser (früher Money) wird nicht aufgerufen :( )

1import android.os.Bundle;
2import android.app.Activity;
3import android.view.Menu;
4import android.view.View;
5import android.widget.TextView;
6
7public class Stock_Master extends Activity {
8
9 Thread Randomiser = new Thread();
10
11 @Override
12 protected void onCreate(Bundle savedInstanceState) {
13 super.onCreate(savedInstanceState);
14 setContentView(R.layout.activity_stock__master);
15 Randomiser.start();
16
17 }
18
19 @Override
20 public boolean onCreateOptionsMenu(Menu menu) {
21 // Inflate the menu; this adds items to the action bar if it is present.
22 getMenuInflater().inflate(R.menu.stock__master, menu);
23 return true;
24
25 }

1public void Randomiser() {
2 while (cost!=0) {
3 cost=Math.round(Math.random()*100);
4 TextView kosten = (TextView) findViewById(R.id.kosten); //Den Geldstand aktualisieren
5 kosten.setText(" " + cost);
6 try {
7 Thread.sleep(5000);
8 }catch(InterruptedException ie) {}
9 Randomiser();
10 }
11 Randomiser();
12 cost=Math.round(Math.random()*100);
13}

Wenn ich das starte,passiert garnix... weißer bildschirm und cost steht auf einer besitmmten zufälligen zahl die sich nicht alle 5 sekunden ändert :( (Randomiser ist wohl nicht angelaufen :( )
wenn ich
1Randomiser();
umkopiere in ein prozess der bei einem button ausgelöst wird:

1public void Buy_Stock (View view) { // Aktionen Buy Button
2
3 if (money >= cost) {
4
5 stock = stock + 1;
6 money = money - cost; // Zieht Die Kosten dem Guthaben ab
7
8
9 //Aktualisierungen:
10 TextView text = (TextView) findViewById(R.id.stock);
11 text.setText(" " + stock);
12
13 TextView playermoney = (TextView) findViewById(R.id.geldstand);
14 playermoney.setText(" " + money);
15 Randomiser();
16 }

läuft das spiel,aber sobald ich dne Buy button drücke (und damit Randomiser aktiviere) hängt es sich auf und stürzt ab ;(

Antworten
Mac Systems
  • Forum-Beiträge: 1.727

11.10.2013, 02:24:55 via Website

Was dir fehlt ist die run Methode für deinen Thread, lies dir das mal kurz an, nicht schwer aber du verdrehst da noch was:

http://openbook.galileodesign.de/javainsel5/javainsel09_001.htm#Rxx747java09001040002E11F035100






PS: Variablen in Java bitte immer anfangs klein schreiben bis zum nachsten Wort. Also randomizer oder z.b serverConnection

— geändert am 11.10.2013, 02:29:36

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

Antworten
Sam Browder
  • Forum-Beiträge: 236

11.10.2013, 05:07:59 via Website

Hi,
also, wie ich es verstanden habe, brauchst du eine Endlosschleife, welche einen Code in gleichen Zeitabständen immer wieder ausführt?
Das ist eine Endlosschleife (miitels Handler):
1final Handler handler = new Handler();
2 handler.postDelayed(new Runnable() {
3 public void run() {
4 handler.postDelayed(this, 5000);
5 < Code, welcher in der Schleife immer wieder ausgeführt wird >
6 }
7 }, 5000);
Versuche es Mal damit!

MfG
Sam

— geändert am 11.10.2013, 05:08:40

impjorMac Systems

Antworten
Fabian
  • Forum-Beiträge: 144

11.10.2013, 12:31:59 via App

Wenn es nur um eine Schleife geht, welche eine Variable in regelmäßigen Abständen verändert würde auch gehen:
public void run () {
while (true) {
a++;
Thread.sleep(500);
}
}

sorry ist mit nem Handy geschrieben...

Der Nachteil ist halt, dass du die TexView nur im Main Thread verändern kannst...

grüße Fabian

— geändert am 11.10.2013, 12:33:12

Antworten
Mechamod
  • Forum-Beiträge: 8

11.10.2013, 18:34:03 via Website

Danke für den Link über die Threads,versteh das jetzt shcon viiiel besser und weiß wo (und was für riesen) fehler ich gemacht habe :)) meine Thread Class:


1public class randomizer {
2 public void run() {
3
4 while (cost!=0) {
5 cost=Math.round(Math.random()*100);
6 TextView kosten = (TextView) findViewById(R.id.kosten); //cost anzeigen lassen
7 kosten.setText(" " + cost);
8
9 try {
10 Thread.sleep(5000);
11 }catch(InterruptedException ie) {}
12 }
13
14}
15}

sieht das soweit richtig aus :) ? (ich hoffe :) )
nur das problem ist jetzt mit dem automatischen starten :( wo setze ich

1Thread t1 = new Thread ( randomizer );

und

1t1.start();

hin :( (wenn die beiden überhaupt richtig sind :(,muss es nur einmal hinkriegen dann blick ich durch :) ) ?

— geändert am 11.10.2013, 18:39:44

Antworten
impjor
  • Forum-Beiträge: 1.793

11.10.2013, 21:20:42 via Website

Hier wurde schon mehrfach gesagt, dass du von einem anderen Thread nicht auf den UI-Thread zugreifen darfst: UI = UserInterface = alles was der Benutzer von deiner App sieht.
Mein du darfst nicht kosten.setText() auf deinem Thread ausführen lassen (also aus der run()-Methode aufrufen). Stattdessen nimmst du z.B. Activity#runOnUiThread();

LG

Liebe Grüße impjor.

Für ein gutes Miteinander: Unsere Regeln
Apps für jeden Einsatzzweck
Stellt eure App vor!

Antworten
Mechamod
  • Forum-Beiträge: 8

12.10.2013, 01:00:15 via Website

Ja ok,die textview's hab ich gelöscht,geht ja hauptsächlich nur um die cost variable,aber das wichtigste wa sich nicht verstanden habe von der seite,wie call ich die randomizer class?

Antworten
Fabian
  • Forum-Beiträge: 144

12.10.2013, 02:19:24 via App

Ersteinmal schreibt man Klassen groß, damit man sie von Variablen o.ä unterscheiden kann: Randomizer.
Die Klasse rufst du auf: Randomizer name = new Randomizer ();
Dazu musst du allerdings wissen, was ein Konstruktor ist und wie du ihn verwendest. Lies dir doch vorerst ein Java Buch durch, hat mir auch geholfen.. :-)

grüße Fabian

— geändert am 12.10.2013, 02:24:10

Antworten
Mechamod
  • Forum-Beiträge: 8

12.10.2013, 16:47:29 via Website

Ein Riesen danke an alle die mir hier geholfen haben :)) habe es endlich hinbekommen und es funktioniert super (sogar mit text ausgabe) :))

Vielen dank! :)

Sam Browder

Antworten