質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

Android

Androidは、Google社が開発したスマートフォンやタブレットなど携帯端末向けのプラットフォームです。 カーネル・ミドルウェア・ユーザーインターフェイス・ウェブブラウザ・電話帳などのアプリケーションやソフトウェアをひとつにまとめて構成。 カーネル・ライブラリ・ランタイムはほとんどがC言語/C++、アプリケーションなどはJavaSEのサブセットとAndroid環境で書かれています。

Android Studio

Android Studioは、 Google社によって開発された、 Androidのネイティブアプリケーション開発に特化した統合開発ツールです。

Q&A

解決済

2回答

1776閲覧

【android studio】 ブロックを0.5秒ごとに落下させたいのですがThread.sleep(500);を使ってもうまくいきません原因は何でしょうか

退会済みユーザー

退会済みユーザー

総合スコア0

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

Android

Androidは、Google社が開発したスマートフォンやタブレットなど携帯端末向けのプラットフォームです。 カーネル・ミドルウェア・ユーザーインターフェイス・ウェブブラウザ・電話帳などのアプリケーションやソフトウェアをひとつにまとめて構成。 カーネル・ライブラリ・ランタイムはほとんどがC言語/C++、アプリケーションなどはJavaSEのサブセットとAndroid環境で書かれています。

Android Studio

Android Studioは、 Google社によって開発された、 Androidのネイティブアプリケーション開発に特化した統合開発ツールです。

0グッド

0クリップ

投稿2018/07/29 10:46

編集2018/07/31 14:23

質問

Thread.sleep(500);を使うとsleepを使う分だけ起動の時間が遅くなっているように感じます。
原因は何か教えて頂けると幸いです。

ソースコード

java

