私は初めての Android アプリ (そして、過去 15 年間で初めての Java アプリ) を作成しています。エンコードされた文字列を受け取り、コードを描画操作に変換します。コードのいくつかはグラデーションの定義を表しており、これが私の質問に関するものです。
私が正しく理解していれば、関数中に何らかの種類の新しいオブジェクトを作成しようとするとonDraw
(私の拡張View
クラスのオーバーライド)、オブジェクトをキャッシュし、onDraw 中に新しいオブジェクトを決して割り当てないことを示唆する警告が lint によって出力されます。そこで、コード文字列で定義されたすべてのグラデーションのキャッシュを作成することにしました。そうすれば、同じコードを同じサイズで再描画する場合、そのコードで定義されたグラデーションを再割り当てする必要はありません。
のキー構造を定義しようとしたときに問題が発生しHashMap
ました。これがキャッシュに最適な構造であると考えました。グラデーションをキーとして定義するコードのスニペット (文字列) を単純に使用できればいいのですが、画像のサイズを変更してもコードは同じままなので、うまく機能しないと思います。ただし、グラデーションは画像に合わせてサイズを変更する必要があります。したがって、異なるサイズの同じグラデーションに対して同じキーを使用できないか、画像のサイズが変更されるたびにキャッシュをクリアする必要があります。
これにより、の複合キーを作成しようとしましたHashMap
。Java について少し調べてみると、私が知る限り、C# のような値型としてタプルをサポートしていないことがわかりました。したがって、複合キーを作成する推奨される方法は、新しいクラスを作成することでした。そこで、複合キーを表す新しいクラスの作成を開始します。それから私は振り出しに戻ったことに気づきます。キーを表す参照型オブジェクトを作成する必要がある場合、lint は onDraw 中にメモリの割り当てに関する警告を表示しますよね? (または、そうでない場合でも、onDraw 中にメモリを割り当てますが、これは回避しようとしています。)
ここで専門家のアドバイスが必要です。ルールというよりもガイドラインに近い最適化のために山を動かしているのでしょうか?必要に応じてグラデーションを作成するだけでよいのでしょうか? コードをHashMap
キーとして使用し、サイズが変更されるたびにキャッシュをクリアする必要がありますか? 文字列操作 (部分文字列など) には、回避しようとしているメモリ割り当ても伴いますか? Java はカスタム値の型をサポートしていますか? HashMap
ヒープメモリを割り当てずに一連の値型をキーとして受け入れることができる独自の代替を作成する必要がありますか?