Android在子线程更新UI方式总结

来源:互联网 发布:康耐视视觉软件下载 编辑:程序博客网 时间:2024/05/24 03:09

1.Handler方式

—————-复写handler的handleMessage方式——————-

//在UI线程中创建Handler对象private Handler mHandler = new Handler(){     @Override     public void handleMessage(Message msg) {            //根据Message的内容做相应的更新(一般使用msg.what,也可进行数据传递)     }}//在非UI线程中(子线程)使用Handler发送更新消息int UPDADE_UI = 1;Messager msg = Message.obtain();msg.what = UPDATE_UI;mHandler.sendMessage(msg);

—————-handler.post方式——————-

//在UI线程中创建Handler对象private Handler handler = new Handler();//在子线程中调用Handler对象更新handler.post(new Runnable() {  @Override  public void run() {        //在此处直接更新UI,例如mText.setText("更新");  }});

2.AsyncTask

new AsyncTask<Void, Void, Void>() {  @Override  protected void onPreExecute() {      super.onPreExecute();            }  @Override  protected Void doInBackground(Void... params) {  }    //onPostExecute()方法内可直接更新UI  @Override  protected void onPostExecute(Void aVoid) {     //在此处可直接执行更新UI的操作  }}.execute();

3.view.post

将一个Runnable添加到消息队列,Runnable将在UI线程运行。
This method can be invoked from outside of the UI thread only when this View is attached to a window.即必须保证该View被添加到窗口。

setContentView(R.layout.activity_main);button = (Button) findViewById(R.id.btn_show);button.setOnClickListener(new View.OnClickListener() {  @Override  public void onClick(View v) {    new Thread(new Runnable() {      @Override      public void run() {        //此处处于子线程内        button.post(new Runnable() {        @Override        public void run() {          button.setText("liuconen");        }      });    }  }).start();  }});

4.Activity.runOnUiThread(Runnable)方式

public final void runOnUiThread (Runnable action)
在UI线程中执行,如果当前线程是UI线程是UI线程,动作将被立即执行; 如果当前线程不是UI线程,动作将被发送到UI线程的消息队列(按照消息队列的顺序执行)
示例:

button = (Button) findViewById(R.id.btn_show);button.setOnClickListener(new View.OnClickListener() {  @Override  public void onClick(View v) {    new Thread(new Runnable() {      @Override      public void run() {        runOnUiThread(new Runnable() {           @Override           public void run() {              //此处直接更新UI              button.setText("liuconen");           }        });      }    }).start();  }});
0 0
原创粉丝点击