2017-07-25 4 views
0

あなたは(... getId()getAlpha()getHeight()のような)標準ゲッターを使用してheightalphaidmatrixdrawingTimeまたはelevationのようないくつかのビューのプロパティを取得することができます。なぜAndroidビュークラスには、いくつかのプロパティのための 'outValuesスタイル'ゲッターがありますか?

しかし、その後、あなたは(PointまたはRect戻り値の型とそれらのほとんどを)ビューのプロパティの一部を持っているlocationInWindowglobalVisibleRectlocationInScreendrawingRectdrawingCache空のコンストラクタを事前にオブジェクトを返す作成することを強制されているゲッター下に隠さのようなこれらのオブジェクトをゲッター・パラメーターとして渡して、データがそれらに保存されるようにします。 globalVisibleRectのgetterの

例:あなたはこのような何かを行うには

public final boolean getGlobalVisibleRect(Rect r) 

力(Kotlin):

val rect = Rect() 
getGlobalVisibleRect(rect) 
doSomeStuffWithRect(rect) 

それは本当に一貫性のない、またそれが表現タブでリアルタイムにデバッグですAndroidスタジオでは本当に面倒です。

なぜこのように行われますか?ビューが表示されていない場合、falseのブール値を返すメソッドの一部が表示されるので、返されたデータが無効であることがわかりますが、メソッドが既に使用できない情報を生成したことを既に知っている場合はnull値を返して解決してはなりません。一方、getLocationOnScreenはvoidを返し、追加のパラメータを持たないので、なぜあなたはそのように複雑になるのでしょうか、私は本当に理解できません。

答えて

1

なぜこのように行われますか?

オブジェクトプールなどを介してオブジェクトを再利用することを推奨します。膨大な数のRectインスタンスを作成してGCをクリーンアップすることは、特に2006年のデバイスでは非効率的です。膨大な数のRectインスタンスを作成して収集すると、ヒープも断片化します。これはAndroid 8.0以前のデバイスではまだ問題ですが、Android 5.0の変更は多少役立ちました。

+0

これは非常に興味深い点ですが、ビュープールのプロパティをプールするためにオブジェクトプールを使用する開発者は見たことがありません。ヒープの断片化を少し読んでくれます。ありがとう! –

+1

@PrzemyslawJablonski:アプリ開発者は、getGlobalVisibleRect()のようなメソッドの主な消費者ではないことに注意してください。フレームワークは、 'View'、' ViewGroup'、およびkinの形であります。 – CommonsWare

関連する問題