読者です 読者をやめる 読者になる 読者になる

Shut the fuck up and write some code

グダグダ言わずにコードを書きたいブログ

Handlerのサンプルを作ってみた。

前回のThread編
http://d.hatena.ne.jp/verytired/20090415/1239810993
の続きでHandler編です。サンプルの内容は10秒カウント表示するだけ。


基本はHandlerクラスのインスタンス作るって


sendMessageDelayedをコール

handleMessageが呼ばれる

handleMessageの中でsendMessageDelayedを呼ぶ

handleMessageが呼ばれる

ループ


なのだが、良くわからん。obtainMessage(0)って何?リサーチが足らず、よくわかってません。


参考
http://d.hatena.ne.jp/s_welt/20071114/1195000557
http://www.hakkaku.net/articles/20090212-348#more-348
この二つを足して2で割った感じで。


http://d.hatena.ne.jp/minghai/20081007/p1
こちらがとても参考になっているのですが
>この時に注意が必要なのはAndroidではViewへの更新はほとんどの場合、Handlerを経由してリクエストしなければならないことです。
え、ええ!
つか全くをもってよくわからなくなってきた。
スレッドでループさせて、描画するときはsendMessageDelayedから処理を行うということになるのかどうなのか。
サンプルのルナランダーのソースを読むかな。・・・って1.5にはサンプル付いてるのかね。ネットを見てると一手間も二手間も必要でインスコが面倒そうなので、ぼかあ正式版待ちにします!


ソース

package com.example.testHandler;

import android.app.Activity;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.content.Context;
import android.view.View;
import android.graphics.*;

public class testHandler extends Activity {
	
    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle icicle) {
        super.onCreate(icicle);
        setContentView(new SampleView(this));
    }
   
}

/**描画クラス*/
class SampleView extends View {
	
	private int delayTime=1;
	private Paint Paint = new Paint();
	private int drawCount = 0;
	private RefreshHandler RedrawHandler = new RefreshHandler(this,delayTime);
	
	/**コンストラクタ*/
	public SampleView(Context context) {
		super(context);
		setFocusable(true);
		RedrawHandler.start();
	}
	
	@Override
	protected void onDraw(Canvas canvas) {
		
		Paint paint = Paint;
		canvas.drawColor(Color.WHITE);
        paint.setTextSize(16);
        paint.setColor(0xFF000000);
        
        canvas.drawText("sec_count: "+drawCount,30,30,paint);
        drawCount++;
        
	}
	
	public void update() {		
		RedrawHandler.sleep();
	}
	
	public int getCount(){
		return drawCount;
	}
}

/**ハンドラクラス*/
class RefreshHandler extends Handler {
	
	private SampleView _sampleview;
	private int _delaytime;
	
	/**コンストラクタ*/
	public RefreshHandler(SampleView view,int delaytime){
		_sampleview = view;
		_delaytime = delaytime*1000;
	}
	
	@Override
	public void handleMessage(Message msg) {
		
		System.out.println("handleMessageが呼ばれた");
		/**count 10 で終了*/
		if(_sampleview.getCount()>10) return; 
		
		_sampleview.update();
		_sampleview.invalidate();
		
	}
    
	/**スレッドスタート*/
    public void start() {
        this.sendMessageDelayed(obtainMessage(0), _delaytime);
    }
    
	public void sleep() {
		this.removeMessages(0);
		this.sendMessageDelayed(obtainMessage(0), _delaytime);
	}
}