1import android.support.v7.app.AppCompatActivity; 2import android.os.Bundle; 3import android.widget.TextView; 4 5public class MainActivity extends AppCompatActivity { 6 String screen; 7 int random, i, j, x, y, z; 8 9 int field[][] = //パズルの中身 10 { // 0 1 2 3 4 5 6 7 8 9 10 11 12 11 {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2}, //0 12 {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2}, //1 13 {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2}, //2 14 {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2}, //3 15 {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2}, //4 16 {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2}, //5 17 {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2}, //6 18 {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2}, //7 19 {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2}, //8 20 {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2}, //9 21 {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2}, //10 22 {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2}, //11 23 {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2}, //12 24 {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2}, //13 25 {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2}, //14 26 {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2}, //15 27 {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2}, //16 28 {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2}, //17 29 {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2}, //18 30 {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2}, //19 31 {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2}, //20 32 }; 33 34 int blocktype[][][][] = { //ブロックタイプ 7種 回転 0度、90度、180度、360度 35 { 36 { //0-0 37 {0, 1, 0, 0}, 38 {0, 1, 0, 0}, 39 {0, 1, 0, 0}, 40 {0, 1, 0, 0} 41 }, 42---------------------------------------------------------------------省略 43 { //6-3 44 {0, 1, 0, 0}, 45 {1, 1, 1, 0}, 46 {0, 1, 0, 0}, 47 {0, 0, 0, 0} 48 } 49 } 50 }; 51 52 @Override 53 protected void onCreate(Bundle savedInstanceState) { 54 super.onCreate(savedInstanceState); 55 setContentView(R.layout.activity_main); 56 57 blockoutput(); 58 } 59 60 protected void display() { //画面に表示 61 TextView textView = findViewById(R.id.puzzle); 62 screen = ""; 63 64 for (i = 0; i <= 20; i++) { 65 for (j = 0; j <= 12; j++) { 66 if (field[i][j] == 1) { 67 screen = screen + '■'; 68 } else if (field[i][j] == 0) { 69 screen = screen + '□'; 70 } else { 71 screen = screen + '\n'; 72 } 73 } 74 } 75 textView.setText(screen); 76 } 77 78 protected void blockoutput() { //7種のブロックをrandomに1つ取り出して表示 79 random = (int) (Math.random() * 10 % 6); 80 81 display(); 82 for (z = 0; z + 3 <= 20; z++) { 83 for (x = 0; x <= 3; x++) { 84 for (y = 0; y <= 3; y++) { 85 if (blocktype[random][0][x][y] == 1) { 86 field[z + x][4 + y] = blocktype[random][0][x][y]; 87 } 88 } 89 } 90 try { 91 Thread.sleep(500); 92 display(); 93 } catch (InterruptedException e) { 94 } 95 } 96 } 97}

###修正後

java

1import android.support.v7.app.AppCompatActivity; 2import android.os.Bundle; 3import android.widget.TextView; 4 5 6public class MainActivity extends AppCompatActivity { 7 String screen; 8 int random, i, j, x, y, z; 9 10 int field[][] = //パズルの中身 11 { // 0 1 2 3 4 5 6 7 8 9 10 11 12 12 {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2}, //0 13 {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2}, //1 14 {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2}, //2 15 {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2}, //3 16 {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2}, //4 17 {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2}, //5 18 {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2}, //6 19 {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2}, //7 20 {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2}, //8 21 {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2}, //9 22 {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2}, //10 23 {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2}, //11 24 {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2}, //12 25 {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2}, //13 26 {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2}, //14 27 {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2}, //15 28 {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2}, //16 29 {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2}, //17 30 {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2}, //18 31 {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2}, //19 32 {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2}, //20 33 }; 34 35 int blocktype[][][][] = { //ブロックタイプ 7種 回転 0度、90度、180度、360度 36 { 37 { //0-0 38 {0, 1, 0, 0}, 39 {0, 1, 0, 0}, 40 {0, 1, 0, 0}, 41 {0, 1, 0, 0} 42 }, 43 -------------------------------------省略 44 { //6-3 45 {0, 1, 0, 0}, 46 {1, 1, 1, 0}, 47 {0, 1, 0, 0}, 48 {0, 0, 0, 0} 49 } 50 } 51 }; 52 53 @Override 54 protected void onCreate(Bundle savedInstanceState) { 55 super.onCreate(savedInstanceState); 56 setContentView(R.layout.activity_main); 57 58 blockoutput(); 59 } 60 61 protected void display() { //画面に表示 62 TextView textView = findViewById(R.id.puzzle); 63 screen = ""; 64 65 for (i = 0; i <= 20; i++) { 66 for (j = 0; j <= 12; j++) { 67 if (field[i][j] == 1) { 68 screen = screen + '■'; 69 } else if (field[i][j] == 0) { 70 screen = screen + '□'; 71 } else { 72 screen = screen + '\n'; 73 } 74 } 75 } 76 textView.setText(screen); 77 } 78 79 protected void blockoutput() { //7種のブロックをrandomに1つ取り出して表示 80 random = (int) (Math.random() * 10 % 6); 81 time tm = new time(); 82 83 display(); 84 for (z = 0; z + 3 <= 20; z++) { 85 for (x = 0; x <= 3; x++) { 86 for (y = 0; y <= 3; y++) { 87 if (blocktype[random][0][x][y] == 1) { 88 field[z + x][4 + y] = blocktype[random][0][x][y]; 89 } 90 } 91 } 92 display(); 93 tm.start(); 94 for (x = 0; x <= 3; x++) { 95 for (y = 0; y <= 3; y++) { 96 field[z + x][4 + y] = 0; 97 } 98 } 99 } 100 } 101} 102 103 104class time extends Thread { 105 public void run() { 106 try { 107 Thread.sleep(500); 108 } catch (InterruptedException e) { 109 } 110 } 111}

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

y_waiwai

2018/07/29 11:20

うまくいかないとは具体的にどうなるんですか?
退会済みユーザー

退会済みユーザー

2018/07/29 11:32

起動時に(sleep(500)×繰り返しの数)暗い画面が続き、表示されると落下処理が終了した後になっている。という状況です、説明になっているでしょうか?
退会済みユーザー

退会済みユーザー

2018/07/29 13:14

メインスレッドをとめてるからでは?
退会済みユーザー

退会済みユーザー

2018/07/29 14:08

for (x = 0; x < 1000000000; x++){}に変えてみたのですが起動が遅くなるだけでしたので、仕様上の問題なのでしょうか?
guest

回答2

0

ベストアンサー

たぶん、以下のようにすると想定しているような動きになると思います。

@Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); new Thread(new Runnable() { @Override public void run() { blockoutput(); } }).start(); }

