2017-09-15 7 views
2

こんにちは私はキャンバスでより速く描画するためにSurfaceViewとスレッドを使用しようとしています。これまでは、Viewクラスを拡張してonDrawメソッドを描画するだけで、キャンバス上に描画することができました。また、ユーザーがキーボードから入力した場合(アクティビティからカスタムビューにキーコードを渡すことによって)、キャンバスを再描画することもできます。別のスレッドでキャンバスに描画Android

問題は、私はマルチスレッドに固執しています。私はSurfaceViewでViewクラスを置き換えてRunnableを実装しました(thisチュートリアルに従います)。しかし、キー入力が発生した場合、私はキーコードを渡すことができません。また、カスタムビューでinvalidate()メソッドを呼び出すと、何も起こりません。図面の後にスレッドの実行を停止するために

retry = false; 

:チュートリアル・コードと鉱山からの唯一の違いは、私はwhileループの終わりに次の行を追加したことです。そして、この行のすべてのクリックの後に追加されたので、すべてをもう一度書き直すことができます。

view.resume(); 

問題:

  • iは)(thread.join呼び出すことにより、スレッドを停止する場合は(理由はわからない) -viewがキーイベントに無効になることはありませんし、新しい画像を描画しません。メソッドを使用すると、CustomView内の他のオブジェクトはヒープメモリに残りますか、または破棄されますか?

  • このアプリを起動時に自動的に実行し、その後はクリック時にのみ実行する方法を教えてください。

  • view.resume()の前に明示的に呼び出すと、invalidateメソッドがキャンバスをクリアしないのはなぜですか?

p.s.私はコードサンプルを投稿する必要があります、私に知らせてくださいと私はテストアプリケーションとgitのrepoを添付します。

おかげアンドロイドで

答えて

0

あなたは、あなたがのsendMessageを使用する他のスレッド上で、のhandleMessageを受信して​​実装したいスレッド内に作成し、あなたがメッセージを送信するために実装することができますHandlerクラスを持っています。

ブール値フラグとマルチスレッドの場合は、VMの最適化にキーワードvolatileを使用する必要があります。

volatile boolean retry = false; 
+0

私はvolatileキーワードを追加しましたが、何も変更されていません。おかげで – hogar

+0

あなたの完全なコードを投稿します –

関連する問題