Androidが開発したサブスレッド操作UIのいくつかの方法
3203 ワード
Androidプロジェクトでは、サブスレッドで時間のかかる操作を完了した後にUIを更新するという問題がよく発生します.次に、自分が経験したいくつかのプロジェクトについて、更新方法をまとめます.
方法を見る前にAndroidのメッセージメカニズムを理解する必要があります.
方法1 Activity.runOnUiThread
方法は次のとおりです.
この方法は簡単で使いやすく,現在のスレッドがUIスレッドである場合,行動は直ちに実行される.現在のスレッドがUIスレッドでない場合、イベントキューのUIスレッドにパブリッシュされます.実はHandlerとあまり差がなく、このUI更新要求メッセージをイベントキューに追加し、メインラインプログラムが空いている間に実行するのを待っています.
方法2 Handler
メインスレッドのHandlerは次のように定義されます.
サブスレッドは、HandlerにUIの更新を完了するように通知するメッセージを送信します.コードは次のとおりです.
方法3 View.post
上のコードはbtnの内容を更新することであり,同様に下のコードもこの効果を達成することができる.
これはhandlerです.一つはView.方法を考えろpostメソッドはAndroidのメッセージメカニズムで紹介されているが,実際にはメソッド2のsendメソッドも呼び出される.
今見てみろpostメソッドのソースコード:
メソッドの主な機能コードはattachInfoである.mHandlerは、現在のスレッド(すなわちUIスレッド)のHanlderを取得し、actionオブジェクトをHandlerにpostする.Handlerの処理過程ではリンク文が解析されており,伝達されたactionオブジェクトをMessage(Messageのcallbackはaction)にパッケージし,UIスレッドのメッセージループに投入する.HandlerのdispatchMessageメソッドでは,最初の文がrunnableのrunメソッドを直接呼び出すように設定されている.この場合、UIスレッドにルーティングされているので、UIを更新する心配はありません.
方法4放送
サブスレッドでブロードキャストが送信され、メインスレッドでブロードキャストが受信され、UIが更新される.
方法5 AsyncTaskの使用
サブスレッドでのUIへのアクセスを簡単にするために、システムはAsyncTaskに提供してくれました.
AsyncTaskは、オンライン・スレッド・プールでバックグラウンド・タスクを実行し、実行の進捗状況と結果をプライマリ・スレッドに渡してUIを更新する軽量レベルの非同期タスク・クラスです.本質的にAsyncTaskはThreadとHandlerをカプセル化していますが、AsyncTaskは特別に時間がかかるバックグラウンドタスクには向いていません.特別に時間がかかるタスクが必要な場合は、スレッドプールを使用することをお勧めします.
異なるAPIバージョンのAsyncTaskは異なる表現を持つため、注意が必要である.紙面を制御するために、具体的なAsyncTaskの使い方と動作原理については、後で単独で紹介するつもりです.
以上述べたのは、Android開発のサブスレッドがUIを操作するいくつかの方法を紹介したもので、皆さんに役に立つことを望んでいます.もし何か質問があれば、私にメッセージを送ってください.編集者はすぐに皆さんに返事します.
方法を見る前にAndroidのメッセージメカニズムを理解する必要があります.
方法1 Activity.runOnUiThread
方法は次のとおりです.
runOnUiThread(new Runnable() {
@Override
public void run() {
tv.setText("Hello");
}
});
この方法は簡単で使いやすく,現在のスレッドがUIスレッドである場合,行動は直ちに実行される.現在のスレッドがUIスレッドでない場合、イベントキューのUIスレッドにパブリッシュされます.実はHandlerとあまり差がなく、このUI更新要求メッセージをイベントキューに追加し、メインラインプログラムが空いている間に実行するのを待っています.
方法2 Handler
メインスレッドの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です.一つはView.方法を考えろpostメソッドはAndroidのメッセージメカニズムで紹介されているが,実際にはメソッド2のsendメソッドも呼び出される.
今見てみろ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);
}
メソッドの主な機能コードはattachInfoである.mHandlerは、現在のスレッド(すなわちUIスレッド)のHanlderを取得し、actionオブジェクトをHandlerにpostする.Handlerの処理過程ではリンク文が解析されており,伝達されたactionオブジェクトをMessage(Messageのcallbackはaction)にパッケージし,UIスレッドのメッセージループに投入する.HandlerのdispatchMessageメソッドでは,最初の文がrunnableのrunメソッドを直接呼び出すように設定されている.この場合、UIスレッドにルーティングされているので、UIを更新する心配はありません.
方法4放送
サブスレッドでブロードキャストが送信され、メインスレッドでブロードキャストが受信され、UIが更新される.
方法5 AsyncTaskの使用
サブスレッドでのUIへのアクセスを簡単にするために、システムはAsyncTaskに提供してくれました.
AsyncTaskは、オンライン・スレッド・プールでバックグラウンド・タスクを実行し、実行の進捗状況と結果をプライマリ・スレッドに渡してUIを更新する軽量レベルの非同期タスク・クラスです.本質的にAsyncTaskはThreadとHandlerをカプセル化していますが、AsyncTaskは特別に時間がかかるバックグラウンドタスクには向いていません.特別に時間がかかるタスクが必要な場合は、スレッドプールを使用することをお勧めします.
異なるAPIバージョンのAsyncTaskは異なる表現を持つため、注意が必要である.紙面を制御するために、具体的なAsyncTaskの使い方と動作原理については、後で単独で紹介するつもりです.
以上述べたのは、Android開発のサブスレッドがUIを操作するいくつかの方法を紹介したもので、皆さんに役に立つことを望んでいます.もし何か質問があれば、私にメッセージを送ってください.編集者はすぐに皆さんに返事します.