Domanda

Ho provato a fare questo

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    setContentView(R.layout.main);

    t=new TextView(this); 

    t=(TextView)findViewById(R.id.TextView01); 
    t.setText("Step One: blast egg");

    try {
        Thread.sleep(10000);
    } catch (InterruptedException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }

    t.setText("Step Two: fry egg");

ma per qualche motivo, solo il secondo testo si presenta quando l'eseguo. Penso che potrebbe avere qualcosa a che fare con il metodo Thread.sleep() blocco. Quindi, qualcuno mi può mostrare come implementare un timer "asincrono"?

Grazie.

È stato utile?

Soluzione

Ho appena pubblicato questa risposta nella android-discutere gruppo Google

Se si sta solo cercando di aggiungere del testo alla visualizzazione in modo che visualizzi "Fase uno: esplosione uovo Fase due: frittura di uova" Allora considerare l'utilizzo di t.appendText("Step Two: fry egg"); invece di t.setText("Step Two: fry egg");

Se si desidera cambiare completamente ciò che è nel TextView in modo che si dice "Fase uno: esplosione uovo" all'avvio e poi si dice "Fase due: friggere uovo" in un secondo momento si può sempre usare un

Runnable esempio sadboy ha dato

In bocca al lupo

Altri suggerimenti

Il tuo metodo onCreate() ha diversi difetti enormi:

1) onCreate prepara la tua attività - quindi nulla che si fa qui sarà reso visibile per l'utente fino a quando questo metodo finiture! Per esempio - si sarà mai in grado di modificare il testo di un TextView qui più che sarà disegnata UNA al momento in cui solo l'ultima modifica e quindi visibili per l'utente

2) Tenete a mente che un programma di Android - per difetto - l'esecuzione in UNA unico filo! Così: non utilizzare mai Thread.sleep() o Thread.wait() nel thread principale che è responsabile per l'interfaccia utente! (Leggi "Tieni la tua App Responsive" per ulteriori informazioni!)

Che cosa il vostro di inizializzazione della tua attività non fa altro che:

  • per nessun motivo si crea un nuovo oggetto TextView t!
  • si sceglie TextView del vostro layout nel t variabile successivamente.
  • si imposta il testo del t (ma tenere a mente: sarà visualizzato solo dopo finiture onCreate() e il ciclo degli eventi principale della vostra applicazione viene eseguita)
  • si attende per 10 secondi all'interno del vostro metodo di onCreate - questo non deve mai essere fatto come si ferma tutte le attività di interfaccia utente e sarà sicuramente forzare un ANR (Applicazione non risponde, vedere link qui sopra!)
  • , allora si imposta un altro testo - questo verrà visualizzato non appena il vostro metodo onCreate() finiture e diversi altri metodi attività del ciclo di vita sono stati elaborati!

La soluzione:

  1. testo riportato solo una volta in onCreate() - questo deve essere il primo testo che dovrebbe essere visibile

  2. .
  3. Crea una Runnable e Handler

    private final Runnable mUpdateUITimerTask = new Runnable() {
        public void run() {
            // do whatever you want to change here, like:
            t.setText("Second text to display!");
        }
    };
    private final Handler mHandler = new Handler();
    
  4. installare questo eseguibile come un gestore, possibile in onCreate() (ma leggere il mio consiglio di seguito):

    // run the mUpdateUITimerTask's run() method in 10 seconds from now
    mHandler.postDelayed(mUpdateUITimerTask, 10 * 1000);
    

Consigli: essere sicuri di sapere ciclo di vita di un Activity! Se fai cose del genere in onCreate()this accadrà solo quando il Activity viene creata la prima di tempo! Android sarà eventualmente tenere il Activity in vita per un periodo di tempo più lungo, anche se non è visibile! Quando un utente "avvia" di nuovo - ed è ancora esistente - non vedrete il vostro primo testo più


=> Installare sempre i gestori in onResume() e disabilitare in onPause()! In caso contrario, si ottiene "aggiornamenti" quando il vostro Activity non è visibile a tutti! Nel tuo caso, se si vuole vedere di nuovo il primo testo quando viene riattivato, è necessario impostare in onResume(), non onCreate()!

La prima linea della nuova visualizzazione del testo è necessario

t=new TextView(this); 

si può solo fare questo

TextView t = (TextView)findViewById(R.id.TextView01);

per quanto riguarda un thread in background che dorme qui è un esempio, ma penso che ci sia un timer che sarebbe meglio per questo. ecco un link per un buon esempio utilizzando un timer, invece http://android-developers.blogspot.com/2007/11 /stitch-in-time.html

    Thread thr = new Thread(mTask);
    thr.start();
}

Runnable mTask = new Runnable() {
    public void run() {
        // just sleep for 30 seconds.
                    try {
                        Thread.sleep(3000);
                        runOnUiThread(done);
                    } catch (InterruptedException e) {
                        // TODO Auto-generated catch block
                        e.printStackTrace();
                    }
        }
    };

    Runnable done = new Runnable() {
        public void run() {
                   // t.setText("done");
            }
        };

@ user264892

ho scoperto che quando si utilizza una variabile String avevo bisogno di uno prefisso con una stringa di "" o esplicitamente cast CharSequence.

Così, invece di:

String Status = "Asking Server...";
txtStatus.setText(Status);

Prova:

String Status = "Asking Server...";
txtStatus.setText((CharSequence) Status);

o

String Status = "Asking Server...";    
txtStatus.setText("" + Status);

o, dal momento che la stringa non è dinamica, ancora meglio:

txtStatus.setText("AskingServer...");

per il vostro consiglio, io sto usando la maniglia e runnables per cambiare / modificare il contenuto del TextView utilizzando un "timer". per qualche ragione, durante l'esecuzione, l'applicazione salta sempre il secondo passo ( "Fase due: friggere uovo"), e mostrare solo l'ultimo (terzo) step ( "Fase tre: servire uovo").

TextView t; 
private String sText;

private Handler mHandler = new Handler();

private Runnable mWaitRunnable = new Runnable() {
    public void run() {
        t.setText(sText);
    }
};

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    setContentView(R.layout.main);

    mMonster = BitmapFactory.decodeResource(getResources(),
            R.drawable.monster1);

    t=new TextView(this); 
    t=(TextView)findViewById(R.id.TextView01); 

    sText = "Step One: unpack egg";
    t.setText(sText);

    sText = "Step Two: fry egg";        
    mHandler.postDelayed(mWaitRunnable, 3000);

    sText = "Step three: serve egg";
    mHandler.postDelayed(mWaitRunnable, 4000);      
    ...
}

Il tuo :) utilizzando il filo in modo sbagliato. Basta fare il seguente:

private void runthread()
{

splashTread = new Thread() {
            @Override
            public void run() {
                try {
                    synchronized(this){

                        //wait 5 sec
                        wait(_splashTime);
                    }

                } catch(InterruptedException e) {}
                finally {
                    //call the handler to set the text
                }
            }
        };

        splashTread.start(); 
}

Questo è tutto.

l'impostazione del testo da sam TextView due volte si sovrascrive il primo testo scritto. Così la seconda volta quando usiamo setText abbiamo appena aggiungere la nuova stringa come

textview.append("Step Two: fry egg");

@Zordid @Iambda risposta è grande, ma ho scoperto che se metto

mHandler.postDelayed(mUpdateUITimerTask, 10 * 1000);

Nel metodo run () e

mHandler.postDelayed(mUpdateUITimerTask, 0);

nel metodo onCreate rendere la cosa mantenere l'aggiornamento.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top