小白今天开始学 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接受才能告知子线程
最后成功运行