ここから本文です

Thread.sleep(1000);というコードを入れると「エラー: 例外InterruptedExceptionは...

アバター

ID非公開さん

2019/6/1317:22:25

Thread.sleep(1000);というコードを入れると「エラー: 例外InterruptedExceptionは報告されません。

スローするには、捕捉または宣言する必要があります」というエラーがでました。改善する方法を教えてください。
様々なサイトを見させていただいたのですが、理解できませんでした。

package com.example.mogura;

import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.ImageView;
import android.widget.TextView;

import java.util.Random;

public class MainActivity extends AppCompatActivity {

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
setImage();
}

Random r = new Random();
int place;
int score;
int previous = 9;

public void setImage(){
while(previous==place) {
place = r.nextInt(4);
}
previous = place;

if(place==0){
((ImageView)findViewById(R.id.mogura1)).setImageResource(R.drawable.mogura);
}
if(place==1){
((ImageView)findViewById(R.id.mogura2)).setImageResource(R.drawable.mogura);
}
if(place==2){
((ImageView)findViewById(R.id.mogura3)).setImageResource(R.drawable.mogura);
}
if(place==3) {
((ImageView) findViewById(R.id.mogura4)).setImageResource(R.drawable.mogura);
}
}

public void setScore(){
((TextView)findViewById(R.id.score)).setText("Score:"+score);
}

public void hit1(View v){
if(place == 0){
((ImageView)findViewById(R.id.mogura1)).setImageResource(R.drawable.hit);
score++;
setScore();
//1秒待つ
Thread.sleep(1000);
((ImageView)findViewById(R.id.mogura1)).setImageResource(R.drawable.none);
setImage();
}
}

public void hit2(View v){
if(place == 1){
((ImageView)findViewById(R.id.mogura2)).setImageResource(R.drawable.hit);
score++;
setScore();
((ImageView)findViewById(R.id.mogura2)).setImageResource(R.drawable.none);
setImage();
}
}

public void hit3(View v){
if(place == 2){
((ImageView)findViewById(R.id.mogura3)).setImageResource(R.drawable.hit);
score++;
setScore();
((ImageView)findViewById(R.id.mogura3)).setImageResource(R.drawable.none);
setImage();
}
}


public void hit4(View v){
if(place == 3){
((ImageView)findViewById(R.id.mogura4)).setImageResource(R.drawable.hit);
score++;
setScore();
((ImageView)findViewById(R.id.mogura4)).setImageResource(R.drawable.none);
setImage();
}
}

}

閲覧数:
24
回答数:
2

違反報告

ベストアンサーに選ばれた回答

プロフィール画像

カテゴリマスター

rp0********さん

2019/6/1409:19:13

Thread.sleep()はスレッドを任意の時間止めます。で、途中で割り込みが発生して設定時間より早く停止が終わってしまったらどうするのか?
までを、ソースコードで書かないといけないメソッドです。

なので
Thread.sleep(1000);

try{
Thread.sleep(1000);
} catch(InterruptedException e) {
// 1秒未満で停止が終わったら何するか書く
// 何も考慮しない時はログだけ入れたりする
}

ってかんじで使用します。
これでコンパイルは通るかと。


余談ですが
これは、Androidのコードですか?
モグラ1のボタンを押すと1秒間ヒット画像表示、その後画像消去
に見えますが、Thread.sleepでは実現できません。

setImageResourceで画像切替えしてますが、これは即画面に反映されるわけではなく、FWが画面更新したいタイミングで表示されます。
しかし、Thread.sleepを入れることで、FWが上記の判断をするスレッドを1秒停止させる為、画面は1秒固まるだけになるはずです。
そして、
Androidは、Mainスレッドを止めることを推奨していません。

なので、Androidでは、n秒後に表示更新を「予約する」という方法で、スレッドを止めずに実現させます。
それを行うのがHandlerクラスです。


以下のように変更する

//1秒待つ
Thread.sleep(1000);
// 1秒後にやりたい処理 ((ImageView)findViewById(R.id.mogura1)).setImageResource(R.drawable.none);
setImage();



new android.os.Handler().postDelayed(new Runnable() {
@Override public void run() {
((ImageView)findViewById(R.id.mogura1)).setImageResource(R.drawable.none);
setImage();

}
}, 1000); // 1秒後、run()の実行を予約


コンパイルは通してないので、誤字ってたらすいません。。

  • アバター

    質問者

    ID非公開さん

    2019/6/1419:25:49

    お忙しい中ご丁寧な解説をしていただきありがとうございました。本当に助かりました。ただ、教えていただいたコードの意味は全く分かりません。現在はJavaやAndroidStudio等の書籍を読んでサンプルプログラムをまねしながら勉強しているのですが、おすすめの勉強法などございましたら教えていただけると嬉しいです。

  • その他の返信(2件)を表示

返信を取り消しますが
よろしいですか?

  • 取り消す
  • キャンセル

ベストアンサー以外の回答

1〜1件/1件中

nan********さん

2019/6/1321:24:24

sleepは何らかの理由で中断される(指定した時間より早く終わる)事があり、その時はInterruptedException例外が発生します。
それをキャッチするなり何なりしないとJavaではコンパイルエラーになります。
まぁ実際は中断される事はないので、try..catchで囲んでおけば問題ないです。

返信を取り消しますが
よろしいですか?

  • 取り消す
  • キャンセル

あわせて知りたい

みんなで作る知恵袋 悩みや疑問、なんでも気軽にきいちゃおう!

Q&Aをキーワードで検索:

Yahoo! JAPANは、回答に記載された内容の信ぴょう性、正確性を保証しておりません。
お客様自身の責任と判断で、ご利用ください。
本文はここまでです このページの先頭へ

「追加する」ボタンを押してください。

閉じる

※知恵コレクションに追加された質問は選択されたID/ニックネームのMy知恵袋で確認できます。

不適切な投稿でないことを報告しました。

閉じる