2016-05-16 10 views
0

アンドロイドアプリを終了したときにスレッドを実行したままにしておくと、アプリを再起動するとそのスレッドにアクセスできますか?私はスレッドが私のアプリに関連付けられていることを知っています。なぜなら、私はsettings-apps-force stopに行くことによってそれを強制終了することができるからです。アプリが終了した後にアンドロイドスレッドを見つける

詳細:私のアプリは、Bluetoothを介してデバイスに接続します。タブレットを回転させると、アプリケーションが再起動されますが、すべてのスレッドを停止しないと、古いスレッドはデバイスに再接続し、アプリケーションは新しいスレッドに接続できなくなります。

アプリの画面を回転させずに、接続スレッドonDestroy()を強制終了することで、基本的な問題を解決しました。私はちょうど好奇心からゾンビ糸のような種類と再接続する方法を知りたいです。

私はThread.enumerate()で認識できないスレッドを見ることができますが、名前とその状態を見る以外に、スレッドにアクセスする方法がわかりません。

答えて

0

私のアプリでこれを処理する方法は、アクティビティのonRetainCustomNonConfigurationInstance()メソッドをオーバーライドする方法です。この方法では、画面を回転させたときに再起動してオブジェクトを保持することができます。ここで私はそれを実装する方法です。

私はWebリクエストを実行するAsyncTaskを持っています。 AsyncTaskは別のファイルにあり、実装しているコールバックのリスナーとして呼び出しアクティビティへの参照を受け取ります。だから、私のWeb要求AsyncTaskのコンストラクタは次のようなものです:

private Callbacks listener; 

public WebRequest(Callbacks listener) { 
    this.listener = listener; 
} 

私はこのような私の活動にonRetainCustomNonConfigurationInstance()を実装:

@Override 
public Object onRetainCustomNonConfigurationInstance() { 
    if(webRequest != null) { 
     webRequest.detachFromActivity(); 
     return webRequest; 
    } else { 
     return null; 
    } 
} 

を今、私の画面を回転させると、活動の再起動、および場合私のAsyncTaskが実行されている場合は、ここに参照が保存されます。この現在のアクティビティから自分のタスクを「切り離す」ことに注目してください。現在のアクティビティは破棄されます。私はリスナー(現在のアクティビティ)をnullにするだけで、私の仕事でこれを達成します。このように:を参照するので

Object retainedRequest = getLastCustomNonConfigurationInstance(); 
if(retainedRequest != null) { 
    if(retainedRequest instanceof WebRequest) { 
     webRequest = (WebRequest) retainedRequest; 
     webRequest.setListener(this); 
    } 
} 

:アクティビティを再起動すると、onCreate()で、私はこのようなgetLastCustomNonConfigurationInstance()を呼び出すことによって、私の実行中のスレッドを保持言及があったかどうかを確認してください今すぐ

public void detachFromActivity() { 
    listener = null; 
} 

私の実行中のスレッドは Objectとして渡されます。オブジェクトとして取得し、それが自分のAsyncTaskのインスタンスであるかどうかを確認し、それがあればそれをキャストします。

最後のステップでは、作成したばかりのNEW Activityにコールバックを「再接続」して、結果がどこに送信されるかをタスクが認識するようにします。

public void setListener(Callbacks listener) { 
     this.listener = listener; 
} 

今、私が新しく再作成された活性を有する古いスレッドへの参照を再接続することができます:私はこのように、私の仕事でそれを行うにはsetListener(this)メソッドを使用します。あなたはAsyncTaskを使用していない可能性がありますが、概念は同じであり、実際には任意のスレッド、または任意のオブジェクトで動作するはずです。

希望すると便利です。

0

m not sure on your question, but what you are doing is kinda wrong. Screen rotation are UI changes and they should not affect your other code. Check this answer for some guidance- http://stackoverflow.com/questions/5913130/dont-reload-application-when-orientation-changes PS: NoChinDeluxeの答えは、あなたが発見したとしても、他の要素と

0

基本的な問題をUIのデカップリングのために良いです、あなたのBluetooth接続を論理的にバインドされているような方法であなたのアプリケーションを実装しているということであるI活性(すなわち活動は、Bluetoothの活動を扱うスレッドを追跡するための責任があります)。 Bluetooth接続の参照が回転を存続していると

、あなたはActivityからそれを分離する必要があります。要件を正確に把握するには、さまざまな方法があります。

あなたは、例えば、サービスなどのBluetoothコードを実装することができます。 他の方法が同様にあります - 例えば、Activity restart on rotation Android

+0

を見てみましょうあなたに感謝。 (保有フラグメントを使用して)は、第2の応答におけるブログの記事は、まさに私が必要なものであるように思われます。 –

関連する問題