2016-09-21 3 views
0

私のプログラムでは、私はBroadcastReceiverを持っています。そこで私は新しいBluetooth ConnectedThreadを作成しています。既存のスレッドへのアクセス

しかし、私はこのスコープにアクセスする必要があります(レシーバーの外のメソッド)。 thread.write(bytesWrite);別のスレッドを作成したくないので、既存のスレッドにアクセスする必要があります。また、私は未知のパラメータ(btSocket)を置くことができないので、私は受信機からスレッドを宣言できません。

この問題を解決するにはどうすればよいですか?

答えて

0

これを行う1つの方法は、作成したばかりのスレッドへの参照を保持することです。あなたの受信では、実行します。

public YourReceiver extends BroadcastReceiver { 
    @Nullable public static ConnectedThread thread; 

    public void onReceive(...) { 
    thread = new ConnectedThread(btSocket); 
    thread.start(); 
    } 
} 

次にどんなクラスからあなたがしている、あなたはYourReceiver.thread経由でスレッドを参照することができます。

ConnectionThreadへの静的リファレンスを保持することは無駄です(その参照を解放するまでConnectionThreadはGCされません)ので、いつでも無効にしてください。 問題が発生する可能性があるもう一つの問題は、スレッドの使用前、つまりスレッドがまだ実行中であるか、実行済みかどうかを確認することです。

  1. ConnectThread
  2. ConnectThreadの参照を取得するにはConnectThread
  3. 異なる範囲

内のスレッドを作成します1:

0

あなたは、少なくとも3つのスレッドを持っていますスレッド2(ConnectThreadを作成するスレッド)とスレッド3(別のスコープ内のスレッド)で使用可能なものが必要です。

ConnectedThread thread = new ConnectedThread(btSocket); 
ThreadHolder.connectedThread=thread; 
thread.start(); 

で:スレッド2では

public class ThreadHolder{ 
    public static ConnectedThread connectedThread 
} 

は、あなたが参照を設定します。

単純なアプローチは、スレッドの参照を保持している静的変数を持つクラスThreadHolderを持つことが、可能性がありスレッド3あなたはそれを見つける:

また、ConnectedThreadにthread.setName( "connectedThread")

そして、この方法を使用してhtread 3でそれを見つける:スレッド2に名前

public Thread getThreadByName(String threadName) { 
    for (Thread t : Thread.getAllStackTraces().keySet()) { 
    if (t.getName().equals(threadName)) return t; 
    } 
    return null; 
} 

find thread by name

も参照
関連する問題