Android 線程間通信

一、前言

總的來說,Android的線程間通信主要有以下幾種方式:
1.系統(tǒng)自帶(原生):Handler機制;AsyncTask;管道流通信;共享內存;java里的wait(),notify(),notifyAll();Activity的runOnUiThread(Runnable action)及View的post(Runnable action)等;
2.第三方開源框架:EventBus等。
歸根結底,AsyncTask,runOnUiThread(Runnable action)及post(Runnable action)甚至EventBus最終使用的還是Handler機制來進行線程間的通信。所以,線程間的通信實際上有這幾種:Handler機制;管道流通信;共享內存;java里的wait(),notify(),notifyAll()(需要在同步語句塊里面才能使用)。

二、各種通信方式解析:

1.Handler機制是Android中最常用的機制,通常用于子線程來執(zhí)行耗時任務完畢后,通過調用主線程的handler來發(fā)送信息,這樣就可以在主線程的handler的handleMessage中回調,我們這時就處于主線程中,可以對UI進行更新等操作。
2.管道流通信:

package com.wei.wanandroid.javasources.thread;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.PipedReader;
import java.io.PipedWriter;

/**
 * 通常沒有必要使用管道流來控制兩個線程之間的通信,因為兩個線程屬于同一個進程,它們可以非常
 * 方便地共享數(shù)據,這種方式才是線程之間進行信息交換的最好方式,而不是使用管道流。
 * @author: WEI
 * @date: 2018/7/24
 */
public class PipedCommunicationTest
{
    public static void main(String[] args) {
        PipedWriter pipedWriter = null;
        PipedReader pipedReader = null;
        try {
            // 分別創(chuàng)建兩個獨立的管道輸出流、輸入流
            pipedWriter = new PipedWriter();
            pipedReader = new PipedReader();
            // 連接管道輸出流、輸入流
            pipedWriter.connect(pipedReader);
            // 將連接好的管道流分別傳入兩個線程,就可以讓兩個線程通過管道流進行通信
            new WriterThread(pipedWriter).start();
            new ReaderThread(pipedReader).start();
        }catch (Exception e)
        {
            e.printStackTrace();
        }
    }
}

class ReaderThread extends Thread
{
    private PipedReader mPipedReader;
    // 用于包裝管道流的 BufferedReader 對象
    private BufferedReader mBufferedReader;
    public ReaderThread(PipedReader pipedReader)
    {
        mPipedReader = pipedReader;
        mBufferedReader = new BufferedReader(mPipedReader);
    }

    @Override
    public void run() {
        String buf;
        try {
            // 逐行讀取管道輸入流中的內容
            while ((buf = mBufferedReader.readLine()) != null)
            {
                System.out.println(buf);
            }
        }catch (Exception e)
        {
            e.printStackTrace();
        }finally {
            try {
                if (mBufferedReader != null)
                {
                    mBufferedReader.close();
                }
            }catch (Exception e)
            {
                e.printStackTrace();
            }
        }
    }
}

class WriterThread extends Thread
{
    String[] books = {"Android開發(fā)藝術探索", "Android核心分析", 
"Android權威指南", "Android高級進階"};
    private PipedWriter mPipedWriter;

    public WriterThread(PipedWriter pipedWriter)
    {
        mPipedWriter = pipedWriter;
    }

    @Override
    public void run() {
        try {
            // 循環(huán)100次,向管道輸出流中寫入100組字符串
            for (int i = 0; i < 100; i ++)
            {
                mPipedWriter.write(books[i % 4] + "\n");
            }
        }catch (Exception e)
        {
            e.printStackTrace();
        }finally {
            try {
                if (mPipedWriter != null)
                {
                    mPipedWriter.close();
                }
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
}

?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
【社區(qū)內容提示】社區(qū)部分內容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發(fā)布,文章內容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內容

友情鏈接更多精彩內容