子线程常见异常

来源:互联网 发布:虐杀原形隐藏boss 知乎 编辑:程序博客网 时间:2024/05/29 14:37
android.view.ViewRootImpl$CalledFromWrongThreadException: Only the original thread that created a view hierarchy can touch its views.
谁创建的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+"%");};};@Overrideprotected 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();}}


原创粉丝点击