アプリ版:「スタンプのみでお礼する」機能のリリースについて

iアプリで「非活性モードから一定時間が経過すると休眠モードへ移行する」処理をする際、
以下のコードで「10:非活性状態です」の表示のまま休眠モードになってしまいます。
(「0:休眠状態です」の表示にしてから休眠モードにしたい。)
(2台の携帯電話で実行しましたが、同じになります。)
原因がわかる方、アドバイスをお願いします。


//一部省略しています
//変数 mode(活性=2・非活性=1・休眠=0)

public void processEvent(int w_type,int w_param) {
  // タイマーイベント発生の場合に処理
  if ((w_type==Display.TIMER_EXPIRED_EVENT) && (w_param==w_timerID)) {
    counter++;  //←時間をカウントしています
    if(mode == 1 && counter > 10) {
      //10カウントで休眠状態へ
      mode = 0;
      repaint();
      counter = 0;
      timer.stop();
      sleep();
    }
    repaint();
  }
}
public void paint(Graphics g) {
  if(mode == 0) {
    g.drawString(counter+":休眠状態です", 50, 50);
  }
  else if(mode == 1) {
    g.drawString(counter+":非活性状態です", 50, 50);
  }
  else {
    g.drawString(counter+":活性化状態です", 50, 50);
  }
}

A 回答 (1件)

まず、counter=0;を行う前にrepaintしていますから、数字が10のままになってしまうんじゃないですか。

repaint前に変数は初期化しておかないと。

それからmode=0にしてrepaint後にsleepしているのですが、repaintは基本的に「可能な限り早く再描画処理を呼び出す」ということであって、常に再描画をし終わってから次の処理に進むわけではないでしょう。想像ですが、実際の再描画が行われる前にsleepが実行されてしまっているのでは? 例えば、再描画の処理を軽減するために、メソッドの実行が終わりidle状態に戻ってから再描画されるようになっている、などは考えられそうです。
 休眠状態にするときには変数の初期化などだけ行っておき(timerは止めない)、次のprosessEventでスリープする、というようにしてはどうでしょう。

実際にやってないので違っていたらすみません。
    • good
    • 0
この回答へのお礼

ご指摘ありがとうございます。

public void processEvent(int w_type,int w_param) {
  if ((w_type==Display.TIMER_EXPIRED_EVENT) && (w_param==w_timerID)) {
    counter++;
    if(mode == 1 && counter > 10) {
      mode = 0;
      repaint();
      counter = 0;
    }
    else if(mode == 0) {
      sleep();
    }
    repaint();
  }
}

sleep()を一段階遅らせる(?)ことで解決できました。


ちなみに、質問に書いたコードでは、実機ではうまく動かなかったのですが
DoJaのエミュレータでは期待通りに表示されました。
(エミュレータの待ち受け起動の仕方は今日知りました;)

>repaintは基本的に「可能な限り早く再描画処理を呼び出す」ということであって、
>常に再描画をし終わってから次の処理に進むわけではないでしょう。

Kyon2_PaPaさんのおっしゃる通りだと思います。


ありがとうございました。

お礼日時:2006/08/23 23:53

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!