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

更多相关文章

  1. 第三方程序调用Android(安卓)Telephony 接口机制
  2. Android(安卓)MediaPlayer使用注意
  3. Fragment的添加方法总结
  4. Android(安卓)Service的onRebind方法调用时机
  5. Android中使用事件总线的优缺点
  6. Android(安卓)学习资料大集合
  7. Android(安卓)Broadcast机制深入解析
  8. SurfaceView
  9. 7、Android中Bundle类的作用

随机推荐

  1. Android(安卓)onTouchEvent、dispatchTou
  2. android知识拾遗——1
  3. android读写SD卡封装的类
  4. Android超级终端之Termux(2)
  5. android widget的自动更新
  6. Android中POST请求代码
  7. android亮屏、暗屏、解锁、关闭系统对话
  8. Android(安卓)网易客户端源码
  9. ListActivity学习
  10. android 代码里设置控件属性