Android异步更新UI的四种方式

本文介绍了在Android应用开发中更新UI的四种常见方法:使用Handler消息传递机制、AsyncTask异步任务、runOnUiThread方法及Handler的post(Runnable)方法,并提供了具体的代码示例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

大家都知道由于性能要求,android要求只能在UI线程中更新UI,要想在其他线程中更新UI,我大致总结了4种方式,欢迎补充纠正:


  1. 使用Handler消息传递机制;

  2. 使用AsyncTask异步任务;

  3. 使用runOnUiThread(action)方法;

  4. 使用Handler的post(Runnabel r)方法;

下面分别使用四种方式来更新一个TextView。

1.使用Handler消息传递机制

    package com.example.runonuithreadtest; 
    import android.app.Activity; 
    import android.os.Bundle; 
    import android.os.Handler; 
    import android.widget.TextView; 
    public class MainActivity extends Activity { 
    private TextView tv; 
    Handler handler = new Handler() 
    { 
      public void handleMessage(android.os.Message msg) { 
       if(msg.what==0x123) 
       { 
        tv.setText("更新后的TextView"); 
       } 
      }; 
    }; 
    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
      super.onCreate(savedInstanceState); 
      setContentView(R.layout.activity_main); 
      tv = (TextView) findViewById(R.id.tv); 
      new MyThread().start(); 
    } 
    class MyThread extends Thread 
    { 
      @Override 
      public void run() { 
       //延迟两秒更新 
       try { 
        Thread.sleep(2000); 
       } catch (InterruptedException e) { 
        // TODO Auto-generated catch block 
        e.printStackTrace(); 
       } 
       handler.sendEmptyMessage(0x123); 
      } 
    } 
    } 

2. 使用AsyncTask异步任务

注:更新UI的操作只能在onPostExecute(String result)方法中。

    package com.example.runonuithreadtest; 
    import android.app.Activity; 
    import android.os.AsyncTask; 
    import android.os.Bundle; 
    import android.widget.TextView; 
    public class MainActivity extends Activity { 
    private TextView tv; 
    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
      super.onCreate(savedInstanceState); 
      setContentView(R.layout.activity_main); 
      tv = (TextView) findViewById(R.id.tv); 
      new Yibu().execute(); 
    } 
    class Yibu extends AsyncTask<String, String, String> 
    { 
      @Override 
      protected String doInBackground(String... params) { 
       try { 
        Thread.sleep(2000); 
       } catch (InterruptedException e) { 
        // TODO Auto-generated catch block 
        e.printStackTrace(); 
       } 
       return null; 
      } 
      @Override 
      protected void onPostExecute(String result) { 
       // TODO Auto-generated method stub 
       tv.setText("更新后的TextView"); 
      } 
    } 
    } 

3. 使用runOnUiThread(action)方法

    package com.example.runonuithreadtest; 
    import android.app.Activity; 
    import android.os.Bundle; 
    import android.widget.TextView; 
    public class MainActivity extends Activity { 
    private TextView tv; 
    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
      super.onCreate(savedInstanceState); 
      setContentView(R.layout.activity_main); 
      tv = (TextView) findViewById(R.id.tv); 
      new MyThread().start(); 
    } 
    class MyThread extends Thread 
    { 
      @Override 
      public void run() { 
       runOnUiThread(new Runnable() { 
        @Override 
        public void run() { 
         // TODO Auto-generated method stub 
          try { 
           //延迟两秒更新 
           Thread.sleep(2000); 
          } catch (InterruptedException e) { 
           e.printStackTrace(); 
          } 
          tv.setText("更新后的TextView"); 
        } 
       }); 
      } 
    } 
    } 
4. 使用Handler的post(Runnabel r)方法

    package com.example.runonuithreadtest; 
    import android.app.Activity; 
    import android.os.Bundle; 
    import android.os.Handler; 
    import android.widget.TextView; 
    public class MainActivity extends Activity { 
    private TextView tv; 
    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
      super.onCreate(savedInstanceState); 
      setContentView(R.layout.activity_main); 
      tv = (TextView) findViewById(R.id.tv); 
      Handler handler = new Handler(); 
      handler.post(new Runnable(){ 
       @Override 
       public void run() { 
        try { 
         //延迟两秒更新 
         Thread.sleep(2000); 
        } catch (InterruptedException e) { 
         e.printStackTrace(); 
        } 
        tv.setText("更新后的TextView"); 
       } 
      }); 
    } 
    } 




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值