Android 多线程之间的通信交互(Ui线程与子线程之间的通信)Handler,Handler.post(Runnable runnable),runUiThread方式

时间:2023-01-20 17:28:32

工作内容:

1.FrameLayout/OnTouchListener(滑动监听)

2.生命周期

3.UI线程

4.Android中的耗时操作/多线程

5.多线程中的交互:Handler handler.post(Runnable runnable)

6.多线程中的交互:runOnUiThread(Runnable runnable)

学习分享:

一、FrameLayout贞布局:里面放置的内容,可以一层一层的显示,先放后显示(在该布局对象上添加事件监听,当触发事件时,可以一层一层的设置其可见性【其他布局不可以】)

二、生命周期:onCreate → onStart/onRestart  →  onResume  → 运行状态(显示在最前面) →onPauseonStop  onDestroy

Android 多线程之间的通信交互(Ui线程与子线程之间的通信)Handler,Handler.post(Runnable runnable),runUiThread方式

在生命周期中,程序按上列顺序进入 运行状态,当活动失去焦点,则进入onPause,当活动长时间失去焦点,则进入onStop,可能会被系统回收资源,销毁活动。

三、Ui线程:主要工作是对界面(UI)进行更新和维护,线程不能进行耗时的操作,如果进行了超过5秒的操作可能引起提示框:提示是否继续等待

Android 多线程之间的通信交互(Ui线程与子线程之间的通信)Handler,Handler.post(Runnable runnable),runUiThread方式

四、多线程中的交互:Handler

Handler :可以发送Message,和接收Message【通过message.what = 0来设置message的类型】

Message:可以放置Bundle【用于传送基本数据类型,String和实现了Serizlizable接口的应用类型】

实例1:【可以看到我将子线程中的数据通过handler发送到了handMessage方法中——这样就完成了一个子线程与主线程之间的通信】

import android.app.Activity;
import android.content.Intent;
import android.os.Handler;
import android.os.Message;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;

import java.util.ArrayList;

//在onCreate()方法中添加一条线程(子线程传递一个list到UI线程)
public class MainActivity extends Activity {
    private Button btn_join;
    private ArrayList<String> userList;
    Message message =new Message();
    Message message1 =new Message();
    private int temp = 0;
    Bundle bundle1 =new Bundle();
    Handler handler =new Handler(){
        //接收handler发过来的消息
        @Override
        public void handleMessage(Message msg) {
            message1 = msg;
            switch (msg.what) {
                case 1://接收message.what==1的消息
                    btn_join.setText(temp+"");
                    break;
                default:
                    break;
            }
        };
    };
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        btn_join = (Button)findViewById(R.id.button1);
        btn_join.setOnClickListener(new View.OnClickListener() {
            /**
             * 1.将实现Serializable的类User添加到ArrayList<User>的对象userList中
             * 2.intent.putExtra("Users",userList);传递
             */
            @Override
            public void onClick(View arg0) {
                Intent intent = new Intent(MainActivity.this,Secound.class);
                Bundle bundle = new Bundle();
                intent.putExtra("Users",userList);
                startActivity(intent);
            }
        });
        new Thread(new Runnable() {
            @Override
            public void run() {
                for(int i = 1;i<=10;i++){
                    try {
                        Thread.sleep(1000);
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                    bundle1.putSerializable("user",userList);
                    message.setData(bundle1);//发送bundle
                    message.setTarget(handler);
                    message.what = 1;
                    handler.sendMessage(message);
                    temp++;
                }
            }
        }).start();
    }
}
实例2:使用Handler.post(Runnable runnable)

final Handler handler1 = new Handler();
        new Thread(){//开启子线程
            @Override
            public void run() {
                //子线程中执行
                handler1.post(new Runnable() {
                    @Override
                    public void run() {
                        //执行Ui线程
                    }
                });
            }
        }.start();
实例3:使用runUiThread(Runnable runnable)
new Thread(){
            @Override
            public void run() {
                //子线程中执行
               runOnUiThread(new Runnable() {
                   @Override
                   public void run() {
                       //Ui线程中执行
                   }
               });
            }
        }.start();