2016-04-11 16 views
1

Ich mache eine Art von Spiel mit Android Studio und ich möchte etwas wie heute Spiel Ladebildschirm, in dem erscheint zufälliger Text auf dem Bildschirm erscheint.Random TextView auf dem Bildschirm laden Android

Ich möchte ein TextView setzen 4 Sätze zum Beispiel "Chargin eins" "Chargin zwei" "Chargin drei" und "Chargin vier" Die Idee ist es, eine zeigen, warten 1-2 Sekunden zeigen die nächste und wann alle habe gezeigt, weiter mit anderen Dingen.

Ich habe es versucht, indem Sie einen Thread und TextView Text einstellen, aber ich habe den nächsten Fehler: Der einzige, der TextView ändern kann, ist der Haupt-Thread. Was sollte ich tun?

Dies soll in das Thema sein:

int num = 1; 
int aleatorio; 
while(num<4) { 
     Random r = new Random(); 
     aleatorio = r.nextInt(frasesCarga.size() - 1); 
     fraseCarga.setText(frasesCarga.get(aleatorio)); 
     num++; 
     frasesCarga.remove(aleatorio); 
} 

Ich werde die Klasse schreiben, wenn jemand sie braucht.

LoadActivity.class

package es.fingerlabs.gamecohol; 

import android.app.AlertDialog; 
import android.app.ProgressDialog; 
import android.content.Context; 
import android.content.DialogInterface; 
import android.content.Intent; 
import android.content.SharedPreferences; 
import android.os.Bundle; 
import android.support.v7.app.AppCompatActivity; 
import android.util.Log; 
import android.widget.Button; 
import android.widget.ImageView; 
import android.widget.TextView; 
import android.widget.Toast; 

import java.util.ArrayList; 
import java.util.Random; 

public class Jugar extends AppCompatActivity { 

private ArrayList<String> frasesCarga; 
private TextView fraseCarga; 
private int vivo; 
@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_jugar); 

    fraseCarga = (TextView) findViewById(R.id.tvFraseCargandoJugar); 

    frasesCarga = new ArrayList<String>(); 
    frasesCarga.add("Preparando Cubatas"); 
    frasesCarga.add("Haciendo hielo"); 
    frasesCarga.add("Mezclando preguntas"); 
    frasesCarga.add("Cogiendo sitio"); 
    frasesCarga.add("Poniendo chupitos"); 

    Thread timerThread = new Thread() { 
     public void run() { 
      try { 
       int num = 1; 
       int aleatorio; 
       while(num<4) { 
        sleep(1000); 
        Random r = new Random(); 
        aleatorio = r.nextInt(frasesCarga.size() - 1); 
        fraseCarga.setText(frasesCarga.get(aleatorio)); 
        num++; 
        frasesCarga.remove(aleatorio); 
       } 
      } catch (InterruptedException e) { 
       e.printStackTrace(); 
      } 
     } 
    }; 
    timerThread.start(); 






} 

@Override 
public void onBackPressed() { 
    new AlertDialog.Builder(this) 
      .setIcon(android.R.drawable.ic_dialog_alert) 
      .setTitle("¿Salir de la partida?") 
      .setMessage("Si sales se perdera el progreso de la partida") 
      .setPositiveButton("Si", new DialogInterface.OnClickListener() 
      { 
       @Override 
       public void onClick(DialogInterface dialog, int which) { 
        finish(); 
       } 

      }) 
      .setNegativeButton("No", null) 
      .show(); 
} 

} 
+0

Aber Sie haben diesen Code in onCreate() geschrieben. Wo ist der andere Thread, von dem du sprichst? –

+0

Ich habe den Beitrag bearbeitet den Thread zum besseren Verständnis hinzufügen –

Antwort

1

Das Problem wird Sie versuchen, Spielen Sie mit den Ansichten in Nicht-UI-Threads, die in Android verboten sind. Für Ihren Zweck gibt es mehrere Möglichkeiten, wie Handlers, AsyncTask zu tun. AysncTask wird einfach für Sie sein.

