Android线程1 Handler处理更新UI子线程问题

我们知道,每个eActivity都有一个Main线程,也称之为UI线程,当在子线程中更新UI线程中的元素就会出现Crash。

解决方式就是通过handler解决。现在上代码,demo很简单,使用子线程更新Textview显示从update_0到update_49。

public class MainActivity extends AppCompatActivity {

    private static final String TAG = "MainActivity";
    private TextView text;
    private static final int UPDATE_TEXTVIEW = 1;
    private Handler handler = new Handler(){
        @Override
        public void handleMessage(Message msg) {
            switch (msg.what){
                case UPDATE_TEXTVIEW:
                    String update_text = (String)msg.obj;
                    text.setText(update_text);
                    break;
                default:

                    break;
            }
        }
    };
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        text = (TextView)findViewById(R.id.text);
        new Thread(new Runnable() {
            @Override
            public void run() {
                for(int i=0;i<50;i++){
                    String update_text = "update_"+i;
                    try {
                        Thread.sleep(1000);
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                    //Message.obtain()
                    Message.obtain(handler,UPDATE_TEXTVIEW,update_text).sendToTarget();
                    /*Message message = new Message();
                    message.what = UPDATE_TEXTVIEW;
                    message.obj = update_text;
                    handler.sendMessage(message);*/
                }
            }
        }).start();
    }
}

编程方法:
第一步:创建Handler,如下。Handler主要是为了处理消息用的,在消息回环中更新UI线程元素。

private Handler handler = new Handler(){
        @Override
        public void handleMessage(Message msg) {
            switch (msg.what){
                case UPDATE_TEXTVIEW:
                    String update_text = (String)msg.obj;
                    text.setText(update_text);
                    break;
                default:

                    break;
            }
        }
    };

第二步骤:创建消息对象,并send到Handler Target。此处方法很多:
1,Message.obtain(handler,UPDATE_TEXTVIEW,update_text).sendToTarget();

2,Message message = new Message();
message.what = UPDATE_TEXTVIEW;
message.obj = update_text;
handler.sendMessage(message);
但是看看API官网中Mesaage 构造函数:
Message()
Constructor (but the preferred way to get a Message is to call Message.obtain()).
推荐使用obtain方法。

3,有一种很简洁的方式更新UI线程元素,就是直接使用Handler.post(Runnable)。这样就可以不建立消息Message对象进行更新。此种方式的代码如下所示:

public final boolean post (Runnable r)

Added in API level 1
Causes the Runnable r to be added to the message queue. The runnable will be run on the thread to which this handler is attached.

Parameters
r   The Runnable that will be executed.
Returns
Returns true if the Runnable was successfully placed in to the message queue. Returns false on failure, usually because the looper processing the message queue is exiting.
protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        text = (TextView)findViewById(R.id.text);
        new Thread(new Runnable() {
            @Override
            public void run() {
                for(int i=0;i<50;i++){
                    final String update_text = "update_"+i;
                    try {
                        Thread.sleep(1000);
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                    //Message.obtain()
                    //Message.obtain(handler,UPDATE_TEXTVIEW,update_text).sendToTarget();
                    /*Message message = new Message();
                    message.what = UPDATE_TEXTVIEW;
                    message.obj = update_text;
                    handler.sendMessage(message);*/
                    handler.post(new Runnable() {
                        @Override
                        public void run() {
                            text.setText(update_text);
                        }
                    });
                }
            }
        }).start();
    }

代码地址在:
http://download.csdn.net/detail/zhangkai1992/9602339

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值