まず、Object.wait()
は、synchronized
内で別スレッドを待機するのに使う機能です。
スリープ機能として使うのには適していません。
Javaでスリープをする一般的な方法は、Thread.sleep(long)
です。
Androidで、今回のケースのような場合は、AsyncTask
とHandler
を組み合わせるのが一般的のようです。
また、ご質問とは関係ありませんが、TextViewに文字列を追加する箇所はTextView#append(String)
が使えますよ。
lang
1 import android.app.Activity;
2 import android.os.AsyncTask;
3 import android.os.Bundle;
4 import android.os.Handler;
5 import android.view.Menu;
6 import android.view.MenuItem;
7 import android.widget.TextView;
8
9 public class MainActivity extends Activity {
10
11 Handler handler = new Handler();
12
13 private class MessageTask extends AsyncTask<String, Void, Integer> {
14
15 @Override
16 protected Integer doInBackground(String... args) {
17 // 非UIスレッドで実行
18 String[] texts = { /* ... テキストの配列 ... */ };
19 for (String text : texts) {
20 char[] a = text.toCharArray();
21 for (int i = 0; i < a.length; i++) {
22 appendText(String.valueOf(a[i]));
23 try {
24 Thread.sleep(100L);
25 } catch (InterruptedException e) {
26 throw new RuntimeException(e);
27 }
28 }
29 }
30 return 0;
31 }
32
33 }
34
35 void appendText(final String text) {
36 handler.post(new Runnable() { // UIスレッドで実行
37 @Override
38 public void run() {
39 TextView view = (TextView) findViewById(R.id.textView);
40 view.append(text);
41 }
42 });
43 }
44
45 @Override
46 protected void onCreate(Bundle savedInstanceState) {
47 super.onCreate(savedInstanceState);
48 setContentView(R.layout.activity_main);
49 new MessageTask().execute();
50 }
51
52 // 以下略
53
54 }
(2015/01/16 01:03, 01:09, 01:32のコメントへの回答)
サンプルコードは、ご質問の問題に焦点を絞って単独で試せるように書いているので、細かいところは応用して使っていただければと思います。
サンプルコードの変数view
はtextmessage
に読み替えてください。
クラスの外にあるtexts
にはMessageTask
からはMainActivity.this.texts
でアクセスできると思います。(static classにしているとこれではできませんがstaticでないので)
それよりも、MainActivity
にgetClickedText
メソッドを作ってそれを呼ぶようにした方が良いかもしれませんね。
具体的には、こんな感じです。
lang
1 // MainActivity
2 String getClickedText() {
3 return texts[event][click].toString();
4 }
5
6 // MessageTask#doInBackground
7 String text = getClickedText();
8 char[] a = text.toCharArray();
9 for (int i = 0; i < a.length; i++) {
10 appendText(String.valueOf(a[i]));
11 try {
12 Thread.sleep(100L);
13 } catch (InterruptedException e) {
14 throw new RuntimeException(e);
15 }
16 }
textmessage.setText
につきましては、サンプルコードではview.append(text)
としています。textShow
にnew MessageTask().execute()
を書いてみるとどうなりますか?
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2015/01/15 16:03
2015/01/15 16:09
2015/01/15 16:32
2015/01/15 22:17
2015/01/16 00:02
2015/01/16 08:33
2015/01/16 08:43
2015/01/16 15:45
2015/01/16 23:37