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

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

ただいまの
回答率

90.52%

  • Java

    13753questions

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

  • Android

    6507questions

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

  • Android Studio

    3691questions

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

  • Android Emulator

    123questions

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

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

受付中

回答 1

投稿

  • 評価
  • クリップ 0
  • VIEW 211

TA-KEY

score 13

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

public class MainActivity extends AppCompatActivity implements Runnable, page1.OnFragmentInteractionListener, page2.OnFragmentInteractionListener, page3.OnFragmentInteractionListener {
    int tumami;
public void startOnClick(View v){
        //テスト用
        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);
        String Auto = "on";
        tumami = 1000;


        //もしAutoならtumami(1秒)ごとに1枚表示
        if(Auto == "on"){
            for(int i=0; i<9; i++ ){
                MultiThread mt = new MultiThread(tumami);
                mt.start();
                try {
                    mt.join();
                    nextCard(setCards.get(i));
                } catch (Exception e) {
                    e.printStackTrace();
                }

                if(i==8){
                    System.out.println("fin!");
                    break;
                }
            }
        }
    }

    public void nextCard(int card) {
        ((ImageView) findViewById(R.id.justUseCard)).setImageResource(card);
    }

}
class MultiThread extends Thread {
    int tumami;

    public MultiThread(int tumami){

    }

    public void run() {
        try {
            Thread.sleep(tumami);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }
}
  • 気になる質問をクリップする

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 1

+1

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

if(Auto == "on"){

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

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

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

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2018/06/19 14:00

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

    キャンセル

  • 2018/06/19 14:35

    (現状、実行環境が無いので想像もありますが・・・)

    今のコードを画像を変更した後に、画面の再描画を依頼させるというのはどうでしょうか?画像は変更されていますが、画面の再描画を行っていないようにみうけられましたので。View#invalidate()あたりかと記憶していますが・・・

    以下、先ほどの自分のコメントに対してです。

    まず、タップイベント内でforで回していますが、この場合、sleepしている時間だけ、端末のUIが止まります。(他のボタンとかは効きますでしょうか?)1000msecしか休んでないよと言われそうですが、ユーザーから見れば1000msecごとに分からないほどのUI復帰で実際には8秒間端末が死んでいる状態として見られます。そのため、タップイベント自身は画像変更スレッドの開始だけにしてUIにすぐ復帰させる必要があります。

    画像変更スレッドはご質問であればMultiThread クラスに当たり、ここでtumami ミリ秒ごとに画像を変更する処理を記載すればよいです。

    さきほどのメインスレッド以外からは、という話ですが、UIを表示しているスレッドがメインスレッドと考えてよいです。そのため別スレッドとなるMultiThread はメインスレッド以外ですので、このスレッドがUIの変更を行おうとするとAndroidから例外が送出されます。この辺は

    ”android メインスレッド以外からUI変更”

    あたりで調べると回避方法は出てきます。先の検索で出てきた記事などによりますと、Handlerクラスを利用してメインスレッドに変更を依頼すればよいとあります。

    書き方自身は定型的なものなので、あとはそれにTA-KEYさんが書かれた描画処理を基に追加してみればよいと思います。

    キャンセル

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

  • ただいまの回答率 90.52%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

  • 解決済

    javaのclassをまとめたい

    質問内容 eclipseを使用してjavaのマルチスレッド(3つ)を作る課題をやっているんですが,現段階ではスレッドごとにクラスを作り処理を行っています。 最終的には一つのクラ

  • 解決済

    スレッドについて

    http://www.techscore.com/tech/Java/JavaSE/Thread/3/ ここのサイトでスレッドについて調べています。 複数のスレッドが同じオ

  • 解決済

    きれいに描画する方法

    花びらが落ちていく、というようなプログラムを作っています。 コード public class Applet3D extends Applet implements Runna

  • 解決済

    Javaのスレッドの対象インスタンスについて

    Javaのsynchronized修飾子の対象インスタンスについての質問です。 http://www.tohoho-web.com/java/thread.htm こちらの記事

  • 解決済

    Javaで子スレッドの異常を検知し、他スレッドを終了

    Javaで子スレッドの異常を親スレッドで検知し、その際に、他の子スレッドをを終了するプログラムを作成したいと考えています。 具体的には クラスAで、複数の子スレッドを作成し

  • 解決済

    スレッドの使い方について、口座システムを作りたい

    前提・実現したいこと Javaを用いて、二人(husbandとwife)が100円の出入金を繰り返すプログラムを2つのスレッドを使ってつくりたいのですが、「Thread[Thre

  • 受付中

    Java スレッド同士の待ち合わせについて

    前提・実現したいこと 入門書を参考にしました。 スレッド同士を待ち合わせるプログラムで、 3つのproducerと3つのconsumerが5つのキューで数字を入れ食いするプロ

  • 解決済

    マルチスレッドによる計算

    以下のようにマルチスレッドを使ってある数に1を永遠とたすプログラムを組んだのですが、スレッドが切り替わるたびに計算結果がずれてしまいます・・・ 原因と解決方法を教えてください・・

同じタグがついた質問を見る

  • Java

    13753questions

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

  • Android

    6507questions

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

  • Android Studio

    3691questions

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

  • Android Emulator

    123questions

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