zoukankan      html  css  js  c++  java
  • Android异步更新UI的四种方式

    Android异步更新UI的四种方式

    2015-09-06 09:23 segmentfault 字号:T | T
    一键收藏,随时查看,分享好友!

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

    AD:

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

    Android异步更新UI的四种方式

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

    2. 使用AsyncTask异步任务;

    3. 使用runOnUiThread(action)方法;

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

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

    1.使用Handler消息传递机制

    1. package com.example.runonuithreadtest; 
    2. import android.app.Activity; 
    3. import android.os.Bundle; 
    4. import android.os.Handler; 
    5. import android.widget.TextView; 
    6. public class MainActivity extends Activity { 
    7. private TextView tv; 
    8. Handler handler = new Handler() 
    9.   public void handleMessage(android.os.Message msg) { 
    10.    if(msg.what==0x123) 
    11.    { 
    12.     tv.setText("更新后的TextView"); 
    13.    } 
    14.   }; 
    15. }; 
    16. @Override 
    17. protected void onCreate(Bundle savedInstanceState) { 
    18.   super.onCreate(savedInstanceState); 
    19.   setContentView(R.layout.activity_main); 
    20.   tv = (TextView) findViewById(R.id.tv); 
    21.   new MyThread().start(); 
    22. class MyThread extends Thread 
    23.   @Override 
    24.   public void run() { 
    25.    //延迟两秒更新 
    26.    try { 
    27.     Thread.sleep(2000); 
    28.    } catch (InterruptedException e) { 
    29.     // TODO Auto-generated catch block 
    30.     e.printStackTrace(); 
    31.    } 
    32.    handler.sendEmptyMessage(0x123); 
    33.   } 

    2. 使用AsyncTask异步任务

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

    1. package com.example.runonuithreadtest; 
    2. import android.app.Activity; 
    3. import android.os.AsyncTask; 
    4. import android.os.Bundle; 
    5. import android.widget.TextView; 
    6. public class MainActivity extends Activity { 
    7. private TextView tv; 
    8. @Override 
    9. protected void onCreate(Bundle savedInstanceState) { 
    10.   super.onCreate(savedInstanceState); 
    11.   setContentView(R.layout.activity_main); 
    12.   tv = (TextView) findViewById(R.id.tv); 
    13.   new Yibu().execute(); 
    14. class Yibu extends AsyncTask<String, String, String> 
    15.   @Override 
    16.   protected String doInBackground(String... params) { 
    17.    try { 
    18.     Thread.sleep(2000); 
    19.    } catch (InterruptedException e) { 
    20.     // TODO Auto-generated catch block 
    21.     e.printStackTrace(); 
    22.    } 
    23.    return null; 
    24.   } 
    25.   @Override 
    26.   protected void onPostExecute(String result) { 
    27.    // TODO Auto-generated method stub 
    28.    tv.setText("更新后的TextView"); 
    29.   } 

    3. 使用runOnUiThread(action)方法

    1. package com.example.runonuithreadtest; 
    2. import android.app.Activity; 
    3. import android.os.Bundle; 
    4. import android.widget.TextView; 
    5. public class MainActivity extends Activity { 
    6. private TextView tv; 
    7. @Override 
    8. protected void onCreate(Bundle savedInstanceState) { 
    9.   super.onCreate(savedInstanceState); 
    10.   setContentView(R.layout.activity_main); 
    11.   tv = (TextView) findViewById(R.id.tv); 
    12.   new MyThread().start(); 
    13. class MyThread extends Thread 
    14.   @Override 
    15.   public void run() { 
    16.    runOnUiThread(new Runnable() { 
    17.     @Override 
    18.     public void run() { 
    19.      // TODO Auto-generated method stub 
    20.       try { 
    21.        //延迟两秒更新 
    22.        Thread.sleep(2000); 
    23.       } catch (InterruptedException e) { 
    24.        e.printStackTrace(); 
    25.       } 
    26.       tv.setText("更新后的TextView"); 
    27.     } 
    28.    }); 
    29.   } 

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

    1. package com.example.runonuithreadtest; 
    2. import android.app.Activity; 
    3. import android.os.Bundle; 
    4. import android.os.Handler; 
    5. import android.widget.TextView; 
    6. public class MainActivity extends Activity { 
    7. private TextView tv; 
    8. @Override 
    9. protected void onCreate(Bundle savedInstanceState) { 
    10.   super.onCreate(savedInstanceState); 
    11.   setContentView(R.layout.activity_main); 
    12.   tv = (TextView) findViewById(R.id.tv); 
    13.   Handler handler = new Handler(); 
    14.   handler.post(new Runnable(){ 
    15.    @Override 
    16.    public void run() { 
    17.     try { 
    18.      //延迟两秒更新 
    19.      Thread.sleep(2000); 
    20.     } catch (InterruptedException e) { 
    21.      e.printStackTrace(); 
    22.     } 
    23.     tv.setText("更新后的TextView"); 
    24.    } 
    25.   }); 
  • 相关阅读:
    常用/常见Java Web 服务器/应用服务器Logo图文介绍
    三个快速且简单的让你的大脑安静下来的方法
    怎样判断自己是否在程序员平庸者之列?
    “好奇号”火星车和它搭载的软件(来自Erlang程序员的观点)
    旁观者效应”是如何毁掉我们的代码的
    怎么理解面向对象和面向过程到底的本质区别?
    面向对象方法论与结构化方法论的本质区别【转】
    不懂技术的人不要对懂技术的人说这很容易实现
    最近,波兰的程序员Chris(也叫KreCi)公布了他的第十四期程序员收入报告
    计算机专业的学生必须掌握的五门课程 不能掌握他们就不应该获得学位
  • 原文地址:https://www.cnblogs.com/doudou618/p/5001945.html
Copyright © 2011-2022 走看看