软件编程
位置:首页>> 软件编程>> Android编程>> android实现线程间通信的四种常见方式

android实现线程间通信的四种常见方式

作者:流星雨在线  发布时间:2022-08-20 13:11:17 

标签:android,线程,通信

1,通过Handler机制

主线程中定义Handler,子线程发消息,通知Handler完成UI更新,Handler对象必须定义在主线程中,如果是多个类直接互相调用,就不是很方便,需要传递content对象或通过接口调用。 另外Handler机制与Activity生命周期不一致的原因,容易导致内存泄漏,不推荐使用。


private void one() {
       handler=new Handler(){
           @Override
           public void handleMessage(Message msg) {
               super.handleMessage(msg);
               switch (msg.what){
                   case 123:
                       tv.setText(""+msg.obj);
                       break;
               }
           }
       };
       new Thread(){
           @Override
           public void run() {
               super.run();
               for (int i=0;i<3;i++){
                   try {
                       sleep(1000);
                   } catch (InterruptedException e) {
                       e.printStackTrace();
                   }
               }
               Message message=new Message();
               message.what=123;
               message.obj="通过Handler机制";
               handler.sendMessage(message);
           }
       }.run();
   }

2,runOnUiThread方法


private void two(){
       new Thread(){
           @Override
           public void run() {
               super.run();
               for (int i=0;i<3;i++){
                   try {
                       sleep(1000);
                   } catch (InterruptedException e) {
                       e.printStackTrace();
                   }
               }
               runOnUiThread(new Runnable() {
                   @Override
                   public void run() {
                       tv.setText("通过runOnUiThread方法");
                   }
               });
           }
       }.run();
   }

用Activity对象的runOnUiThread方法更新,在子线程中通过runOnUiThread()方法更新UI,强烈推荐使用。

3,View.post(Runnable r) 、


private void three(){
       new Thread(){
           @Override
           public void run() {
               super.run();
               for (int i=0;i<3;i++){
                   try {
                       sleep(1000);
                   } catch (InterruptedException e) {
                       e.printStackTrace();
                   }
               }
               tv.post(new Runnable() {
                   @Override
                   public void run() {
                       tv.setText("通过View.post(Runnable r) 方法");
                   }
               });
           }
       }.run();
   }

这种方法更简单,但需要传递要更新的View过去,推荐使用

4,AsyncTask


private void four(){
       new MyAsyncTask().execute("通过AsyncTask方法");
   }
private class MyAsyncTask extends AsyncTask{
       @Override
       protected Object doInBackground(Object[] objects) {
           for (int i=0;i<3;i++){
               try {
                   sleep(1000);
               } catch (InterruptedException e) {
                   e.printStackTrace();
               }
           }
           return objects[0].toString();
       }
       @Override
       protected void onPostExecute(Object o) {
           super.onPostExecute(o);
           tv.setText(o.toString());
       }
   }

来源:https://blog.csdn.net/liuxingyuzaixian/article/details/78893392

0
投稿

猜你喜欢

手机版 软件编程 asp之家 www.aspxhome.com