Autore Topic: Problemi con ritardo (delay) tra due instruzioni  (Letto 174 volte)

Offline camiba

  • Nuovo arrivato
  • *
  • Post: 2
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    Asus ze552zl
  • Sistema operativo:
    Window 7
Problemi con ritardo (delay) tra due instruzioni
« il: 26 Marzo 2018, 21:28:56 CEST »
0
Buongiorno a tutti vorrei porvi il mio problema ho scritto questa app per provare una procedura delay che mi generi un ritardo di tot millisecondi,
ho provato e riprovato in svariati modo trovati sulla rete e alla fine ho trovato questa istruzione SystemClock.uptimeMillis che restituisce in millisecondi il tempo trascorso da quando il dispositivo è acceso, l'ho usata come scritto nel codice per generare ritardo, il problema è che la procedura sembra "funzionare" pero al avvio del programma attende subito un ritardo impostato senza visualizzare nulla, per poi dopo il ritardo impostato mostrare solo la parte finale dell'app insieme alla parte che doveva comparire prima del delay, boh dove sbaglio? Grazie per le risposte

Codice (Java): [Seleziona]
 package com.example.myapplication;

import android.app.Activity;
import android.widget.TextView;
import android.widget.Button;
import android.os.Bundle;
import android.os.SystemClock;
import com.example.myapplication.R;
import java.lang.Object;

public class MainActivity extends Activity {
 
  private TextView testo;
 
  @Override
  protected void onCreate(Bundle savedInstanceState) {
   
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
 
  TextView testo = (TextView) findViewById(R.id.testo);
 
  testo.setText("prima " + SystemClock.uptimeMillis());
 
  delay(2000);

  testo.append("  dopo  " + SystemClock.uptimeMillis());
}

public void delay(long millis) {
  long d = SystemClock.uptimeMillis() + millis;
  while (d > SystemClock.uptimeMillis()) { }
 }

}
 

Offline capitancooker

  • Utente junior
  • **
  • Post: 123
  • Marco
  • Respect: +10
    • Mostra profilo
  • Dispositivo Android:
    Nexus 5
  • Sistema operativo:
    macOS High Sierra
Re:Problemi con ritardo (delay) tra due instruzioni
« Risposta #1 il: 27 Marzo 2018, 09:12:33 CEST »
0
Prova così:
Codice (Java): [Seleziona]
 @Override
  protected void onCreate(Bundle savedInstanceState) {
   
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
 
    TextView testo = (TextView) findViewById(R.id.testo);
 
    testo.setText("prima " + SystemClock.uptimeMillis());
 
    final Handler handler = new Handler();
    handler.postDelayed(new Runnable() {
         @Override
         public void run() {
               //Esegue dopo 2 secondi
              testo.append("  dopo  " + SystemClock.uptimeMillis());
        }
    }, 2000);

}

Ciao,
Marco
Se sbaglio, correggetemi.

Offline camiba

  • Nuovo arrivato
  • *
  • Post: 2
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    Asus ze552zl
  • Sistema operativo:
    Window 7
Re:Problemi con ritardo (delay) tra due instruzioni
« Risposta #2 il: 27 Marzo 2018, 13:34:31 CEST »
0
Ciao Marco grazie mille funziona alla perfezione mi dice solo di mettere un "final" su " TextView testo = (TextView) findViewById(R.id.testo); "
Se volessi un ritardo diciamo tra due sprite in un gioco 2D ad esempio
 
Codice (Java): [Seleziona]
paint.setColor(Color.RED);
 c.drawCircle(x, 100, 50, paint);
 delay(30);
 x = x + 1;
 c.drawCircle(x, 100, 50, paint);
un esempio banale di una palla che si muove sull asse x, dopo aver inizializzato tutto queste istruzioni me le trovo dentro onDraw {  } per esempio,
grazie per la disponobilita!
 

Offline capitancooker

  • Utente junior
  • **
  • Post: 123
  • Marco
  • Respect: +10
    • Mostra profilo
  • Dispositivo Android:
    Nexus 5
  • Sistema operativo:
    macOS High Sierra
Re:Problemi con ritardo (delay) tra due instruzioni
« Risposta #3 il: 27 Marzo 2018, 14:12:24 CEST »
0
Il final in effetti ci vuole.

Il principio per avere un ritardo senza fermare la UI è sempre lo stesso:

Codice (Java): [Seleziona]
 final Handler handler = new Handler();
    handler.postDelayed(new Runnable() {
         @Override
         public void run() {

             // Qui scrivi il codice che vuoi che venga avviato
             // alla fine del tempo in ritardo_in_millis

        }
    }, ritardo_in_millis);

Quindi dovresti poterla applicare anche al tuo codice.

Ciao,
Marco
Se sbaglio, correggetemi.