`
iaiai
  • 浏览: 2216816 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

Android 更新UI的两种方法——handler和runOnUiThread()

 
阅读更多
Android 更新UI的两种方法——handler和runOnUiThread()
在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回调函数中调用更新界面显示的函数。

界面:

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);  
              
        }  
    }  
}

更新后:

方法二:利用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();    
            }    
    
        });
  • 大小: 8.1 KB
  • 大小: 7.5 KB
分享到:
评论

相关推荐

    安卓Android源码——五种不同的Toast效果.zip

    - 如果在非主线程中显示Toast,必须确保操作在Handler或者`runOnUiThread()`方法中执行,因为UI操作必须在主线程进行。 7. **自定义Toast的背景颜色和文字样式** - 通过设置TextView的属性,如`android:...

    android 线程

    例如,如果Service需要更新UI,可以通过Handler或者runOnUiThread()方法来实现。 ##### 3. 同步操作 在多线程环境中,同步是非常重要的。不当的同步操作会导致竞态条件等问题。在Android中,常见的同步机制包括: ...

    安卓Android源码——简单计步器源码.zip

    Android提供`Handler`和`runOnUiThread()`等机制来安全地更新UI组件。源码中可能包含一个更新步数计数的函数,该函数被调用以将传感器数据同步到界面上的步数计数器。 5. **权限管理** 使用传感器数据需要在...

    Android源码——倒计时实现源码_new_33.zip

    4. **UI更新**:由于Android是基于UI线程的,所以在`onTick`中更新UI时需要确保操作是线程安全的,通常会通过`runOnUiThread`或`Handler`来避免阻塞主线程。 5. **可能的优化**:考虑到性能,开发者可能会对倒计时的...

    安卓Android源码——progress前台运算.zip

    3. **Handler/Looper**: 这是一种基于消息队列的机制,可以在后台线程处理任务,然后通过Handler发送消息到主线程更新UI。这种方式需要自定义Looper和Handler。 4. **Progress Bar**: 安卓提供了多种进度条组件,如...

    Android源码——进度条对话框Demo_new_69.zip

    它提供了两种样式:旋转的菊花(indeterminate)和确定性(determinate)进度条。 2. **创建ProgressDialog**: 创建ProgressDialog通常通过以下方式: ```java ProgressDialog dialog = new ProgressDialog...

    安卓进度条loadingprogress相关-Android--Progress超牛的使用效果.rar

    1. **基础进度条(ProgressBar)**:Android系统提供了ProgressBar组件,它是UI中显示进度的基本元素,分为两种类型——水平(Horizontal)和旋转(Circular)。水平进度条通常显示任务的完成百分比,而旋转进度条...

    Android应用源码之加速度传感器.zip

    3. **处理传感器事件**:在实现的SensorEventListener接口中,有两个关键的方法——`onSensorChanged(SensorEvent event)`和`onAccuracyChanged(Sensor sensor, int accuracy)`。前者会在传感器数据发生变化时被调用...

    listview多进度条滑动错乱处理

    4. **使用AsyncTask或Loader**:这两种工具可以帮助管理后台任务和UI更新。例如,使用`onProgressUpdate()`方法来同步进度条的值。 5. **监听下载状态**:为每个下载任务添加一个状态监听器,当状态变化时,通知...

    broadcastAndService

    当广播接收器接收到服务发送的广播时,可以调用UI线程的消息队列(Handler)来更新界面,或者直接使用runOnUiThread()方法在主线程上执行更新操作。这样可以确保UI更新不会因跨线程操作导致异常。 综上所述,...

    红包雨功能

    1. **动画库**:Android提供了两种主要的动画库——属性动画(Property Animation)和视图动画(View Animation)。属性动画更强大,可以改变对象的任何可动画属性,如位置、大小等,更适合实现红包雨的效果。视图...

    Android知识点及重要代码合集 word文档

    7.2 UI线程模型的两条规则及矛盾解决的三种方法 61 7.3 方法一代码 62 7.4 AsyncTask 特点、参数及需要实现的方法 64 7.5 异步任务代码 64 7.6 下载进度对话框相关实现代码 67 7.7使用runONUiThread()\...

Global site tag (gtag.js) - Google Analytics