獲取其他Activity中開啓的線程

在MainActivity中開啓了一個線程,用來連接藍牙

connectThread = new ConnectThread(selectedDevice, mBluetoothAdapter);
connectThread.start();

此線程開啓後會獲得一個已經連接藍牙設備的BluetoothSocket

public void run(){
    // 連接前先停止搜索,否則會影響連接速度
    mmAdapter.cancelDiscovery();

    // connect是一個阻塞式方法
    try {
        mmSocket.connect();
    } catch (IOException e) {
        Log.d(TAG, "run: 連接失敗");
        // 連接失敗時要關閉socket
        try {
            mmSocket.close();
        } catch (IOException e1) {
            e1.printStackTrace();
        }
        return;
    }
    Log.d(TAG, mmSocket.isConnected()?"連接成功":"連接失敗");
    manageConnectedSocket(mmSocket);
}
另一個TransActivity需要這個BluetoothSocket,只能通過MainActivity中開啓的線程來獲取

首先要在該線程類中提供一個方法

/**
 * 對外提供Socket
 * @return
 */
public BluetoothSocket getSocket() {
    Log.d(TAG, "getSocket: "+mmSocket==null?"socket爲空":"socket不爲空");
   return mmSocket;
}
只要獲取了該線程,就能獲取到這個socket

那麼在其他Activity中怎麼獲取MainActivity中的線程呢?

首先聲明一個instance變量,然後再onCreate方法中賦予MainActivity實例

public static MainActivity instance;

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

在另一個Activity中獲取該實例,進而獲取到已經開啓的線程

MainActivity activity=MainActivity.instance;
connectThread=activity.getConnectThread(); // 不開啓新的線程,而是從原有線程獲取Socket
mSocket = connectThread.getSocket();

當然,不要忘了在MainActivity中提供獲取這個已經開啓的線程的方法

public ConnectThread getConnectThread(){
    return connectThread;
}

完~

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章