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

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

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

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

Android

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

Android Studio

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

Q&A

解決済

2回答

1629閲覧

shandler.removeCallbacks(showMessageTask);でhandlerの予約を削除したい

giant

総合スコア132

Java

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

Android

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

Android Studio

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

0グッド

0クリップ

投稿2017/10/19 16:06

編集2017/10/19 18:31

想定している流れは、コンセントからスマホが抜かれた時にGPSの機能を持ったServiceをonにして、コンセントに接続された時には、接続されてから24時間後にGPSのserviceをoffにしたいと考えています。

そこで、なんどもコンセントから抜き差しを行った場合に、24時間のタイマーを複数起動することになってしまい、最後に発行したRunnableだけ実行したいなと思っています。

そこで、24時間が立たない限りは、一つRunnableを追加するごとに、前回のHandlerを取得して、handler.removeCallbacks(showMessageTask);
で、実行を行わないようにしたいと考えています。
しかし、24時間後には、コンセントを抜き差ししたぶんだけのRunnableが呼び出されてしまいました。
すでに発行してしまったRunnableを取り消す方法を教えていただけないでしょうか?

下のコードの流れを説明しています。

java

1handler.postDelayed(showMessageTask, 30000); 2//このコードで指定している時間の30秒以内に、電源の抜き差し(掲示したコードを呼び出すトリガー)を、2回行った時点で、 3 4}else if(aaa>=2){  5//の中に入って、このコードが呼び出されます。 6handler.postDelayed(showMessageTask, 30000); 7 8//30000ms後に 9public void run() { 10//が呼び出されるまでは、トリガーを引いたぶんだけ その都度その都度  11handler.removeCallbacks(showMessageTask); 12//このコードによって、過去に呼び出そうとした 13run() 14//が取り消されると考えていたのですが、2回以上トリガーを引いたぶんだけ、run()が呼び出されてしまいます。 15 16//最後に呼び出されたrunだけを指定した時間の30秒後に行うことはできるのでしょうか?

java

