美文网首页
Android线程间通信

Android线程间通信

作者: 悠悠我心_4a00 | 来源:发表于2018-07-19 15:45 被阅读0次

    1.安卓线程间通信的方式有以下几种

    1)共享变量(内存)

    多个线程共享同一份内存,就是说,一个变量可以同时被多个线程所访问。这里要特别注意同步和原子操作的问题。

    2)管道

    “管道”是java.io包的一部分。它是Java的特性,而不是Android特有的。一条“管道”为两个线程建立一个单向的通道。生产者负责写数据,消费者负责读取数据。

    3)handle机制

    一个线程对应一个Looper,一个Looper持有一个MessageQueue,一个Looper可以与多个Handler绑定,一个MessageQueue中可以包含多个Message。

    面试被问到android中两个子线程怎通信

    构造HandlerThread类的对象mHandlerThread,这样生成一个子线程可以调用new

    MyHandler(mHandlerThread.getLooper())来获取子线程的handler,另一个子线程发消息,收到消息的就是子线程而不是主线程了。

    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方法

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

    privatevoidtwo(){

    newThread(){

    @Override

    publicvoidrun(){

    super.run();

    for(inti=0;i<3;i++){

    try{

    sleep(1000);

    }catch(InterruptedException e) {

                            e.printStackTrace();

                        }

                    }

    runOnUiThread(newRunnable() {

    @Override

    publicvoidrun(){

    tv.setText("通过runOnUiThread方法");

                        }

                    });

                }

            }.run();

        }

    3,View.post(Runnable r)

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

    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();

        }

    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());

            }

        }

    相关文章

      网友评论

          本文标题:Android线程间通信

          本文链接:https://www.haomeiwen.com/subject/yeytmftx.html