Android异步更新UI的四种方式

Android异步更新UI的四种方式

2015-09-06 09:23 segmentfault 字号:T | T
Android异步更新UI的四种方式

大家都知道由于性能要求,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. {
  10. public void handleMessage(android.os.Message msg) {
  11. if(msg.what==0x123)
  12. {
  13. tv.setText("更新后的TextView");
  14. }
  15. };
  16. };
  17. @Override
  18. protected void onCreate(Bundle savedInstanceState) {
  19. super.onCreate(savedInstanceState);
  20. setContentView(R.layout.activity_main);
  21. tv = (TextView) findViewById(R.id.tv);
  22. new MyThread().start();
  23. }
  24. class MyThread extends Thread
  25. {
  26. @Override
  27. public void run() {
  28. //延迟两秒更新
  29. try {
  30. Thread.sleep(2000);
  31. } catch (InterruptedException e) {
  32. // TODO Auto-generated catch block
  33. e.printStackTrace();
  34. }
  35. handler.sendEmptyMessage(0x123);
  36. }
  37. }
  38. }

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. }
  15. class Yibu extends AsyncTask<String, String, String>
  16. {
  17. @Override
  18. protected String doInBackground(String... params) {
  19. try {
  20. Thread.sleep(2000);
  21. } catch (InterruptedException e) {
  22. // TODO Auto-generated catch block
  23. e.printStackTrace();
  24. }
  25. return null;
  26. }
  27. @Override
  28. protected void onPostExecute(String result) {
  29. // TODO Auto-generated method stub
  30. tv.setText("更新后的TextView");
  31. }
  32. }
  33. }

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. }
  14. class MyThread extends Thread
  15. {
  16. @Override
  17. public void run() {
  18. runOnUiThread(new Runnable() {
  19. @Override
  20. public void run() {
  21. // TODO Auto-generated method stub
  22. try {
  23. //延迟两秒更新
  24. Thread.sleep(2000);
  25. } catch (InterruptedException e) {
  26. e.printStackTrace();
  27. }
  28. tv.setText("更新后的TextView");
  29. }
  30. });
  31. }
  32. }
  33. }

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. });
  26. }
  27. }
上一篇:Winform实现多线程异步更新UI(进度及状态信息)


下一篇:使用AsyncTask异步更新UI界面及原理分析