2012-02-26 3 views
0

Android用に開発が始まったところです。私はSurfaceViewを使ってシンプルな図形を描画するアプリケーションを作ろうとしましたが、メニューイベント(サーフェスは常に無効です)に基づいて動作させることができませんでしたのでスレッドを実装することにしました。問題は、浮遊スレッドの実行を止める方法を見つけることができないということです。私は、デバッグモードでアプリケーションを起動し、スレッドを開始するメニュー項目を選択しました。その後、私はエミュレータのインターフェイス上の戻るボタンを押してアプリケーションから抜け出しました。しかし、スレッド上の私のブレークポイントはヒットを続けた。そこで、エミュレータのアプリケーションリストでアプリケーションをクリックしてアプリケーションに戻り、スレッドを停止するコマンドを選択しました。しかし、それはスレッドが実行されていることを検出しませんでした - それは別のアプリケーションインスタンスでした。Androidアプリケーションの迷子スレッド

私の主な質問の下には、「どうやってアンドロイドアプリケーションのスレッドのシャットダウンを最も確実に処理する必要がありますか?」という微妙な質問があります。

  1. 元のインスタンスにアクセスできますか?
  2. 私が戻ったとき元のインスタンスを取得する必要がありますか?
  3. デバッガを起動せずにアプリケーションメニューから選択すると、元のインスタンスの可視性に影響しますか?
  4. アクティビティ/アプリケーションを終了することはできますか?
  5. デバッガ(Eclipse)はデバイス全体をリセットせずに何とか停止することができますか?
  6. メニューイベント中にコンテキストをロックしようとするのではなく、SurfaceViewにスレッドが必要ですか?

私はClose application and launch home screen on Androidを見ましたが、アプリケーションを終了するべきではないことを示唆しているため、何をすべきかわかりません。

答えて

0

あなたは奇妙な方法でスレッドを使用しようとしているようですね。 Androidでは、UIを使用している場合は、バニラのJavaスレッドを使用しないでください。代わりに、AsyncTaskを使用する必要があります。 UI以外のスレッドからUIにアクセスしようとすると、Androidランタイムがあなたに文句を言います。代わりに、処理スレッドとアクティビティ(実際にUIを管理する)の間でメッセージを前後に渡す必要があります。これはメッセンジャーとハンドラーの使用で行われますが、プロセスは複雑になります。代わりに、AsyncTaskモデルを使用することで、UIをシームレスに更新するバックグラウンドでアクションを実行できるようになります。これは、ネットワークアプリケーションのようなもので非常に一般的に使用されます。そこでは、タスクに情報をダウンロードし、それに応じてUIを更新します。だから、いくつかのAsyncTaskチュートリアルを読んでみると、それはあなたのためにできるすべてのクールなものを見つけることができます(Androidのスレッディング頭痛に対処するのは、このモデルを使用することによってほとんど回避されます。実際には、スレッドをオフにする)。

+0

Android SDKで提供されるサンプルは悪いですか?私は、Lunar Landerのサンプルを見ています。SurfaceViewを備えた単純なスレッドを使用しています。 – BlueMonkMN

+0

http://developer.android.com/resources/articles/painless-threading.htmlはおそらくあなたがチェックアウトしたいものです。 –

+0

intro段落によると、この記事はUIを操作するワーカースレッドの長時間実行ですが、SurfaceViewにグラフィックスを描画する方法を理解しようとしていますが、これはスレッドに依存するようですが、ワーカースレッド私はUIのやりとりを考えていません。私は髪を分割していますか? – BlueMonkMN