android.view.ViewRootImpl
CalledFromWrongThreadException:Onlytheoriginalthreadthatcreatedaviewhierarchycantouchitsviews.atandroid.view.ViewRootImpl.checkThread(ViewRootImpl.java:6838)atandroid.view.ViewRootImpl.requestLayout(ViewRootImpl.java:947)atandroid.view.View.requestLayout(View.java:18882)atandroid.view.View.requestLayout(View.java:18882)atandroid.view.View.requestLayout(View.java:18882)atandroid.view.View.requestLayout(View.java:18882)atandroid.view.View.requestLayout(View.java:18882)atandroid.view.View.requestLayout(View.java:18882)atandroid.widget.RelativeLayout.requestLayout(RelativeLayout.java:367)atandroid.view.View.requestLayout(View.java:18882)atandroid.widget.TextView.checkForRelayout(TextView.java:7493)atandroid.widget.TextView.setText(TextView.java:4456)atandroid.widget.TextView.setText(TextView.java:4313)atandroid.widget.TextView.setText(TextView.java:4288)atcom.zhangcz.androidthreadtest.MainActivity
C
a
l
l
e
d
F
r
o
m
W
r
o
n
g
T
h
r
e
a
d
E
x
c
e
p
t
i
o
n
:
O
n
l
y
t
h
e
o
r
i
g
i
n
a
l
t
h
r
e
a
d
t
h
a
t
c
r
e
a
t
e
d
a
v
i
e
w
h
i
e
r
a
r
c
h
y
c
a
n
t
o
u
c
h
i
t
s
v
i
e
w
s
.
a
t
a
n
d
r
o
i
d
.
v
i
e
w
.
V
i
e
w
R
o
o
t
I
m
p
l
.
c
h
e
c
k
T
h
r
e
a
d
(
V
i
e
w
R
o
o
t
I
m
p
l
.
j
a
v
a
:
6838
)
a
t
a
n
d
r
o
i
d
.
v
i
e
w
.
V
i
e
w
R
o
o
t
I
m
p
l
.
r
e
q
u
e
s
t
L
a
y
o
u
t
(
V
i
e
w
R
o
o
t
I
m
p
l
.
j
a
v
a
:
947
)
a
t
a
n
d
r
o
i
d
.
v
i
e
w
.
V
i
e
w
.
r
e
q
u
e
s
t
L
a
y
o
u
t
(
V
i
e
w
.
j
a
v
a
:
18882
)
a
t
a
n
d
r
o
i
d
.
v
i
e
w
.
V
i
e
w
.
r
e
q
u
e
s
t
L
a
y
o
u
t
(
V
i
e
w
.
j
a
v
a
:
18882
)
a
t
a
n
d
r
o
i
d
.
v
i
e
w
.
V
i
e
w
.
r
e
q
u
e
s
t
L
a
y
o
u
t
(
V
i
e
w
.
j
a
v
a
:
18882
)
a
t
a
n
d
r
o
i
d
.
v
i
e
w
.
V
i
e
w
.
r
e
q
u
e
s
t
L
a
y
o
u
t
(
V
i
e
w
.
j
a
v
a
:
18882
)
a
t
a
n
d
r
o
i
d
.
v
i
e
w
.
V
i
e
w
.
r
e
q
u
e
s
t
L
a
y
o
u
t
(
V
i
e
w
.
j
a
v
a
:
18882
)
a
t
a
n
d
r
o
i
d
.
v
i
e
w
.
V
i
e
w
.
r
e
q
u
e
s
t
L
a
y
o
u
t
(
V
i
e
w
.
j
a
v
a
:
18882
)
a
t
a
n
d
r
o
i
d
.
w
i
d
g
e
t
.
R
e
l
a
t
i
v
e
L
a
y
o
u
t
.
r
e
q
u
e
s
t
L
a
y
o
u
t
(
R
e
l
a
t
i
v
e
L
a
y
o
u
t
.
j
a
v
a
:
367
)
a
t
a
n
d
r
o
i
d
.
v
i
e
w
.
V
i
e
w
.
r
e
q
u
e
s
t
L
a
y
o
u
t
(
V
i
e
w
.
j
a
v
a
:
18882
)
a
t
a
n
d
r
o
i
d
.
w
i
d
g
e
t
.
T
e
x
t
V
i
e
w
.
c
h
e
c
k
F
o
r
R
e
l
a
y
o
u
t
(
T
e
x
t
V
i
e
w
.
j
a
v
a
:
7493
)
a
t
a
n
d
r
o
i
d
.
w
i
d
g
e
t
.
T
e
x
t
V
i
e
w
.
s
e
t
T
e
x
t
(
T
e
x
t
V
i
e
w
.
j
a
v
a
:
4456
)
a
t
a
n
d
r
o
i
d
.
w
i
d
g
e
t
.
T
e
x
t
V
i
e
w
.
s
e
t
T
e
x
t
(
T
e
x
t
V
i
e
w
.
j
a
v
a
:
4313
)
a
t
a
n
d
r
o
i
d
.
w
i
d
g
e
t
.
T
e
x
t
V
i
e
w
.
s
e
t
T
e
x
t
(
T
e
x
t
V
i
e
w
.
j
a
v
a
:
4288
)
a
t
c
o
m
.
z
h
a
n
g
c
z
.
a
n
d
r
o
i
d
t
h
r
e
a
d
t
e
s
t
.
M
a
i
n
A
c
t
i
v
i
t
y
1.run(MainActivity.java:30)
at java.lang.Thread.run(Thread.java:833)
异常出现的原因是在子线程中进行了UI更新操作
请使用异步消息处理机制
package com.zhangcz.androidthreadtest;
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.Button;
import android.widget.TextView;
public class MainActivity extends AppCompatActivity implements View.OnClickListener {
private static final String TAG = "MainActivity";
private static final int UPDATE_TEXT = 1;
private TextView textView;
private Handler handler = new Handler(){
@Override
public void handleMessage(Message msg) {
switch (msg.what){
case UPDATE_TEXT:
textView.setText("Nice to meet you");
break;
default:
break;
}
}
};
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
textView =(TextView)findViewById(R.id.text);
Button changText = (Button)findViewById(R.id.change_text);
changText.setOnClickListener(this);
}
@Override
public void onClick(View view) {
switch (view.getId()){
case R.id.change_text:
new Thread(new Runnable() {
@Override
public void run() {
// textView.setText("Nice to meet you");
Message message = new Message();
message.what = UPDATE_TEXT;
handler.sendMessage(message);
}
}).start();
break;
default:
break;
}
}
}