AndroidはHandlerを使用してマルチスレッドを実現
2669 ワード
簡単な説明:
Android開発ではマルチスレッドがよく使われていますが、ここでは雛形を実現します.
知識点:
Handlerはメインスレッドの中でずっと走っている一部として、メインUIスレッドに対するサブスレッドの通信を管理している.例えば、サブスレッドであるインタフェース要素を修正するには、Messageの送信を通じて、Handlerに修正が必要であることを知らせ、HandlerでそのメインスレッドのUI
簡単に言えば、サブスレッドはメインスレッドUI(Activity UI)を直接変更することはできません.sendメッセージでHandlerに変更するしかありません(個人的には、間違っている場合は、指摘を歓迎します)
次に,マルチスレッドの雛形を達成するためにThreadを実現する.
コード:
メインUI
main_activity.xml
メインインタフェースのActivity MainActivity.java
効果を表示:
クリックするとスクロールバーが表示され、スレッドが2秒寝た後、サブスレッドが終了し、メインスレッドが復元されます.
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秒寝た後、サブスレッドが終了し、メインスレッドが復元されます.