簡體   English   中英

Android:在工作線程中創建View和Handler是否安全?

[英]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();
            }
        }
    };
}
  1. 不,正如所說,這是不安全的。

為安全起見,Android公開了一個單線程模型,以確保UI不會同時被不同的線程修改。 這樣做是為了避免此類問題。

  1. 是的,我認為還可以,因為它是另一個線程:)

還看看runOnUiThread()

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM