スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。



AndroidのHandlerを使用した遅延実行

Javaで遅延実行するときはjava.util.concurrentパッケージのものを使用していけば良いと思うのですが,
せっかくAndroidなのでHandlerで遅延実行できないか検証してみました。

Handlerにも〜Delayed()メソッドがあり,指定時刻に実行できます。
さらにhasMessages()がありキューに既に追加されているかも確認することができます。

以下のようなコードになりました。
注意点はMessage.obtain()でRunnableを渡すとHandler.CallbackのhandleMessage()がコールされません。


public class HandlerCallBackActivity extends Activity implements Handler.Callback, OnClickListener
{
	static final private String TAG = "HandlerCallBackActivity";
	
	private Handler mHandler = new Handler(this);
	private Button mButton = null;
	private Message mMessage = null;
	
	// テキストを設定する
	static final private int HANDLER_SET_TEXT = 1;
	
	@Override public void onCreate(Bundle savedInstanceState)
	{
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_handler_call_back);
		
		mButton = (Button)findViewById(R.id.button);
		mButton.setOnClickListener(this);
	}

	@Override public boolean handleMessage(Message msg)
	{
		Log.d(TAG, "handleMessage() msg:" + msg);

		if(msg==null)
		{
			Log.e(TAG, "Invalid param. Message is null.");
			return false;
		}
		
		if(msg.what==HANDLER_SET_TEXT)
		{
			Log.d(TAG, "Message is HANDLER_SET_TEXT. " + msg.obj);
			setTextButton();
		}
		else
		{
			Log.d(TAG, "Not HANDLER_SET_TEXT message.");
		}
		
		return false;
	}

	@Override public void onClick(View v)
	{
		if(v==mButton)
		{
			if(mMessage!=null)
			{
				// 既にメッセージを追加しているとき削除する
				if(mHandler.hasMessages(HANDLER_SET_TEXT, this))
				{
					Log.d(TAG, "remove message.");
					mHandler.removeMessages(HANDLER_SET_TEXT, this);
				}
			}

			// Memo) Callbackが設定されているとhandleMessage()に通知されない。
			//       Handler.dispatchMessage()みるとわかる。
//			mMessage = Message.obtain(mHandler, new Runnable());
			mMessage = mHandler.obtainMessage(HANDLER_SET_TEXT, this);
			
			if(!mHandler.sendMessageDelayed(mMessage, 2000))
			{
				Log.e(TAG, "Failed send message.");
			}
			else
			{
				Log.i(TAG, "Success send message.");
			}
			
			return;
		}
	}
	
	public void setTextButton()
	{
		final long time = System.currentTimeMillis();
		SimpleDateFormat sdf = new SimpleDateFormat("HH:mm:ss.SSS");
		mButton.setText(sdf.format(new Date(time)));
	}
}

// MessageQueueの削除条件はobjectを等価でなくて等値として評価している
public class MessageQueue {
	final boolean hasMessages(Handler h, int what, Object object) {
        if (h == null) {
            return false;
        }

        synchronized (this) {
            Message p = mMessages;
            while (p != null) {
                if (p.target == h && p.what == what && (object == null || p.obj == object)) {
                    return true;
                }
                p = p.next;
            }
            return false;
        }
    }
}

これでHandlerを使用して遅延実行ができます。
関連記事
スポンサーサイト

テーマ : ゲーム開発
ジャンル : コンピュータ




コメントの投稿

非公開コメント

アクセス
あなたは
キーワード
カテゴリー
最近の記事
リンク
月別アーカイブ
ブロとも申請フォーム

この人とブロともになる

WEB検索
Google

RSSフィード
上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。