android.view.ViewRootImpl$CalledFromWrongThreadException:
Only the original thread that created a view hierarchy can touch its views.
谁创建的view谁才可以修改view里面的内容
android系统约定了一个规则:默认只有主线程才可以修改应用程序的ui,子线程不可以(更新ui),否则抛出异常
谁创建的view谁才可以修改view里面的内容
android系统约定了一个规则:默认只有主线程才可以修改应用程序的ui,子线程不可以(更新ui),否则抛出异常
>展示图片、吐司
子线程更新ui的步骤
1. 创建一个消息处理器Handler(一定要在主线程new出来)
private Handler handler = new Handler() {};
2. 在子线程利用handler发送消息给主线程的消息队列
handler.sendMessage(msg);
3. 在主线程的消息处理器里面,处理这个消息
public void handleMessage(Message msg) {}
4. 特殊情况 传递数据
Message.obj 携带数据
public class MainActivity extends Activity {
private TextView tv;
/**
* 1.创建一个消息处理器,运行在主线程里面.
*/
private Handler handler = new Handler() {
// 3.loop调用的用来处理消息的方法,运行在主线程
public void handleMessage(Message msg) {
int i = (Integer) msg.obj;
tv.setText("当前进度:"+i+"%");
};
};
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
tv = (TextView) findViewById(R.id.tv);
}
public void click(View view) {
new Thread() {
public void run() {
// tv.setText("hahahah"); 子线程不可以直接更新ui
// 2.子线程 通过消息处理器 把一个消息发送到消息队列(message queue),消息队列中有looper轮询,处理消息
for (int i = 0; i < 100; i++) {
Message msg = new Message();
//消息携带的数据
msg.obj = i;
handler.sendMessage(msg);
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
};
}.start();
}
}