![](/img/trans.png)
[英]Using Thread/Handler/Looper for Worker Thread Android
[英]Android : is it safe to create a View and a Handler in a worker thread
android docs指出:
Andoid UI工具包不是線程安全的。 因此,您一定不能從輔助線程中操作UI,而必須從UI線程中對用戶界面進行所有操作。
我的第一個問題是:是否可以通過在工作線程中創建View,然后使用處理程序將其附加到窗口來違反此規則/建議 ,是否安全? (請參見下面的代碼來說明我的意思)。
看來還可以,因為我看不到任何情況,其中兩個線程同時修改了視圖。 我想念什么嗎?
public class DemoActivity extends Activity {
RelativeLayout rootLayout;
private Handler handler;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
handler = new Handler(Looper.getMainLooper());
setContentView(R.layout.activity_main);
rootLayout = (RelativeLayout)findViewById(R.id.relativeLayout);
myThread.start();
}
private Thread myThread = new Thread(){
@Override
public void run() {
final TextView textView = new TextView(DemoActivity.this);
textView.setText("I'm a TextView created in a worker Thread");
handler.post(new Runnable() {
@Override
public void run() {
rootLayout.addView(textView);
}
});
}
};
我的第二個問題是關於創建處理程序的線程的更多信息:
在工作線程本身中創建處理程序可以嗎? (請參見下面的代碼)
有內存泄漏的風險嗎?
private Thread myOtherThread = new Thread(){
@Override
public void run() {
final TextView textView = new TextView(DemoActivity.this);
textView.setText("I'm a TextView created in a worker Thread");
new Handler(Looper.getMainLooper()).post(new Runnable() {
@Override
public void run() {
rootLayout.addView(textView);
}
});
//just to illustrate that the thread don't terminate immediately
//but it don't touch the textView anymore.
while(true){
doStuff();
}
}
};
}
為安全起見,Android公開了一個單線程模型,以確保UI不會同時被不同的線程修改。 這樣做是為了避免此類問題。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.