<Android 初步> Handler------线程之间通信利器

小白今天开始学   Handler  这个高大上的的东西了  

顺便想复习一下多线程的知识,然后就顺便i写了一个按钮加显示的文本简单的Activity

package com.jiany.handler_test;

import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.TextView;

public class MainActivity extends AppCompatActivity {
    private TextView textView;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        textView = (TextView)findViewById(R.id.textView);
    }
    
    public void sendTheadCilck(View view){
        new Thread(new Runnable() {
            @Override
            public void run() {
                try {
                    Thread.sleep(3000);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                textView.setText("android Thread");
            }
        }).start();
    }
}

Acitivity界面如下:(太丑了)


很高兴,点了一下按钮,静静的等待三秒。。。。

然后就。。。。


我就懵了。。。。。难道是我的姿势不对????


然后直接查看了Android studio 的log

 FATAL EXCEPTION: Thread-143
                                                                        Process: com.jiany.handler_test, PID: 24714
                                                                        android.view.ViewRootImpl$CalledFromWrongThreadException: Only the original thread that created a view hierarchy can touch its views.
                                                                            at android.view.ViewRootImpl.checkThread(ViewRootImpl.java:6094)
                                                                            at android.view.ViewRootImpl.requestLayout(ViewRootImpl.java:824)
                                                                            at android.view.View.requestLayout(View.java:16431)
                                                                            at android.view.View.requestLayout(View.java:16431)
                                                                            at android.view.View.requestLayout(View.java:16431)
                                                                            at android.view.View.requestLayout(View.java:16431)
                                                                            at android.view.View.requestLayout(View.java:16431)
                                                                            at android.view.View.requestLayout(View.java:16431)
                                                                            at android.widget.RelativeLayout.requestLayout(RelativeLayout.java:352)
                                                                            at android.view.View.requestLayout(View.java:16431)
                                                                            at android.widget.TextView.checkForRelayout(TextView.java:6600)
                                                                            at android.widget.TextView.setText(TextView.java:3813)
                                                                            at android.widget.TextView.setText(TextView.java:3671)
                                                                            at android.widget.TextView.setText(TextView.java:3646)
                                                                            at com.jiany.handler_test.MainActivity$1.run(MainActivity.java:30)
                                                                            at java.lang.Thread.run(Thread.java:841)


报了线程的错误:Only the original thread that created a view hierarchy can touch its views.  (我的理解就是:只有Ui线程才能访问Ui组件)


脑子duang了一下,想有没有的一个东西能把子线程的东西弄到Ui线程去呢。。。。

所以今天学的  Handler   派上用场了  

修改代码如下:


package com.jiany.handler_test;

import android.os.Handler;
import android.os.Message;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.TextView;

public class MainActivity extends AppCompatActivity {
    private TextView textView;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        textView = (TextView)findViewById(R.id.textView);
    }

    private Handler handler = new Handler(){
        @Override
        public void handleMessage(Message msg) {
            super.handleMessage(msg);
           while (msg.what ==100){
               textView.setText("android Thread");
               break;
           }
        }
    };

    public void sendTheadCilck(View view){
        new Thread(new Runnable() {
            @Override
            public void run() {
                try {
                    Thread.sleep(3000);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                handler.sendEmptyMessage(100);
            }
        }).start();
    }
}

加入了一个信息接收器Handler(乱叫的)  Handler可以是实现 子线程与Ui线程的通信。  

通俗来说就是子线程发生一个信息来告知Ui线程要执行什么操作,这个信息不能直接告知,要通过一个Handler接受才能告知子线程



最后成功运行


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值