转于:http://blog.csdn.net/luckyjda/article/details/8601517
-------------------------------------------------------------------------------------------------------------
在Android开发过程中,常需要更新界面的UI。而更新UI是要主线程来更新的,即UI线程更新。如果在主线线程之外的线程中直接更新页面显示常会报错。抛出异常:android.view.ViewRoot$CalledFromWrongThreadException: Only the original thread that created a view hierarchy can touch its views.
只有原始创建这个视图层次(view hierachy)的线程才能修改它的视图(view)
话不多说,贴出下面的代码
方法一:
在Activity.onCreate(Bundle savedInstanceState)中创建一个Handler类的实例, 在这个Handler实例的handleMessage回调函数中调用更新界面显示的函数。
界面:
- <span style="font-size:14px;">public class MainActivity extends Activity {
- private EditText UITxt;
- private Button updateUIBtn;
- private UIHandler UIhandler;
- @Override
- public void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
- setContentView(R.layout.activity_main);
- UITxt = (EditText)findViewById(R.id.ui_txt);
- updateUIBtn = (Button)findViewById(R.id.update_ui_btn);
- updateUIBtn.setOnClickListener(new View.OnClickListener() {
- public void onClick(View v) {
- // TODO Auto-generated method stub
- UIhandler = new UIHandler();
- UIThread thread = new UIThread();
- thread.start();
- }
- });
- }
- @Override
- public boolean onCreateOptionsMenu(Menu menu) {
- getMenuInflater().inflate(R.menu.activity_main, menu);
- return true;
- }
- private class UIHandler extends Handler{
- @Override
- public void handleMessage(Message msg) {
- // TODO Auto-generated method stub
- super.handleMessage(msg);
- Bundle bundle = msg.getData();
- String color = bundle.getString("color");
- UITxt.setText(color);
- }
- }
- private class UIThread extends Thread{
- @Override
- public void run() {
- try {
- Thread.sleep(3000);
- } catch (InterruptedException e) {
- // TODO Auto-generated catch block
- e.printStackTrace();
- }
- Message msg = new Message();
- Bundle bundle = new Bundle();
- bundle.putString("color", "黄色");
- msg.setData(bundle);
- MainActivity.this.UIhandler.sendMessage(msg);
- }
- }
- }</span>
更新后:
方法二:利用Activity.runOnUiThread(Runnable)把更 新ui的代码创建在Runnable中,然后在需要更新ui时,把这个Runnable对象传给 Activity.runOnUiThread(Runnable)。 这样Runnable对像就能在ui程序中被调用。如果当前线程是UI线程,那么行动是立即执行。如果当前线程不是UI线程,操作是发布到事件队列的UI 线程
- FusionField.currentActivity.runOnUiThread(new Runnable()
- {
- public void run()
- {
- Toast.makeText(getApplicationContext(), , "Update My UI",
- Toast.LENGTH_LONG).show();
- }
- });
相关推荐
安卓Android源码——HandlerLooper2.rar
安卓Android源码——HandlerLooper1.rar
安卓Android源码——HandlerMessage1.rar
安卓Android源码——HandlerMessage2.rar
安卓Android源码——HandlerMessage3.rar
简单实现更新UI的操作,仅供学习参考 这里用到handler类,runnable类,按钮的点击事件
Android Handler定时更新UI
博客《AsnyncTask与handler(二)——handler消息机制》对应源码,博客地址:http://blog.csdn.net/harvic880925/article/details/24783459
Demo-实例讲解线程池里面的UI如何刷新,处理两个开发者头疼的问题: 1. 数据经常需要读取更新,并且比较耗时,需要分步刷新UI. 2. UI界面切换后,如何停止掉子线程里面正在读取的数据而不会将旧数据刷新到新UI界面上...
相信每位Android开发者们都知道更新UI只能在主线程中进行,若是在子线程执行任务后需要更新UI,则需要借助handler跳转到主线程中。以下介绍几种操作UI的方法。 一、使用Handler的handleMessage() Handler的构造 ...
本文实例讲述了Android编程实现使用handler在子线程中更新UI。分享给大家供大家参考,具体如下: MainActivity代码: package com.example.ui; import android.os.Handler; import android.os.Message; import ...
android更新ui方法大合集,整合了4种方法,做成了一个小demo
Android异步处理一:使用Thread+Handler实现非UI线程更新UI界面。
新线程中发送Handle消息,主线程中处理消息并更新TextView的值
前言 我们知道在Android开发中不能在非...android中有下列几种异步更新ui的解决办法: Activity.runOnUiThread(Runnable) View.post(Runnable) long) View.postDelayed(Runnable, long) 使用handler(线程间通讯)
NULL 博文链接:https://rayleung.iteye.com/blog/411860
android——Handler与多线程应用范例
三种更新主线程的方法;handler的两种
android 中Handler 的几种写法,很简单的demo,大神简单修改下,用的是Handler.Callback,的方法