你未必知道:onCreate 中直接线程更新 UI 是不会报错的

泡在网上的日子 / 文 发表于2014-09-04 10:14 次阅读 onCreate,线程

在非UI线程中更新UI是会报错的,这是常识,什么叫更新UI呢?举个简单的例子,你调用了一个TextView的 setText()方法就算是更新UI了。

但是下面的代码执行后发现 虽然我在Thread中直接更新了UI,但是没有任何错误出现:

package com.example.threadtest;
import android.app.Activity;
import android.os.Bundle;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.widget.TextView;
public class MainActivity extends Activity {
    private TextView text;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        text = (TextView) this.findViewById(R.id.text);
        new Thread(new Runnable() {
            @Override
            public void run() {
                text.setText("dds");
            }
        }).start();
    }
                                                                                                                                                          
    public void onClick(View view){   
                                                                                                                                                             
                                                                                                                                                          
                                                                                                                                                        
    }  
}


xml代码

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context="${packageName}.${activityClass}" >
    <TextView
        android:id="@+id/text"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="@string/hello_world" />
                                                                                    
    <Button
        android:id="@+id/button"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:onClick="onClick"
        android:text="不在oncreate中" />   
</RelativeLayout>

这是因为onCreate中时,检查机制还没起作用,因此这个时候是不会报错滴~,当然这样是否是利用了检查机制的漏洞呢?这就有待思考了。

为了验证是不是onCreate中才特有这样的问题,我们将thread放到onclick中:

package com.example.threadtest;
import android.app.Activity;
import android.os.Bundle;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.widget.TextView;
public class MainActivity extends Activity {
    private TextView text;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        text = (TextView) this.findViewById(R.id.text);
    }
                                                                                                             
    public void onClick(View view){   
                                                                                                                
        new Thread(new Runnable() {
            @Override
            public void run() {
                text.setText("dds");
            }
        }).start();   
                                                                                                           
    }  
}

当点击button,直接就报错了。

虽然onCreate中一个线程可以直接更新UI,但是显然我们不提倡这样做。

收藏 赞 (2) 踩 (0)
上一篇:给安卓初学者的12篇教程
如果你想学习安卓程序开发,网上会有很多的教程和学习材料。来源广泛、林林总总的初学者教程和进阶教程,我们SitePoint也经常提供一些新的安卓开发教程。 考虑到有如此多的信息你又是初学者,所以你很容易感到迷惑不知道从哪开始。为了让你感到轻松同时消除
下一篇:ActionSheetForAndroid安卓版本的ActionSheet
模仿IOS里面的UIActionSheet控件,有IOS6和IOS7两种风格,可以自定义风格,背景图片、按钮图片、文字颜色、间距等。 项目地址: https://github.com/baoyongzhang/ActionSheetForAndroid 使用方法 创建一个ActionSheet并显示 ActionSheet.createBuilder(this