Android 之路57---Android线程间通信

导读

1.多线程与ANR
2.Thread类的使用
3.Handler, Looper, MessageQueue
4.主线程与子线程的通信

多线程与ANR

这里写图片描述

这里写图片描述

这里写图片描述

这里写图片描述

这里写图片描述

Thread类的使用

基本知识点

这里写图片描述

这里写图片描述

这里写图片描述

这里写图片描述

这里写图片描述

扩展Thread类

布局文件 activity_main.xml

<?xml version="1.0" encoding="utf-8"?>
<android.support.constraint.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context="com.hala.thread.MainActivity">

    <Button
        android:id="@+id/button"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_marginBottom="8dp"
        android:layout_marginEnd="8dp"
        android:layout_marginStart="8dp"
        android:layout_marginTop="8dp"
        android:text="Start to work! "
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="parent" />

</android.support.constraint.ConstraintLayout>

MainActivity.java

package com.hala.thread;

import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.Button;

public class MainActivity extends AppCompatActivity {

    private final String TAG="Thread";
    private Button mStartWorkButton;


    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        mStartWorkButton=(Button) findViewById(R.id.button);
        mStartWorkButton.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                //四个线程同时工作
                SaleTickets saleTickets1=new SaleTickets(5);
                SaleTickets saleTickets2=new SaleTickets(6);
                SaleTickets saleTickets3=new SaleTickets(8);
                SaleTickets saleTickets4=new SaleTickets(10);
                saleTickets1.start();
                saleTickets2.start();
                saleTickets3.start();
                saleTickets4.start();
            }
        });
    }


    private class  SaleTickets extends Thread{
        private int tickets=0;

        public SaleTickets(int tickets){
            this.tickets=tickets;

        }

        @Override
        public void run() {
            super.run();
            while (tickets>0){
                saleTicket();
            }
            Log.d(TAG,""+Thread.currentThread().getName()+"sale tickets done!");
        }

        private void saleTicket(){
            try {
                Thread.sleep(1000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            tickets--;
            Log.d(TAG,""+Thread.currentThread().getName()+"Saled one ticket, left"+tickets+"tickets!");
        }
    }
}

显示结果

这里写图片描述

Runnable接口

⚠️其实Thread类在本质上还是继承了Runnable接口

布局文件不变

MainActivity.java

package com.hala.thread;

import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.Button;

public class MainActivity extends AppCompatActivity {

    private final String TAG="Thread";
    private Button mStartWorkButton;
    private SaleTickets SaleTicket;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        mStartWorkButton=(Button) findViewById(R.id.button);
        mStartWorkButton.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                new Thread(SaleTicket,"队伍一").start();
            }
        });

        SaleTicket=new SaleTickets(10);
    }


    private class  SaleTickets implements Runnable{

        private int tickets=0;
        public SaleTickets(int tickets){
            this.tickets=tickets;
        }

        @Override
        public void run() {
            while (tickets>0){
                sale();
            }
            Log.d(TAG,""+Thread.currentThread().getName()+"票卖完了");
        }

        private void sale(){
            tickets--;
            Log.d(TAG,""+Thread.currentThread().getName()+"卖了一张票,还剩下:"+tickets+" 张票!");
        }
    }

}

显示结果

这里写图片描述

Handler, Looper, MessageQueue

这里写图片描述

这里写图片描述

这里写图片描述

这里写图片描述

这里写图片描述

总结

这里写图片描述

这里写图片描述

主线程与子线程的通信

布局文件

<?xml version="1.0" encoding="utf-8"?>
<android.support.constraint.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context="com.hala.thread.MainActivity">

    <Button
        android:id="@+id/button"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_marginEnd="8dp"
        android:layout_marginStart="8dp"
        android:layout_marginTop="8dp"
        android:text="Start to work! "
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="parent" />

    <TextView
        android:id="@+id/text"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_marginEnd="8dp"
        android:layout_marginStart="8dp"
        android:text="hahaha"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toBottomOf="@+id/button" />

</android.support.constraint.ConstraintLayout>

MainActivity.java

package com.hala.thread;

import android.os.Handler;
import android.os.Looper;
import android.os.Message;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import android.widget.TextView;

public class MainActivity extends AppCompatActivity {

    private final String TAG="Thread";
    private Button mStartWorkButton;
    private TextView mTextView;

    private Handler mMainHandler;
    private Handler mChildHandler;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        mTextView=(TextView)findViewById(R.id.text) ;
        mStartWorkButton=(Button) findViewById(R.id.button);
        mStartWorkButton.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {

                if(mChildHandler!=null) {
                    Message msg = new Message();
                    msg.what = 9;
                    msg.obj = "Emilia Clark";
                    mChildHandler.sendMessage(msg);
                }
            }
        });

        mMainHandler=new Handler(){
            @Override
            public void handleMessage(Message msg) {
                super.handleMessage(msg);
                String fromChildHandler=(String) msg.obj;
                mTextView.setText(fromChildHandler);
            }
        };

        new ChildThread().start();

    }

    private class ChildThread extends Thread{
        @Override
        public void run() {
            super.run();
            Looper.prepare();

            mChildHandler=new Handler(){
                @Override
                public void handleMessage(Message msg) {
                    super.handleMessage(msg);

                    Log.d(TAG,"接收到主线程发过来的what="+msg.what);
                    String fromMainString=(String)msg.obj;
                    String toMainString= fromMainString+" i v u";

                    Message message=new Message();
                    message.obj=toMainString;
                    if(mMainHandler!=null){
                        mMainHandler.sendMessage(message);
                    }
                }
            };
            Looper.loop();
        }
    }



}

显示结果

这里写图片描述

这里写图片描述

这里写图片描述

猜你喜欢

转载自blog.csdn.net/qq_37527943/article/details/80103917