ein AsyncTask wie folgt erstellen -

class MyTask extends AsyncTask<Void,String,Void>{ 

     @Override 
     protected Void doInBackground(Void... params) { 
      try { 
       int num = 1; 
       int aleatorio; 
       while(num<4) { 

        Random r = new Random(); 
        aleatorio = r.nextInt(frasesCarga.size() - 1); 
        publishProgress(frasesCarga.get(aleatorio)); 
        num++; 
        frasesCarga.remove(aleatorio); 
        Thread.sleep(1000); 
       } 
      } catch (InterruptedException e) { 
       e.printStackTrace(); 
      } 
      return null; 
     } 

     @Override 
     protected void onProgressUpdate(String... values) { 
      super.onProgressUpdate(values); 

      fraseCarga.setText(values[0]); 
     } 
    } 

Und Ihre Aufgabe beginnen in onCreate() -

new MyTask().execute(); 
+0

Vielen Dank, ich habe es gelöst, indem Sie eine Broadcast-Absicht verwenden, aber Ihre Lösung funktioniert auch perfekt. –

0

Eine AsyncTask <> Klasse tun zufällige Texterstellung in doInBackground() Methode und schließlich führte Text in Textview auf Mainthread gesetzt in OnPostExecute() Methode

+0

Ich bin Neuling. Du meinst, ich sollte die mainActivity asyncTask <> machen oder eine andere Klasse machen. Erstellen Sie dabei eine Methode doInBackground(), in der Sie einen Satz radomly auswählen, ihn aus der Array-Liste entfernen und finalli zurückgeben? Aber wo mache ich die Schleife, in der der Haupt-Thread für 1-2 Sekunden schläft und TextView's Text 4-mal setzt? –

+0

Erstellen Sie eine andere Klasse des Typs asyncTask, dann führen Sie es aus mainActivity, –

1

ein Verfahren in der AsyncTask ist onProgressUpdate() ist der einzige Ort, den Sie das Textview aktualisieren. Der UI-Thread enthält den TextView, so dass er im Hintergrund nicht geändert werden kann. Rufen Sie die Methode publishProgress() innerhalb von doInBackground() auf onProgressUpdate()

AsyncTask ist ideal für kurze Operationen aus dem Haupt-UI-Thread. Um eine AsyncTask zu implementieren, können Sie eine statische innere Klasse aus der Aktivität oder eine separate Java-Dateiklasse erstellen.

static class MyTask extends AsyncTask <TypeOfVarArgParams,ProgressValue,ResultValue>

bei dem obigen Code Blickt man von Shadab Ansari ist doInBackground() die einzige Methode, die eine Arbeit in einem eigenen Thread tut. AsyncTask richtet das für Sie ein. Um AsyncTask zu verwenden, müssen Sie eine Unterklasse erstellen. AsyncTask verwendet Generics und Varargs. Die Parameter sind die folgende AsyncTask.

Eine AsyncTask wird über die Methode execute() gestartet.

Die Methode execute() ruft die Methode doInBackground() und onPostExecute() auf.

TypeOfVarArgParams in die doInBackground() Methode als Eingabe übergeben wird, für ProgressValue Fortschrittsinformationen verwendet wird und Result muss aus doInBackground() Methode zurückgeführt werden und ist an OnPostExecute() als Parameter übergeben.

Die Methode doInBackground() enthält die Codierungsanweisung, die in einem Hintergrundthread ausgeführt werden sollte. Diese Methode wird automatisch in einem separaten Thread ausgeführt.

Die Methode onPostExecute() synchronisiert sich erneut mit dem Thread der Benutzerschnittstelle und ermöglicht die Aktualisierung. Diese Methode wird vom Framework aufgerufen, sobald die doInBackground() -Methode abgeschlossen ist.

Verwandte Themen