Android异步更新UI的四种方式

来源:互联网 发布:徐州软件测试招聘 编辑:程序博客网 时间:2024/05/21 07:13

大家都知道由于性能要求,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");        }       });     }     } 




0 0
原创粉丝点击