みなさんがおっしゃっている通り、ただThread.sleep(500);としてもそこで処理するのを待つだけになります。
一連の処理が終わってから画面が描画されるので途中で止めてもその間に描画されることはありません。
そこで別のスレッドで処理を行うことで、メインの処理が止まらないので描画が行われます。
スレッドの概念などについては調べてみてください。

コメントへの回答:
アプリが落ちた場合にはエラー内容を貼っていただけるとありがたいです。
tm.start();の部分は特にこのように処理する必要もなく、動かなかったのでtime tm = new time();も消して、以下に書き換えて単純にsleepだけするようにしていました。

try { Thread.sleep(500); } catch (InterruptedException e) { }

これで私の環境では動いていました。
もしこれで動かなかった際には以下のように書き換えてみてください。
textView.setText(screen)のみmainスレッドで処理するようにしています。

public class MainActivity extends AppCompatActivity { Handler mHandler; // 省略 @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); mHandler = new Handler(); new Thread(new Runnable() { @Override public void run() { blockoutput(); } }).start(); } protected void display() { screen = ""; for (i = 0; i <= 20; i++) { for (j = 0; j <= 12; j++) { if (field[i][j] == 1) { screen = screen + '■'; } else if (field[i][j] == 0) { screen = screen + '□'; } else { screen = screen + '\n'; } } } mHandler.post(new Runnable() { @Override public void run() { TextView textView = findViewById(R.id.puzzle); textView.setText(screen); } }); } // 省略

投稿2018/07/30 10:03

編集2018/07/30 17:28
razuma

総合スコア1313

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2018/07/30 11:15

ありがとうございます。 Thread.sleep(500);で実行すると、fieldとbockの最初の表示はうまくいくのですが落下処理に入ってしまうとアプリが落ちてしまいます。 Thread.sleep(500);の値を100や3000に変えてみると、ブロックの位置が落下処理1回目の位置や4回目の位置が表示され、その状態からThread.sleep();の値の秒数経過するとアプリが落ちてしまいます。 このことから、onCreateの処理が終わるまでにtextに代入された文字列が表示されているように感じますが、私のプログラムはどこか間違っているのでしょうか?
退会済みユーザー

退会済みユーザー

2018/07/31 01:55

ありがとうございます。 ご回答の通りに実行すると想定した動きになりました。 長文に加えソースコードまで書いて下さり、ありがとうございました。
razuma

2018/07/31 02:42

想定通り動いたのであればよかったです。ゲームのようなものを実装するとなると通常のアプリ開発とはまた違った感覚が必要になったりすると思いますので少々大変かもしれませんね。(スレッドに関しては一般的な知識ではありますが、ちょっと難しいですよね。)
guest

0

onCreateでblockoutputを呼び出しているせいです。
起動時にonCreateから呼ばれたblockoutputがループごとに0.5秒停止することになるため、
onCreateの完了に時間がかかり、起動が遅くなるのです。

投稿2018/07/29 14:11

swordone

総合スコア20651

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2018/07/29 14:18

秒数を稼ぐためにThread.sleep(500);からfor (x = 0; x < 1000000000; x++){}に変えてみたのですが、症状は変わらず、起動の時間が遅くなるだけでしたので、別の所に原因があると思うのですがどうでしょうか?
swordone

2018/07/29 14:24

だからそれはonCreateでやってるからですってば。 onCreateはActivity起動時の画面構成を担ってて、全部終わらないと表示しないんです。 アニメーションの部類に入るため、SurfaceView(だったっけ?)などを使わないといけないのでは?
keicha_hrs

2018/07/29 14:43

テキストでテトリミノを描いているだけのようなので、SurfaceViewとかは必要なさそうですね。blockoutputを別スレッド化すればいいと思うのですが、さてどうしたものか・・・
退会済みユーザー

退会済みユーザー

2018/07/30 08:31

すみません。一通りjavaは学んだのですが実践的なブログラムはこれが初めてで、知識が及ばずご迷惑をおかけしました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問