AndroidはHandlerを使用してマルチスレッドを実現

2669 ワード

簡単な説明:
Android開発ではマルチスレッドがよく使われていますが、ここでは雛形を実現します.
知識点:
Handlerはメインスレッドの中でずっと走っている一部として、メインUIスレッドに対するサブスレッドの通信を管理している.例えば、サブスレッドであるインタフェース要素を修正するには、Messageの送信を通じて、Handlerに修正が必要であることを知らせ、HandlerでそのメインスレッドのUI
簡単に言えば、サブスレッドはメインスレッドUI(Activity UI)を直接変更することはできません.sendメッセージでHandlerに変更するしかありません(個人的には、間違っている場合は、指摘を歓迎します)
次に,マルチスレッドの雛形を達成するためにThreadを実現する.
コード:
メインUI
main_activity.xml
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/mainRelativeLayout"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    >

    <Button
        android:id="@+id/myBtn"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="show dialog"
        android:textSize="22dip"
         />

</RelativeLayout>

メインインタフェースのActivity MainActivity.java
package com.atp.ui;

import android.annotation.SuppressLint;
import android.app.Activity;
import android.app.ProgressDialog;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.view.View;
import android.widget.Button;

import com.atp.R;

public class MainActivity extends Activity {

	private Button myBtn = null;
	private ProgressDialog progressDialog = null;


	//use of Handler
	//messge info
	private static final int DISMISS_PROGRESS_DIALOG = 1;
	Message message = null;
	
	@SuppressLint("HandlerLeak")
	private Handler handler = new Handler(){
		@Override
		public void handleMessage(Message msg) {
			switch(msg.what){
			case DISMISS_PROGRESS_DIALOG:
				progressDialog.dismiss();
				break;
			}
		}
	};
	
	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.main_activity);
		myBtn = (Button) findViewById(R.id.myBtn);
		myBtn.setOnClickListener(new View.OnClickListener() {
			@Override
			public void onClick(View arg0) {
				progressDialog = ProgressDialog.show(MainActivity.this, "   ...",
						"   ...", true);
				new Thread(){
					@Override
					public void run() {
						try {
							Thread.sleep(2000);
						} catch (InterruptedException e) {
							e.printStackTrace();
						}
						message = handler.obtainMessage(DISMISS_PROGRESS_DIALOG);
						handler.sendMessage(message);
					}
				}.start();
			}
		});
	}
}

効果を表示:
クリックするとスクロールバーが表示され、スレッドが2秒寝た後、サブスレッドが終了し、メインスレッドが復元されます.