IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 移动开发 -> Java 管道流 :Android 线程间通信的另一种选择 -> 正文阅读

[移动开发]Java 管道流 :Android 线程间通信的另一种选择

不为别的,为了卷面试官也要看看…

PipedInputstream 和 PipedOutputStream 是Java1.1 时代就有的线程间通信API,但似乎是很少被提及,或许是其使用到的场景比较少,而且线程间通信方案简直太多了…

在Android领域这个API被保留了下来,同样你可以用它来干Handler的事情,使用的一般步骤如下

  1. 初始化管道
  2. 连接管道
  3. 在各自的线程种开启通信

优点:

1.流程化的过程,能轻易找到数据两端,Handler则是到处都可以send

2.看起来可以传送任何数据,包括大块流式数据,二进制数据等(谁不能,我根本不用传,共享不行么)

缺点:

使用比较麻烦,而且PipedOutputStream内部还要多开2个线程,一个读,一个写,并且应用层面还要多开线程,一个读写功能可能至少都要开3个线程,开销比较大…

总结

没什么太大用处,纯粹是"茴"的另一种写法…

演示

以下演示如何接受子线程发送的数据然后更新到主线程中


public class Demo2MainActivity extends AppCompatActivity {
    private TextView textViewLabel;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_demo2_main);
        textViewLabel = findViewById(R.id.textViewLabel2);
        setTitle("Java管道流用户Android线程间通信");

        //1.初始化管道
        PipedInputStream pins = new PipedInputStream();
        PipedOutputStream pouts = new PipedOutputStream();

        try {
            pins.connect(pouts);//2.连接管道
        } catch (Exception e) {
            e.printStackTrace();
        }

        //====================各自线程种执行数据收发============
        //3.开启子线程,子线程发法消息到主线程
        new SubThread(pouts, new WeakReference<>(this)).start();

        //4.接收到子线程发出来的数据,更新到主线程UI
        new Thread(() -> {
            byte[] buf = new byte[512];
            while (true) {
                int ret = 0;
                try {
                    ret = pins.read(buf);
                } catch (IOException e) {
                    e.printStackTrace();
                }
                String received = new String(buf, 0, ret);
                textViewLabel.post(() -> textViewLabel.setText("主线程接到的子线程数据:\n" + received));
            }
        }).start();

    }

    /**
     * 在子线程中不断向主线程发消息
     */
    public static class SubThread extends Thread {
        public SubThread(PipedOutputStream pipedOutputStream, WeakReference<Activity> activityWeakReference) {
            super(() -> {
                while (true) {
                    if (null == activityWeakReference.get() || activityWeakReference.get().isFinishing()) {
                        break;
                    }
                    try {
                        if (null != pipedOutputStream) {
                            pipedOutputStream.write(("子线程名:" + Thread.currentThread().getName() + "  数据:" + System.currentTimeMillis() + "\n").getBytes(StandardCharsets.UTF_8));
                        }
                        Thread.sleep(1000);
                    } catch (Exception e) {
                        e.printStackTrace();
                    }
                }
            });
        }
    }

}

效果图

demo.gif

  移动开发 最新文章
Vue3装载axios和element-ui
android adb cmd
【xcode】Xcode常用快捷键与技巧
Android开发中的线程池使用
Java 和 Android 的 Base64
Android 测试文字编码格式
微信小程序支付
安卓权限记录
知乎之自动养号
【Android Jetpack】DataStore
上一篇文章      下一篇文章      查看所有文章
加:2022-04-22 18:47:44  更:2022-04-22 18:47:55 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/24 22:02:28-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码