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

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

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

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

受付中

Android 画面を切るとTimerの間隔が遅くなる問題

teresa
teresa

総合スコア7

Android

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

2回答

1評価

0クリップ

7206閲覧

投稿2016/02/28 04:30

実現したいこと
AndroidのService内で15秒毎にサーバにリクエストを投げる

Java

package net.aaa.sample; import android.app.Service; import android.content.Context; import android.content.Intent; import android.os.Handler; import android.os.IBinder; import android.util.Log; import net.aaa.sample.MyLoader; import org.json.JSONObject; import java.util.ArrayList; import java.util.Date; import java.util.List; import java.util.Timer; import java.util.TimerTask; /** * Reference: * http://blog.oukasoft.com/%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%A0/%E3%80%90android%E3%80%91%E3%82%B5%E3%83%BC%E3%83%93%E3%82%B9%EF%BC%88service%EF%BC%89%E3%82%92%E4%BD%BF%E3%81%A3%E3%81%A6%E3%83%90%E3%83%83%E3%82%AF%E3%82%B0%E3%83%A9%E3%82%A6%E3%83%B3%E3%83%89/ */ public class MyService extends Service { private static boolean running = false; private Timer mTimer = null; Handler mHandler = new Handler(); private Context context; public MyService() { } @Override public void onCreate() { Log.i("MyService", "onCreate"); context = this.getApplicationContext(); } @Override public int onStartCommand(Intent intent, int flags, int startId) { Log.i("MyService", "onStartCommand"); if(running){ return START_STICKY; } mTimer = new Timer(true); mTimer.schedule( new TimerTask(){ @Override public void run(){ mHandler.post( new Runnable(){ public void run(){ Log.d( "MyService" , "Timer run" ); bgMain(); } }); } }, 1000, 1000*15); running = true; return START_STICKY; } @Override public IBinder onBind(Intent intent) { Log.i("MyService", "onBind"); return null; } // 15秒に一度この関数が呼ばれserverにアクセスします private void bgMain() { // get data from server MyLoader asyncJsonLoader = new MyLoader(new MyLoader.AsyncCallback() { // 実行前 public void preExecute() { } // 実行後 public void postExecute(JSONObject result) { // do something //... } // 実行中 public void progressUpdate(int progress) { } // キャンセル public void cancel() { } }); // 処理を実行 asyncJsonLoader.executeWithDto(context); } }

問題
ある条件下で、指定したはずの15秒毎に実行されず、数分〜数時間毎に実行されてしまいます。
画面を切るとこの問題が起きはじめ、3分以内に30秒毎くらいの間隔に落ちます。時間が立つとさらにこの遅れは拡大してゆき、最終的に1時間以上に広がることもあります。

再現条件
少なくともAndroid 6.0.1(実機)とAndroid 4.1.2(実機)で問題が起こることを確認しています。
・Androidの電源ボタンを一度押し、画面をOffにすると問題が再現します
・ただし画面がOffであっても充電中の場合は問題は起きませんでした(このためDebugが非常に困難です。Timerの中でサーバにアクセスしているので、そのサーバのaccessログを見ることで問題を確認しました)

質問
いかなる状況であってもTimerを必ず15秒毎に実行したいのですが、どのように書き換えればよいでしょうか?

良い質問の評価を上げる

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

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

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

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

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

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

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

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

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

まだ回答がついていません

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

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

ただいまの回答率
87.20%

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

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

質問する

関連した質問

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

Android

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