andorid handlerメッセージングメカニズム
2870 ワード
1つのプログラムが最初に起動されると、Androidは同時にメインスレッド(Main Thread)を起動し、メインスレッドは主にUIに関連するイベント、例えばユーザーのボタンイベント、ユーザーがスクリーンに接触するイベント、スクリーン描画イベントを処理し、関連するイベントを対応するコンポーネントに配布して処理する.したがって、メインスレッドはUIスレッドとも呼ばれる.
パフォーマンスの最適化を考慮すると、AndroidのUI操作はスレッドセキュリティではありません.これは、複数のスレッドがUIコンポーネントを同時に操作している場合、スレッドセキュリティの問題を引き起こす可能性があることを意味します.この問題を解決するために、AndroidはUIスレッドのみがActivityのUIコンポーネントを変更することを許可し、新しいスレッドを起動してUIをリフレッシュしようとするのは許されないという簡単な原則を制定した.では、新しいスレッドがUIをリフレッシュできるようにするにはどうすればいいのでしょうか.この問題を解決するためにAndroidはHandlerを導入してこの問題を解決した.
Handlerクラスの主な役割は2つあります.は、新たに開始するスレッドにおいてメッセージ を送信する.は、メインスレッドにおいてメッセージ を取得、処理する.
パフォーマンスの最適化を考慮すると、AndroidのUI操作はスレッドセキュリティではありません.これは、複数のスレッドがUIコンポーネントを同時に操作している場合、スレッドセキュリティの問題を引き起こす可能性があることを意味します.この問題を解決するために、AndroidはUIスレッドのみがActivityのUIコンポーネントを変更することを許可し、新しいスレッドを起動してUIをリフレッシュしようとするのは許されないという簡単な原則を制定した.では、新しいスレッドがUIをリフレッシュできるようにするにはどうすればいいのでしょうか.この問題を解決するためにAndroidはHandlerを導入してこの問題を解決した.
Handlerクラスの主な役割は2つあります.
package com.qicaiz.handlertest;
import android.app.Activity;
import android.app.ProgressDialog;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.view.Menu;
import android.view.View;
import android.widget.Button;
import android.widget.TextView;
public class MainActivity extends Activity
{
TextView showTextView;
Button addButton;
MyHandler myHandler;
@Override
protected void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
showTextView = (TextView)findViewById(R.id.showTextView);
addButton = (Button)findViewById(R.id.addButton);
// myHandler, handleMessage(Message msg)
myHandler = new MyHandler();
addButton.setOnClickListener(new View.OnClickListener()
{
@Override
public void onClick(View arg0)
{
// TODO Auto-generated method stu
MyThread myThread = new MyThread();
new Thread(myThread).start();
}
});
}
//
class MyThread implements Runnable
{
@Override
public void run()
{
// TODO Auto-generated method stub
try
{
Thread.sleep(10000);
}
catch(InterruptedException e)
{
e.printStackTrace();
}
Message msg = new Message();
Bundle bundle = new Bundle();
bundle.putString("add", " UI");
msg.setData(bundle);
myHandler.sendMessage(msg); //myHandler
}
}
// MyHandler Handler handleMessage(Message msg)
class MyHandler extends Handler
{
//
@Override
public void handleMessage(Message msg)
{
// TODO Auto-generated method stub
super.handleMessage(msg);
Bundle bundle = msg.getData();
String str = bundle.getString("add");
// , UI
showTextView.setText(str);
}
}
@Override
public boolean onCreateOptionsMenu(Menu menu)
{
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.main, menu);
return true;
}
}