2016-04-11 21 views
1

私はアンドロイドスタジオを使用してゲームをやっています。私は今日のゲームの読み込み画面のような何かをしたい、画面上にランダムなテキストが表示されます。画面上のランダムなテキストビューAndroid

例えば「Chargin one」「Chargin two」「Chargin three」と「Chargin four」のTextView 4文章を入れたいと思っています。アイデアは1つ表示し、1〜2秒待ってから次の他のものと続けることが示されている。

私はスレッドを実行して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

投稿を編集してスレッドを追加して理解しやすくしました –

答えて

1

OnPostExecute()方法でmainThread上のTextViewをもたらしたテキストを設定しますAndroidで禁止されているUI以外のスレッドで再生します。 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()であなたのタスクを開始 - AsyncTask onProgressUpdate()のメソッドがあり

new MyTask().execute(); 
+0

ありがとう、私はブロードキャストインテントを使用して解決しましたが、あなたのソリューションも完璧に動作します。 –

0

asyncTask <の作成>クラスがdoInBackground()方法でランダムなテキストの作成を行い、最終的には問題はあなたがしようとしているされて

+0

私は初心者です。 mainActivity asyncTask <>を作成するか、別のクラスを作成する必要があります。その場合、doInBackground()メソッドを作成します。このメソッドでは、無作為にセンテンスを選択し、配列リストから削除してfinalliに返します。しかし、私はメインスレッドが1-2秒間スリープし、TextViewのテキストを4回設定するループをどこで作るのですか? –

+0

asyncTaskタイプの別のクラスを作成し、mainActivityから実行してください。 –

1

はあなたのTextViewを更新できる唯一の場所です。 UIスレッドはTextViewを保持しているため、バックグラウンドで変更することはできません。メソッドpublishProgress()の中にdoInBackground()を実行して実行するonProgressUpdate()

AsyncTaskは、メインUIスレッドからの短い操作に最適です。 AsyncTaskを実装するには、静的内部クラスをアクティビティから作成するか、独立したJavaファイルクラスを作成します。 Shadabアンサリ、doInBackground()から上記のコードを見てみると

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

独自のスレッドですべての作業を行う唯一の方法です。 AsyncTaskによってこれが設定されます。 AsyncTaskを使用するには、それをサブクラス化する必要があります。 AsyncTaskは、genericsとvarargsを使用します。パラメータは、次のAsyncTaskです。

​​メソッドを使用してAsyncTaskを開始します。

​​メソッドはdoInBackground()onPostExecute()メソッドを呼び出します。

TypeOfVarArgParamsが入力としてdoInBackground()メソッドに渡され、ProgressValueは、進捗情報のために使用され、ResultValueはdoInBackground()メソッドから返されなければならず、onPostExecute(に渡される)をパラメータとして。

doInBackground()メソッドには、バックグラウンドスレッドで実行されるコーディング命令が含まれています。このメソッドは別のスレッドで自動的に実行されます。

onPostExecute()メソッドは、再度ユーザーインターフェイススレッドと同期し、更新を許可します。このメソッドは、doInBackground()メソッドが終了するとフレームワークによって呼び出されます。

関連する問題