timerが落ちてしまいます

455 views
Skip to first unread message

たま

unread,
May 17, 2014, 12:02:25 PM5/17/14
to android-g...@googlegroups.com
timer.scheduleAtFixedRate で6秒ごとに数字をカウントアップしてtextView表示したいのですが、6秒後に落ちます。
ソースは下記のようにしています。

        Timer timer =new Timer(true);
        timer.scheduleAtFixedRate(new TimerTask() {

            @Override
            public void run() {
                //mSePlayer.play(mSound[1], 1.0f,1.0f,0,0,1.0f);

                MainActivity.handler.post(new Runnable() {
                    @Override
                    public void run() {
                        textView=(TextView)findViewById(R.id.textView);
                        textView.setText(String.valueOf(countNum));
                        countNum++;

                    }
                });run();
            }
        },0,TimeUnit.MILLISECONDS.toMillis(6000));


wrong threadによるhierarchy エラーですのでhandler.postしてみたのですが、したのようなエラーが出ます。
・Handler()のインスタンスを生成できない、
・post(new Runnable()は型Handlerで未定義です

どう直せば良いでしょうか?何から何まですいません。お願いします。

  static Handler handler = new Handler();   ←Handler()のインスタンスを生成できない

  Timer timer =new Timer(true);
        timer.scheduleAtFixedRate(new TimerTask() {

            @Override
            public void run() {
                //mSePlayer.play(mSound[1], 1.0f,1.0f,0,0,1.0f);

                MainActivity.handler.post(new Runnable() {  ←post(new Runnable()は型Handlerで未定義です

                    @Override
                    public void run() {
                        textView=(TextView)findViewById(R.id.textView);
                        textView.setText(String.valueOf(countNum));
                        countNum++;

                    }
                });run();
            }
        },0,TimeUnit.MILLISECONDS.toMillis(6000));

noxi

unread,
May 17, 2014, 12:25:34 PM5/17/14
to android-g...@googlegroups.com
noxiです。

以下の2点が必要です。

1.Handlerをstaticで持たない、newしない
staticなHandlerはリークの元ってどこかで読んだ気がします。
またstaticイニシャライザ?が動くスレッドはUIスレッドでは無いはずで、
static new Hanlderは利用出来ないかな、と。

2.HandlerをonCreateで生成する

private Handler handler;

protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
handler = new Handler();
}

上のようにすれば、正常に動作するはずです。
Handlerは内部に自身を生成したスレッドを持っているので?
UIスレッドで動作させる目的なら、UIスレッド上でインスタンス生成しないとダメです。


ちなみに、Handlerを利用しなくとも、Viewのpostメソッド経由で更新出来ます。
http://developer.android.com/reference/android/view/View.html#post%28java.lang.Runnable%29


2014年5月18日 1:02 たま <5aroa...@gmail.com>:
> --
> このメールは Google グループのグループ「日本Androidの会」に登録しているユーザーに送られています。
> このグループから退会し、グループからのメールの配信を停止するには
> android-group-j...@googlegroups.com にメールを送信してください。
> このグループに投稿するには android-g...@googlegroups.com にメールを送信してください。
> http://groups.google.com/group/android-group-japan からこのグループにアクセスしてください。
> その他のオプションについては https://groups.google.com/d/optout にアクセスしてください。

たま

unread,
May 17, 2014, 1:51:52 PM5/17/14
to android-g...@googlegroups.com, android.w...@gmail.com
noxi様ありがとうございます。

仰る通りhandlerを変えたのですが、それでもインスタンス生成できないエラーになります。
というかactivity をextendsしたクラスで、そうしていたのですが、
正解は、もしかして別にviewをextendsしたクラスを作り、そこでtimerするべきなのでしょうか?数秒ごとに画面を更新するわけですし。

noxi

unread,
May 17, 2014, 2:16:30 PM5/17/14
to android-g...@googlegroups.com
noxiです。

私は、これで動いているので、何か間違えているのでしょう。
https://gist.github.com/noxi515/edea22698b444b344885

例えばHandlerが、android.os.Handlerではなくjava.util.logging.Handlerをインポートしているとか、
Activity#onCreateの中に実装し、Activityを自分でnewしてonCreateメソッドを呼んでいるとか。

Timer抱えたViewを作成するかどうかは、どう言う処理をするかによって変わると思います。


2014年5月18日 2:51 たま <5aroa...@gmail.com>:

たま

unread,
May 20, 2014, 5:16:21 AM5/20/14
to android-g...@googlegroups.com, android.w...@gmail.com
noxi様、感謝の極みです。動きました。インポートが原因でした。os.handlerにしました。
コードもありがとうございます。特にhandler経由の方法がとても良さそうです。使わせて頂きます。^^!
Reply all
Reply to author
Forward
0 new messages