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

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

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

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

Android

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

Android Studio

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

Android Emulator

Android EmulatorはアンドロイドのOSで起動しているアンドロイドのデバイスの機能をシミュレートするソフトウェアです。Emulatorは開発者に複数の違う設定を持ったデバイスを必要とすることなくアプリケーションを開発しテストすることが可能になります。

Q&A

1回答

1621閲覧

入力された時間ごとに画像を切り替えたい。

TA-KEY

総合スコア21

Java

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

Android

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

Android Studio

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

Android Emulator

Android EmulatorはアンドロイドのOSで起動しているアンドロイドのデバイスの機能をシミュレートするソフトウェアです。Emulatorは開発者に複数の違う設定を持ったデバイスを必要とすることなくアプリケーションを開発しテストすることが可能になります。

0グッド

0クリップ

投稿2018/06/18 23:26

入力された値(ここではtumami変数に1000という数字を代入して入力の代わりにしています。)が経過するごとに画像を表示するプログラムを書いています。
画像は8枚用意しており、ボタンを押すと1枚目から順番に表示され、8枚目が表示されるとループが終わるようにします。
しかし、実行するとなぜか画像は表示されず、8秒後くらいに8枚目の画像だけが表示されてしまいます。エラーは起きておらず、デバッグをして挙動を見ても正常に動いているように見えますが、画像が表示されるのは8枚目だけなので困っています。
教えていただけると嬉しいです。これを調べるといいよという内容でもありがたいです。
Autoという変数がありますが、ここでは関係ないので無視でお願いします。

java

1public class MainActivity extends AppCompatActivity implements Runnable, page1.OnFragmentInteractionListener, page2.OnFragmentInteractionListener, page3.OnFragmentInteractionListener { 2 int tumami; 3public void startOnClick(View v){ 4 //テスト用 5 List<Integer> setCards = Arrays.asList(R.drawable.img_0066,R.drawable.img_0070,R.drawable.img_0055,R.drawable.img_0012,R.drawable.img_0015,R.drawable.img_0036,R.drawable.img_0009,R.drawable.img_0048); 6 String Auto = "on"; 7 tumami = 1000; 8 9 10 //もしAutoならtumami(1秒)ごとに1枚表示 11 if(Auto == "on"){ 12 for(int i=0; i<9; i++ ){ 13 MultiThread mt = new MultiThread(tumami); 14 mt.start(); 15 try { 16 mt.join(); 17 nextCard(setCards.get(i)); 18 } catch (Exception e) { 19 e.printStackTrace(); 20 } 21 22 if(i==8){ 23 System.out.println("fin!"); 24 break; 25 } 26 } 27 } 28 } 29 30 public void nextCard(int card) { 31 ((ImageView) findViewById(R.id.justUseCard)).setImageResource(card); 32 } 33 34}

java

1class MultiThread extends Thread { 2 int tumami; 3 4 public MultiThread(int tumami){ 5 6 } 7 8 public void run() { 9 try { 10 Thread.sleep(tumami); 11 } catch (InterruptedException e) { 12 e.printStackTrace(); 13 } 14 } 15}

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

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

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

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

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

guest

回答1

0

スレッド側から画像を変更する必要があるのではないでしょうか?

if(Auto == "on"){

if(Auto == "on" && mtが実行中で無い場合){
mt.start();
}

for文内の画像セットがスレッド側に移動するイメージです。

但し、Androidの場合、メインスレッド以外からのUI変更は出来ないため
単純にThreadからの画像変更はできませんので注意が必要です。

投稿2018/06/19 02:59

arcanum_jp

総合スコア94

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

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

TA-KEY

2018/06/19 05:00

スレッド側から画像を変更する必要があるが、メインスレッド以外からは変更できないという点に混乱しています。 知識不足で申し訳ありませんが、 もう少し、具体的に教えていただけないでしょうか。
arcanum_jp

2018/06/19 05:35

(現状、実行環境が無いので想像もありますが・・・) 今のコードを画像を変更した後に、画面の再描画を依頼させるというのはどうでしょうか?画像は変更されていますが、画面の再描画を行っていないようにみうけられましたので。View#invalidate()あたりかと記憶していますが・・・ 以下、先ほどの自分のコメントに対してです。 まず、タップイベント内でforで回していますが、この場合、sleepしている時間だけ、端末のUIが止まります。(他のボタンとかは効きますでしょうか?)1000msecしか休んでないよと言われそうですが、ユーザーから見れば1000msecごとに分からないほどのUI復帰で実際には8秒間端末が死んでいる状態として見られます。そのため、タップイベント自身は画像変更スレッドの開始だけにしてUIにすぐ復帰させる必要があります。 画像変更スレッドはご質問であればMultiThread クラスに当たり、ここでtumami ミリ秒ごとに画像を変更する処理を記載すればよいです。 さきほどのメインスレッド以外からは、という話ですが、UIを表示しているスレッドがメインスレッドと考えてよいです。そのため別スレッドとなるMultiThread はメインスレッド以外ですので、このスレッドがUIの変更を行おうとするとAndroidから例外が送出されます。この辺は ”android メインスレッド以外からUI変更” あたりで調べると回避方法は出てきます。先の検索で出てきた記事などによりますと、Handlerクラスを利用してメインスレッドに変更を依頼すればよいとあります。 書き方自身は定型的なものなので、あとはそれにTA-KEYさんが書かれた描画処理を基に追加してみればよいと思います。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問