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

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

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

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

Android

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

スレッドセーフ

マルチスレッド環境において、複数のスレッド上で常に正常に実行する事が可能なコードを、スレッドセーフなコードと呼びます。

Android Studio

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

Q&A

解決済

1回答

1083閲覧

androidのHandlerがうまく使えません。。。

kipipipi

総合スコア60

Java

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

Android

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

スレッドセーフ

マルチスレッド環境において、複数のスレッド上で常に正常に実行する事が可能なコードを、スレッドセーフなコードと呼びます。

Android Studio

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

0グッド

0クリップ

投稿2020/07/07 09:29

編集2020/07/08 01:29

現在外部の別アプリからブロードキャストを受けて、画像を表示するアプリを作っています。

メインではまず、起動されたら初期設定の画像を順番にスライドさせています。
外部からブロードキャストを受けたら、そのデータからIDを取り出して、そのリストに合う画像のリストを切り替えて、またスライド(Animetor使用)させたいです。
一応ブロードキャスト無視して良いのであれば問題なくスライドショーしています。

毎秒ブロードキャストをチェックして、受けたらすぐに切り替えられるようにしたいので下記のコードを見よう見まねで書いたのですが、
いざテストしてみると切り替わるものの、内部でカウントさせている [int Count = 0;] フラグが次々に書き換わり、表示させている画像が重なったり、高速で入れ替わる、画像がスライドしなくなる、などうまく行きません。

●気になっている点1
このスライドショーはアニメーションが終わることを検知して画像を入れ替える(画像同士が再生し合う)仕組みで永久ループになっているのが問題なのでは??と思っています。
●気になっている点2
Countが高速で切り替わっているところをを考えると、それぞれのスレッドでCountを利用しているために起こっている現象なのでは??と考えています。つまり、スレッドセーフになっていない??(言葉の使い方が合っているのか自信がありませんが)

他に探り方が思いつかないため、ざっくりとしたコードで申し訳ありませんが何か心当たりがありましたら教えて頂けると嬉しいです。

できる範囲で他のコードも載せます。
よろしくお願いします。

java

1// グローバル変数 リストから画像を順番に取り出すために使用中 2// アニメーションスタート時(スライド開始時)にカウントを増やしています。 3int Count = 0; 4 5 6 public void CheckBroadManager(){ 7 //1秒ごと 8 int time = 1000; 9 Timer timer = new Timer(); 10 11 timer.schedule(new TimerTask() { 12 @Override 13 public void run() { 14 SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMddHHmmss"); 15 Long NowUnixTime = getNowDateStr();//現在の時刻を取得するメソッド 16 17 // Broadcastを受けているかどうか判定 18 if(BroadcastData != null){ 19 try { 20 long BroadFaceUnixTime = sdf.parse(BroadFaceData[3]).getTime()/1000L; //ブロードキャストされたデータから時刻を抜いてます 21 if((NowUnixTime - BroadFaceUnixTime) < 2){ // ブロードキャストのデータと現在の時差が0~2くらいの間であれば下記の操作をしたい 22 if(!switchFlag) { 23 handler.post(new Runnable() { 24 @Override 25 public void run() { 26 frameLayout.removeAllViews(); // メインのviewを全て削除 27 initialSetView("あるリストを読み込んで画像をセットする自作メソッドです"); 28 usuFlag = false; //フラグを立ててチェック 29 switchFlag = true; //フラグを立ててチェック 30 } 31 }); 32 } 33 }else{ 34 if (!usuFlag) { 35 handler.post(new Runnable() { 36 @Override 37 public void run() { 38 frameLayout.removeAllViews(); メインのviewを全て削除 39 initialSetView("あるリストを読み込んで画像をセットする自作メソッドです"); 40 usuFlag = true; //フラグを立ててチェック 41 switchFlag = false; //フラグを立ててチェック 42 } 43 }); 44 } 45 } 46 } catch (ParseException e) { 47 e.printStackTrace(); 48 } 49 } 50 } 51 }, 0, time); 52 }

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

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

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

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

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

guest

回答1

0

自己解決

こちら完全に勘違いしており、アニメーションやvideoviewをしっかりポーズさせていないためにカウントが止まらない現象でした。(何を伝わらないかと思いますが。。。)
ご迷惑おかけしました。

投稿2020/07/22 08:55

kipipipi

総合スコア60

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問