Android:在工作线程中创建View和Handler是安全的

时间:2014-04-25 12:41:48

标签: java android multithreading thread-safety

android文档声明:

  
    

Andoid UI工具包不是线程安全的。因此,您不能从工作线程操纵UI - 您必须从UI线程对用户界面进行所有操作。

  

我的第一个问题是:通过在工作线程中创建视图,然后使用处理程序将其附加到工作线程来反对此规则/建议是否安全窗口。 (参见下面的代码来说明我的意思)。

似乎没问题,因为我无法看到2个线程同时修改视图的任何情况。我想念一下吗?

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 个答案:

答案 0 :(得分:0)

  1. 不,如上所述,这是不安全的。
  2. 不安全,Android公开了一个单一的线程模型,确保UI不会同时被不同的线程修改。这样做是为了避免这些问题。

    1. 是的我认为没关系,因为它是另一个主题:)
    2. 另请查看runOnUiThread()