1 int aaa=powerStatuss.getRemoveHandlerCount(); 2 if (aaa==0) { 3 aaa++; 4 powerStatuss.setRemoveHandlerCount(aaa); 5 Toast.makeText(context, "aaa 古いHandlerはまだないから消さない"+powerStatus.getRemoveHandlerCount()+"になった", Toast.LENGTH_SHORT).show(); 6 7 }else if (aaa==1) { 8 aaa++; 9 powerStatuss.setRemoveHandlerCount(aaa); 10 //oldRemoveがtrueということは、handlerが複数動くことになるから古い方を消す。24時間経って実行されたら、falseをセットする 11 Toast.makeText(context, "aaa 古いHandlerはまだないから消さない"+powerStatuss.getRemoveHandlerCount()+"になった", Toast.LENGTH_SHORT).show(); 12 13 }else if(aaa>=2){ 14 //ここは古いhandlerを消す場所 15 aaa++; 16 powerStatuss.setRemoveHandlerCount(aaa); 17 Toast.makeText(context, "aaaa 古いHandlerを消して、最新のHandlerのみを残す"+powerStatuss.getRemoveHandlerCount()+"になった", Toast.LENGTH_SHORT).show(); 18 19 handler=powerStatus.getHandler(); 20//ここで、前回のhandlerを終了させたいです。 21 handler.removeCallbacks(showMessageTask); 22 } 23 24 25 26 handler = new Handler(); 27 powerStatus.setHandler(handler); 28 29 //この下で30秒後に、GPSのServiceを切断する 30 handler.postDelayed(showMessageTask, 30000); 31 32 showMessageTask= new Runnable() { 33 @Override 34 public void run() { 35 36 powerStatus.setRemoveHandlerCount(0); 37 Intent i_gps = new Intent(receiveContext, GpsService.class); 38 receiveContext.stopService(i_gps); 39 40 } 41 }; 42

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

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

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

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

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

yona

2017/10/19 16:44

「できません。」ではわかりません。もっと具体的に書いてください。時間の無駄になりますよ。
giant

2017/10/19 18:02 編集

指定している時間の30秒以内に、電源の抜き差し(掲示したコードを呼び出すトリガー)を、2回行った時点で、 }else if(aaa>=2){ の中に入って、handler.postDelayed(showMessageTask, 30000); このコードが呼び出されます。 30秒後に public void run() { が呼び出されるまでは、トリガーを引いたぶんだけ その都度その都度  handler.removeCallbacks(showMessageTask); このコードによって、過去に呼び出そうとした run()が取り消されると考えているのですが、 2回以上トリガーを引いたぶんだけ、run()が呼び出されてしまいます。
yona

2017/10/19 18:01

上記の内容をもっと整理して質問に追記てください。
giant

2017/10/19 18:02

了解致しました。
yona

2017/10/19 18:20 編集

あなたが作った不確かなコードで説明するのではなく、あなたが想定している動きを文章で説明してください。
guest

回答2

0

1回目のRunnableが削除されていないので、1回目とn回目のRunnableが実行されていると考えられます。
aaaをrunメソッド内でログ出力して確認してください。

投稿2017/10/19 18:26

yona

総合スコア18155

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

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

giant

2017/10/19 18:47

全て 最後の回の数字が出力されました。
giant

2017/10/20 00:47

2回目から、Runnableが2つ実行されるようになるので、古いRunnable(2回目に消されるのは、1回目のRunnable)を消すようなコードを考えています。
giant

2017/10/20 00:49

そのため handler=powerStatus.getHandler(); このようなコードで、前回のhandlerを持ってきています。 handler.removeCallbacks(showMessageTask); で、Runnableを取り消すなら、showMessageTaskも、過去のものを持ってこないといけないでしょうか?
guest

0

自己解決

java

1 public Handler handler; 2 PowerStatus powerStatuss = new PowerStatus(); 3 // Runnable showMessageTask; 4 int aaa; 5 6 //電源に接続された時と、アプリ起動時には、すでに電源に接続されていた時に呼び出される 7 public void gpsStopper(Context context) { 8 Toast.makeText(context, "aaa 電源ケーブルが接続された。24時間後にserviceを起動する", Toast.LENGTH_SHORT).show(); 9 10 11 12 aaa=powerStatuss.getRemoveHandlerCount(); 13 if (aaa==0) { 14 Log.e(TAG, "aaa 0回目だった"); 15 aaa++; 16 17 powerStatuss.setRemoveHandlerCount(aaa); 18 Toast.makeText(context, "aaa 古いHandlerはまだないから消さない"+powerStatus.getRemoveHandlerCount()+"になった", Toast.LENGTH_SHORT).show(); 19 20 }else if (aaa==1) { 21 Log.e(TAG, "aaa 1回目だった"); 22 23 //ここまでは、1回で終わる 24 aaa++; 25 powerStatuss.setRemoveHandlerCount(aaa); 26 //oldRemoveがtrueということは、handlerが複数動くことになるから古い方を消す。24時間経って実行されたら、falseをセットする 27 Toast.makeText(context, "aaa 古いHandlerはまだないから消さない"+powerStatuss.getRemoveHandlerCount()+"になった", Toast.LENGTH_SHORT).show(); 28 29 }else if(aaa>=2) { 30 //ここは古いhandlerを消すもの 31 Log.e(TAG, "aaa 2回目以上だった。" + aaa + "回目"); 32 aaa++; 33 powerStatuss.setRemoveHandlerCount(aaa); 34 35 if (aaa % 2 == 0) { 36 Log.e(TAG,"aaa 2以上の、偶数回("+aaa+"回)呼ばれたので、powerStatus.getHandlerして、removeCallbackする"); 37 38 Toast.makeText(context, "aaa 古いHandlerを消して、最新のHandlerのみを残す" + powerStatuss.getRemoveHandlerCount() + "になった", Toast.LENGTH_SHORT).show(); 39 40 41 Log.e(TAG,"aaa ------------ここでgetHandlerをしてremoveする--------"); 42 handler = powerStatus.getHandler(); 43 44 45 if (handler == null) { 46 Log.e(TAG, "removeCallbackをする時のhandlerはnull、removeCallbackした"); 47 } 48 Log.e(TAG, "aaa handlerを消す"); 49 handler.removeCallbacksAndMessages(null); 50 } 51 } 52 53 54 55 56 57 if(aaa%2==0) { 58 Log.e(TAG, "aaa-----------偶数回なら絶対ここを通る--------------"); 59 //これも偶数回で制限 60 61 //ここは全部入れる 62 handler = new Handler(); 63 powerStatus.setHandler(handler); 64 Log.e(TAG, "aaa ここでnew Handlerしてセットしている"); 65 Log.e(TAG, "aaa " + aaa + "回目(偶数)だから、powerStatusにhandlerをセットした"); 66 Log.e(TAG, "aaa これを次の偶数回の時に、powerStatus.getして、そのhandlerを削除する。"); 67 68 Log.e(TAG,"aaa -------タイマーをセット"+ aaa + "回目のpostDelayedでタイマーをセット----------"); 69 70 71 handler.postDelayed(new Runnable() { 72 @Override 73 public void run() { 74 75 aaa = powerStatuss.getRemoveHandlerCount(); 76 Log.e(TAG, "aaa run()が呼び出された。aaaの数値は、" + aaa + "だった"); 77 78 79 80 Log.e(TAG, "aaa Serviceを停止したので、countを0に戻します。"); 81 powerStatus.setRemoveHandlerCount(0); 82 83 Intent i_gps = new Intent(receiveContext, GpsService.class); 84 receiveContext.stopService(i_gps); 85 86 aaa = powerStatuss.getRemoveHandlerCount(); 87 88 Log.e(TAG, "aaa ここではもう既に設定を終えている"); 89 90 } 91 //ここで、20秒後にpostDelayedを行う 92 }, 20000); 93 94 } 95 96 } 97

投稿2017/10/20 08:44

giant

総合スコア132

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問