Integer geht jede Sekunde hoch

XVirus

XVirus

Neues Mitglied
2
Hi,
Ich möche machen dass wenn man einen Button klickt dass die Zahl in einem TextView(Der Integer) immer um x hoch geht jede Sekunde. Ich habe dazu das gemacht:
PHP:
public void hoch(){
        i+=s;
        try {
            Thread.sleep(1 * 1000);
        } catch (InterruptedException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        hoch();
    }
i ist der integer der im TextView angezeigt wird und s ist das was beim klicken des Buttons hoch geht.
Das habe ich dann in onCreate mit
PHP:
hoch();
aufgerufen.
Dann kommt allerdings nur ein weißer Bildschirm... onCreate wird wohl nicht vollständig ausgeführt? Wie kann ich das machen?
 
Zuletzt bearbeitet:
Indem du nciht den Mainthread blockst?! Ich meine du rufst die Funktion immer wieder auf...nach einer bestimmten Zeit sollte es dann auch einen Overflow geben...
ausserdem ist es komisch dass du Thread.sleep(); aufrufst...damit legst du wiederum ncoh mehr den Mainthread lahm...

Also den Code in einen anderen Thread auslagern dann ist es ok....und nciht rekursiv da mit jedem rekursionschritt ein Overhead entsteht und dieser über kurz oder lang einen overflow oder fragmentation verursacht aber ich kenne mich mit der Architektur jetzt nciht so gut aus...

Habe gerade mal den Sourcecode für den Activitythread duch geguckt da mir dein Thread.sleep() verdächtig vorkam und ich schauen wollte was das bewirkt....naja ok bei 5000 Zeilen Code war meine Luste dann auch schnell vergangen aber ich hab einen lustigen Kommentar gefunden...hat mcih irgendwie an einen Song erinnert"Die,die,die,die,die..." XD
GC: ActivityThread - android.app.ActivityThread (.java) - GrepCode Class Source

// Don't set application object here -- if the system crashes,
// we can't display an alert, we just want to die die die.
1x1.gif
 
  • Danke
Reaktionen: XVirus
Für deinen Fall gibt es in den Androiklassen den Handler:
Code:
Handler mHandler;
  public void useHandler() {
    mHandler = new Handler();
    mHandler.postDelayed(mRunnable, 1000);
  }

  private Runnable mRunnable = new Runnable() {

    @Override
    public void run() {
      Log.e("Handlers", "Calls");
      /** Do something **/
      mHandler.postDelayed(mRunnable, 1000);
    }

Quelle: Android Development - News, Example, tutorial, Source Code : Handler vs Timer : fixed-period execution and fixed-rate execution android development
Timer(Task) = bad! Do it the Android way: Use a Handler :) » Moritz online
 
  • Danke
Reaktionen: XVirus
Also ich habe es jetzt so gemacht;
PHP:
  public void useHandler() {
        mHandler = new Handler();
        mHandler.postDelayed(mRunnable, 1000);
      }

      private Runnable mRunnable = new Runnable() {

        @Override
        public void run() {
            i+=s;
            PCounter.setText(Integer.toString(i));

            editor.putInt("Data1", i);
            editor.commit();
          mHandler.postDelayed(mRunnable, 1000);
        }
Vielen Dank!
Allerdings geht "i" dann a mal um a hoch. Also wenn a 3 ist dann geht das i 3-mal um a hoch, bei a=4 ist es 4-mal umd a(also 4) hoch. Es soll aber nur 1-mal um a hochgehen. Also nicht 4*4 sondern 1*4.
 
Ich habe deinen Satz nicht ganz verstanden, aber warum machst du nicht statt i+=s dann i++?
 
  • Danke
Reaktionen: XVirus
Ich verstehe die Frager auch nciht...a,s irgendwie verwirrend...
 
  • Danke
Reaktionen: XVirus
Ich habe s mit a(ein anderer Integer den ich für was anderes benutze) verwechselt sorry :blushing:... ich habe einen Button erstellt. Wenn man auf den klickt geht "s" immer um 1 hoch. Ich will dass der Integer "i", der im TextView angezeigt wird dann immer jede Sekunde um s hoch geht... also i+=s weil das "i" so oft hochgehen soll wie man den Button geklickt hat.
Allerdings gibt es da ein Problem. Als Beispiel:
s ist 5
Dann sollte pro Sekunde das i um 5 hochgehen. Allerdings geht das i komischerweise jede Sekunde um mehr als 5 mal hoch. Ich kann es am besten in einem Video zeigen:
 
Kann man aus dem Code ncht erkennen ....geht bei s etwas schief?

Ich hätte verstanden wenn es langsamer geht da der Code ja auf dem UI Thread ausgeführt wird. Aber schneller kommt seltsam.

Du verlässt dich im Endeffekt auch darauf dass der Handler exakt aufgerufen wird. Besser wäre es die Zeit zu messen seit dem letzten Aufruf und die gut im Namen gewählte variable i zu einem Float zu amchen und wenn du i anzeigt es einfach in ein int zu casten.

Wie wärs damit:

PHP:
public void useHandler() {
        mHandler = new Handler();
        mHandler.postDelayed(mRunnable, 1000);
        oldTime=System.currentTimeMillis();
      }

long oldTime;
float i;

      private Runnable mRunnable = new Runnable() {

        @Override
        public void run() {
            long curTime=System.currentTimeMillis();
            i+=s*(curTime-oldTime)/1000f;
            oldTime=curTime;
            PCounter.setText(Integer.toString((int)i));

            editor.putInt("Data1", (int)i);
            editor.commit();
          mHandler.postDelayed(mRunnable, 1000);
        }

PS: deine Namensgebung ist grauenhaft!!!
 
  • Danke
Reaktionen: XVirus
Hab ich gemacht. Aber es geht immernoch nicht ganz. Ich habe nämlich noch einen anderen Button. Wenn man den klickt geht i um 1 hoch(bei mir zum Testen gerade um 1001). Was jetzt passiert, habe ich hier als Video. Den Code habe ich nur ein bisschen verändert, da "i" ist am Anfang ein int:
PHP:
    public void useHandler() {
        long oldTime;
        mHandler = new Handler();
        mHandler.postDelayed(mRunnable, 1000);
        oldTime=System.currentTimeMillis();
      }
 



      private Runnable mRunnable = new Runnable() {
          long oldTime;
          float i;
        @Override
        public void run() {
     
            long curTime=System.currentTimeMillis();
            i+=s*(curTime-oldTime)/1000f;
            oldTime=curTime;
            PCounter.setText(Integer.toString((int)i));

            editor.putInt("Data1", (int)i);
            editor.commit();
          mHandler.postDelayed(mRunnable, 1000);
        }
 
 
};

Hier ist der Code vom Button:
PHP:
        Button_next.setOnClickListener(new OnClickListener() {

            @Override
            public void onClick(View v) {

                i += a;
                i+=1000;
                PCounter.setText(Integer.toString(i));

                editor.putInt("Data1", i);
                editor.commit();

                playSound(v);
                Button_next.setBackgroundResource(R.drawable.bild2);

              
                Handler handler = new Handler();
                handler.postDelayed(new Runnable() {
                    public void run() {
                        Button_next.setBackgroundResource(R.drawable.bild1);
                    }
                }, 100);
             
            }

        });

Hier ein Video:
Teil1:
Teil2:



Da wo das mit 2147.......... stand ist nach dem Neustart.
 
Zuletzt bearbeitet:
Hi, dein Post von Heute um 13:44 Uhr zeigt es eigentlich schon. Das Video ist für mich da auch sofort klar.
Du lässt mehr als einen Handler laufen. Im Video sieht man ja, dass er kurz auf der Zwischenzahl bleibt, und erst dann weiterspringt.
Kann es sein, dass du useHandler() mehrmals aufrufst?
 
  • Danke
Reaktionen: XVirus
useHandler() rufe ich nur einmal in onCreate auf sonst nicht. Andere Handler sind nur der in Button_next onClick und mehrere von denen da, damit der Toast Text früher abgebrochen wird:
PHP:
        if (speicher.getInt("Data1", 0) != 0) {
            final Toast toast = Toast.makeText(getApplicationContext(),
                    "Speicherstand geladen! :)", Toast.LENGTH_SHORT);
            toast.show();

            Handler handler = new Handler();
            handler.postDelayed(new Runnable() {
                @Override
                public void run() {
                    toast.cancel();
                }


Ganz am Anfang über der Klasse definiere ich i als int, und beim Handler ist es ein float. macht das vielleicht Probleme?
PHP:
static int i = 0;
 
Ich dachte s ist die Variable die bei einem klick hochgehen soll und nicht i...
Also i ist der punktestand
s ist die Geschwindigkeit pro Sekunde
und a erhöht s bei jedem click

Ansonsten kann ich nicht erkennen was da schief läuft...Jetzt misst du auch schon die zeit so dass wenn der handler 100 mal die Sekunde aufgerufen werden würde er trotzdem in einer Sekunde nur um s inkrementiert....

Hast du jetzt 2 i's im Code weil du sagtest es ist am Anfang ein Integer.

P.S. markiert mal daß i ...rechtsklick...refactor...rename....Einmal auf entfernt klicken..."counter" eingeben ... enter

Das gleiche mit s zu "growthRate"
und a zu "incrementRate"
 
  • Danke
Reaktionen: XVirus
Ne. Ich habe dann noch einen anderen Button(Button_next) Da erhöht a die Anzahl um wieviel i hochgehen soll per Klick. Mit der Geschwindigkeit pro Sekunde hat a nichts zu tun. Dafür ist s zuständig.
I habe ich ganz am Anfang als Integer definiert und im Handler ist es dann ein Float. Das nach PS mache ich dann Morgen(bin grad am Handy).
 
achso dann amch doch das globale i zu einem float? Ist doch unsinnig 2 i s drin zu haben oder?
 
  • Danke
Reaktionen: XVirus
Ich verstehe den Zweck immer noch nicht. Es soll ein Spiel werden, in dem Zahlen addiert werden. Es gibt zwei Buttons. Bei einem wird der Zählerstand inkrementiert, bei dem anderen werden die Punkte, die es pro Sekunde gibt inkrementiert, oder?
Also wenn ich mit 0 Punkten anfange und jede Sekunde 1 Punkt dazu bekomme, habe ich nach 5 Sekunden 5 Punkte. Habe ich in Sekunde 3 auf den ersten Button geklickt, habe ich nach 5 Sekunden 6 Punkte.
Klicke ich nach 5 Sekunden auf den zweiten Button, dann habe ich bei Sekunde 6 7 Punkte, da ich ab jetzt ja 2 Punkte mehr pro Sekunde erhalte.

Um vielleicht ein wenig Threadsavedly zu bekommen, könntest du ja einen Singleton benutzen. Dann wüsstest du wenigstens, das du da schon mal save bist.
 
  • Danke
Reaktionen: XVirus
Ich stelle mri vor dass er so ein Game amcht wo man sich sachen kauft wie zum beispiel eine burger bude und man aht das Ziel der größte Burger Ketten Besitzer der Welt zu werden oder so. Dann kauft man sich einen Burger laden, dieser bringt x geld pro sekunde hat man genug kann man sich ein restaurant kaufen oder mehrer Burgerbuden und so weiter. Wie das hier: Adventure Capitalist Game online

Und : nein er erhöht wohl nicht den Wert pro sekunde sondern einfach nur den Wert insgesamt und der Button asorgt dafür dass dieser Wert pro sekunde erhöht wird...oder so ähgnlich :D
 
  • Danke
Reaktionen: XVirus
Also es soll so ein Klicker Spiel werden(z.B. Cookie Clicker). Allerdings ist die maximale Punktezahl komischerweise genau 2147483647. Kann man das nicht erhöhen? Ich habe jetzt das i als float gemacht überall. Das i heißt jetzt points (counter habe ich schon), a heißt incrementRare und s ist jetzt growthRate.
Jetzt passiert das was in dem Video zu sehen ist. Die Punktzahl wird erst zu 21474... wenn der Handler läuft.
Im Code ist jetzt anstadt Static int i... "static float points = 0;" Und überall wo ich das benutzt habe ist jetzt (int) points. Also das (int) habe ich da immer hionzugefügt. Das mit dem Handler sieht gerade so aus:
PHP:
    public void useHandler() {
        long oldTime;
        mHandler = new Handler();
        mHandler.postDelayed(mRunnable, 1000);
        oldTime=System.currentTimeMillis();
      }




      private Runnable mRunnable = new Runnable() {
          long oldTime;
     
        @Override
        public void run() {
    
            long curTime=System.currentTimeMillis();
            points+=growthRate*(curTime-oldTime)/1000f;
            oldTime=curTime;
            PCounter.setText(Integer.toString((int)points));

            editor.putInt("Data1", (int)points);
            editor.commit();
          mHandler.postDelayed(mRunnable, 1000);
        }


};
Ist das Trollface Bild eigentlich Copyright?


Um vielleicht ein wenig Threadsavedly zu bekommen, könntest du ja einen Singleton benutzen. Dann wüsstest du wenigstens, das du da schon mal save bist.

Sorry aber das hab ich nicht verstanden
 
Zuletzt bearbeitet:
XVirus schrieb:
Allerdings ist die maximale Punktezahl komischerweise genau 2147483647.

hahahaha der war gut...
2147483647 - Wikipedia, the free encyclopedia
Integer (computer science) - Wikipedia, the free encyclopedia

XVirus schrieb:
Ist das Trollface Bild eigentlich Copyright?

hahahahhaa nein

Das was KArdoid dir sagte ist dass du sicher gehst das nur ein einziges Element von points vorhanden sein sollte bzw. du dieses als volatile zum Beispiel markierst(oder den Code für das erhöhen synchronisierst) da du evtl von mehreren Threads aus auf die point variable zugreifst.
Aber der Handler Code wird ja auf dem MainThread ausgeführt da sehe ich keine concurrency soweit...
 
  • Danke
Reaktionen: XVirus
Du startest den Handler in einer onCreate() Methode. D.h das du jedesmal, wenn du die onCreate() Methode einen neuen Handler erzeugst. Da keine Methode erwähnt wird, wo der vorherige Handler (Thread) beendet wird, dürften mehrere Handler aktiv sein.
Da i eine statische (globale) Variable ist, dürfte auch nicht hilfreich sein. Da jetzt alle Handler auf die gleiche Variable zugreifen.

Statt einen Handler kann man auch die Timer Klasse benutzen. Diese hat eine cancel() Methode, und sie ist für so etwas ausgelegt.
 
  • Danke
Reaktionen: XVirus
Ich habe das jetzt mit dem Timer gemacht. Er funktioniert ohne Probleme! Vielen Dank! Erstmal ging es nur am Emulator und nicht am Handy.

Edit:
Allerdings geht es noch nicht ganz. Manchmal wenn ich vom Shop zurück in die Mainactivity gehe (oder die App einfach neu starte) laufen wieder 2 Timer gleichzeitig.
Er wird in oncreate so beendet:
PHP:
if (timer != null) {
            timer.cancel();
            timer = null;
           
        }
Und in der 2. Activity bei onbackpressed (fast) genauso
 
Zuletzt bearbeitet:

Ähnliche Themen

CrazyC
Antworten
3
Aufrufe
715
jogimuc
J
softwaretk
Antworten
11
Aufrufe
1.639
softwaretk
softwaretk
Zurück
Oben Unten