2016-04-11 5 views
1

Я делаю вид игры с использованием Android-студии, и я хочу сделать что-то вроде экрана загрузки сегодняшней игры, в котором появляется случайный текст на экране.Случайный текстовый экран на экране загрузки Android

Я хочу надеть TextView 4 предложения, например «Chargin one» «Chargin two» «Chargin three» и «Chargin four» Идея состоит в том, чтобы показать один, подождать 1-2 секунды, показывая следующее, и когда все были продолжены с другими вещами.

Я пробовал это, выполнив Thread и установив TextView в текст, но я получил следующую ошибку: Единственный, кто может изменить TextView, является главной темой. Что я должен делать?

Это должно быть в тему:

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); 
} 

Я вывешу класс, если кто нуждается в этом.

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

Но вы написали этот код в onCreate(). Где другой поток, о котором вы говорите? –

+0

Я отредактировал это сообщение, добавив Thread для лучшего понимания. –

ответ

1

Этот вопрос вы пытаетесь играть с представлениями в потоке, отличном от UI, который запрещен для Android. Для вашей цели есть несколько способов сделать это, как Handlers, AsyncTask. AysncTask будет легко для вас.

Создать AsyncTask как это -

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]); 
     } 
    } 

И начать свою задачу в onCreate() -

new MyTask().execute(); 
+0

Большое вам спасибо, я решил его, используя намерение трансляции, но ваше решение отлично работает. –

0

Создать AsyncTask <> класс сделать создание случайного текста в doInBackground() метода и, наконец, установить привел текст в TextView на mainThread в OnPostExecute() методе

+0

Я новичок. Вы имеете в виду, что я должен сделать mainActivity asyncTask <> или создать другой класс. В этом случае создайте метод doInBackground(), в котором radomly выбирает предложение, удаляет его из списка массивов, а finalli возвращает его? Но где я делаю цикл, в котором основной поток спит 1-2 секунды и вводит текст TextView 4 раза? –

+0

Создайте еще один класс типа asyncTask, затем выполните его из mainActivity, –

1

Существует метод в AsyncTask onProgressUpdate() это единственное место, где вы можете обновить TextView. В потоке пользовательского интерфейса выполняется TextView, поэтому его нельзя изменить в фоновом режиме. Вызвать метод publishProgress() внутри doInBackground() для запуска onProgressUpdate()

AsyncTask отлично подходит для коротких операций с основного потока пользовательского интерфейса. Для реализации AsyncTask вы можете создать статический внутренний класс или отдельный класс java-файла.

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

Глядя на приведенный выше код из Shadab Ансари, doInBackground() это единственный метод, который делает любую работу в своем собственном потоке. AsyncTask устанавливает это для вас. Чтобы использовать AsyncTask, вы должны подклассифицировать его. AsyncTask использует generics и varargs. Параметры следующие: AsyncTask.

AsyncTask запускается с использованием метода execute().

Метод execute() вызывает doInBackground() и метод onPostExecute().

TypeOfVarArgParams передается в метод doInBackground() в качестве входных данных, ProgressValue используются для информации о ходе и ResultValue должны быть возвращены из doInBackground метода() и передаются onPostExecute() в качестве параметра.

Метод doInBackground() содержит инструкцию кодирования, которая должна выполняться в фоновом потоке. Этот метод запускается автоматически в отдельном потоке.

Метод onPostExecute() снова синхронизируется с потоком пользовательского интерфейса и позволяет его обновлять. Этот метод вызывается средой после завершения метода doInBackground().

Смежные вопросы