android子线程不能更新UI
16lz
2021-01-23
由于以前做了1年java(其实在以前公司大多数都是vb,C#什么的,很少接触java,也许这也是我毅然转android的原因吧),现在准备做android应用开发,打算过段
时间做游戏或底层开发吧,应该做游戏开发的可能性大点^_^,言归正传,看例子:
@Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); thread.start(); } Thread thread = new Thread() { public void run() { try { Thread.sleep(1000); //模拟耗时操作 } catch (InterruptedException e) { e.printStackTrace(); } ((TextView) findViewById(R.id.test)).setText("test"); } };
会发现报错,异常:android.view.ViewRootImpl$CalledFromWrongThreadException: Only the original thread that created a view hierarchy can touch its views.
相信懂点英语的人就知道什么意思,根据它的意思以前一直都是这样改的:
@Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); //thread.start(); } Handler handler = new Handler() { public void handleMessage(android.os.Message msg) { //在这里改变UI值 }; Thread thread = new Thread() { public void run() { try { Thread.sleep(1000); //模拟耗时操作 } catch (InterruptedException e) { e.printStackTrace(); } //((TextView) findViewById(R.id.test)).setText("test"); handler.sendEmptyMessage(what); } };
今天又看到一种写法,不过意思一样:
@Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); new Handler() { public void handleMessage(android.os.Message msg) { thread.start(); }; }.post(thread); } Thread thread = new Thread() { public void run() { try { Thread.sleep(1000); } catch (InterruptedException e) { e.printStackTrace(); } ((TextView) findViewById(R.id.test)).setText("test"); } };
以上两种方法差不多,随你选择
更新于2013-06-03 01:09:34
我的博客其它文章列表
http://my.oschina.net/helu
更多相关文章
- android 操作命令
- Android之Sqlite的增删查操作
- 点击事件XML里的写法
- Android之Gson操作
- Android在API推荐的方式来实现SQLite数据库的增长、删除、变化、
- android 分享到QQ空间的所有操作
- Android接收信息操作
- Android SDCard 操作