Android開発のサブスレッド操作UIのいくつかの方法
Androidプロジェクトではよくこのような問題があります。サブスレッドで時間をかけて操作した後、UIを更新します。自分が経験したプロジェクトについて、更新方法をまとめてみます。
方法を見る前に、Androidにおけるメッセージ構造を知る必要がある。
方法1 Activity.run OnUiThread
方法は以下の通りです
方法2ハードラー
ホームスレッドで定義されているHandlerは以下の通りです。
View.post方法のソースコードを見てみます。
方法4ラジオ
サブスレッドではブロードキャストが送信され、メインスレッドではブロードキャストが受信され、UIが更新される。
方法5はAyncTaskを使用する。
サブスレッドでのUIアクセスを簡単にするために、システムはAyncTaskに提供されます。
AsyncTaskは、オンラインでバックグラウンドタスクを実行し、実行進捗と結果をメインスレッドに転送し、UIを更新するライト級の非同期タスククラスである。本質的にはAyncTaskはThreadとHandlerをカプセル化していますが、Aync Taskは特別な時間つぶしのバックグラウンドタスクには適していません。特別な時間つぶしのタスクが必要なら、スレッドプールを使用することを提案します。
異なるAPIバージョンのAsyncTaskは、異なるパフォーマンスを有しているので、注意が必要である。紙面をコントロールするために、具体的なAsyncTaskの使い方と仕事の原理を後で単独で紹介するつもりです。
以上は小编が皆さんに绍介したAndroid开発の子スレッド操作UIのいくつかの方法です。皆さんに助けてほしいです。もし何か疑问があれば、メッセージをください。小编はすぐに返事します。
方法を見る前に、Androidにおけるメッセージ構造を知る必要がある。
方法1 Activity.run OnUiThread
方法は以下の通りです
runOnUiThread(new Runnable() {
@Override
public void run() {
tv.setText("Hello");
}
});
この方法は簡単に使用でき、現在のスレッドがUIスレッドであれば、直ちに実行される。現在のスレッドがUIスレッドではない場合、イベントキューのUIスレッドにリリースされます。実は、Handlerと同じように、この更新UIのリクエストメッセージをイベントキューに入れて、ホームラインの空き時間を待って実行します。方法2ハードラー
ホームスレッドで定義されているHandlerは以下の通りです。
Handler mHandler = new Handler() {
@Override
public void handleMessage(Message msg) {
super.handleMessage(msg);
switch (msg.what) {
case 0:
String data = (String)msg.obj;
textView.setText(data);
break;
default:
break;
}
}
};
サブスレッドがメッセージを送り、HandlerにUI更新の完了を通知します。コードは以下の通りです。
new Thread(new Runnable(){
@Override
public void run() {
//
mHandler.sendEmptyMessage(0);
Message msg =new Message();
msg.obj = " ";// , , List、map
mHandler.sendMessage(msg);
}
}).start();
方法3 View.post
final Button btn =(Button)findViewById(R.id.btn);
btn.post(new Runnable(){
@Override
publicvoid run() {
btn.setText("Hello");
}
});
上のコードはbtnの内容を更新します。下のコードもこの効果があります。
Handler handler = new Handler();
final Button btn = (Button)findViewById(R.id.btn);
handler.post(new Runnable(){
@Override
public void run() {
btn.setText("Hello");
}
});
これはhandler.post方法で、一つはView.post方法で、handler.post方法はすでにAndroidのメッセージ構造に紹介されていますが、実は最終的に方法2のsend方法を呼び出しました。View.post方法のソースコードを見てみます。
public boolean post(Runnable action) {
Handler handler;
AttachInfo attachInfo = mAttachInfo;
if (attachInfo != null) {
handler = attachInfo.mHandler;
} else {
// Assume that post will succeed later
ViewRootImpl.getRunQueue().post(action);
return true;
}
return handler.post(action);
}
方法の主な機能コードは、atachInfo.mHandlerであり、現在のスレッド(すなわちUIスレッド)のHanlderを取得し、actionオブジェクトpostをHandlerに送る。Handlerでの処理過程において、リンク文はすでに分析されています。転送されたactionオブジェクトをMessage(Messageのcalbackはaction)に包装し、UIスレッドのメッセージサイクルに投入します。HandlerのdispatchMessageの方法では、最初の文はそれのために設定され、そのままrunnableのrunメソッドを呼び出します。この時点で、UIスレッドにルーティングされているので、UIを更新するためには、気兼ねなく利用することができます。方法4ラジオ
サブスレッドではブロードキャストが送信され、メインスレッドではブロードキャストが受信され、UIが更新される。
方法5はAyncTaskを使用する。
サブスレッドでのUIアクセスを簡単にするために、システムはAyncTaskに提供されます。
AsyncTaskは、オンラインでバックグラウンドタスクを実行し、実行進捗と結果をメインスレッドに転送し、UIを更新するライト級の非同期タスククラスである。本質的にはAyncTaskはThreadとHandlerをカプセル化していますが、Aync Taskは特別な時間つぶしのバックグラウンドタスクには適していません。特別な時間つぶしのタスクが必要なら、スレッドプールを使用することを提案します。
異なるAPIバージョンのAsyncTaskは、異なるパフォーマンスを有しているので、注意が必要である。紙面をコントロールするために、具体的なAsyncTaskの使い方と仕事の原理を後で単独で紹介するつもりです。
以上は小编が皆さんに绍介したAndroid开発の子スレッド操作UIのいくつかの方法です。皆さんに助けてほしいです。もし何か疑问があれば、メッセージをください。小编はすぐに返事します。