Android Handler:サブスレッドはUIマスタースレッドにメッセージを送信
2639 ワード
Activityコード:
Threadコード:
UIの更新が必要な場合のHandleのインスタンス化:
メインスレッド:Handler handler=new Handler()
他のスレッドでは、Handler handler=new Handler(Looper.getMainLooper()
UIを更新しない場合のHandleインスタンス化:
メインスレッド:Handler handler=new Handler()
他のスレッド:
Looper.prepare();
Handler handler = new Handler();
Looper.loop();
または
Handler handler = new Handler(Looper.getMainLooper());
message.whatは一般的にメッセージを区別するために使用されます.プロセス内の転送データはsetData(Bundle)で使用でき、プロセス間ではmessageを使用する.objシーケンス可能なオブジェクトデータの転送
public class MainActivity extends Activity {
private MyThread myThread;
private Handler handler; // UI
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
// Handler
handler = new Handler(){
@Override
public void handleMessage(Message msg) {
super.handleMessage(msg);
Bundle bundle = msg.getData();
String value = bundle.getString("value");
outputEditText.setText(value);
}
};
//
myThread = new MyThread(handler);
myThread.start();
showDialog("Socket Thread Started!");
}
/**
*
*/
private void showDialog(String msg){
new AlertDialog.Builder(this)
.setTitle(" ")
.setMessage(msg)
.setPositiveButton("ok", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
}
}).show();
}
}
Threadコード:
public class MyThread extends Thread{
private Handler handler;
public MyThread(Handler handler){
this.handler = handler;
}
@Override
public void run() {
try {
// UI
while(true){
TimeUnit.MILLISECONDS.sleep(1000);
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
String date = sdf.format(new Date());
sendMessage(date);
}
} catch (Exception e) {
e.printStackTrace();
}
}
/**
* UI
*/
private void sendMessage(String msg){
Bundle data = new Bundle();
data.putString("value", msg);
Message message = new Message();
message.setData(data);
this.handler.sendMessage(message);
}
}
UIの更新が必要な場合のHandleのインスタンス化:
メインスレッド:Handler handler=new Handler()
他のスレッドでは、Handler handler=new Handler(Looper.getMainLooper()
UIを更新しない場合のHandleインスタンス化:
メインスレッド:Handler handler=new Handler()
他のスレッド:
Looper.prepare();
Handler handler = new Handler();
Looper.loop();
または
Handler handler = new Handler(Looper.getMainLooper());
message.whatは一般的にメッセージを区別するために使用されます.プロセス内の転送データはsetData(Bundle)で使用でき、プロセス間ではmessageを使用する.objシーケンス可能なオブジェクトデータの転送