2015年5月24日日曜日

SurfaceのCanvasはダブルバッファなのかトリプルバッファなのか?

一時期Chromeでダブルバッファリング絡みのバグがあって非常に残念な時期があったが、どうも手元のA1000-Fはトリプルバッファなんじゃないかという感じがしています。

いろいろな所に書かれている話としては「SurfaceViewはダブルバッファリングなので~」という感じに書かれていますが、Android4.1の(現時点で古い感じの)端末でトリプルバッファということは、グラフィックスチップに依存する部分なのでしょうね。

2015年5月20日水曜日

Bitmap setWidth setHeight setConfig reconfigの罠

ビットマップの再割り当てを減らすために再生成せずに作り変えることが出来そうなメソッドがあったので早速使ってみました。

APILEVEL 19(KitKat)以降で利用できるようなのでそれも加味して実際に動かしてみると
java.lang.IllegalArgumentException: Bitmap not large enough to support new configuration
at android.graphics.Bitmap.nativeReconfigure(Native Method)
早速例外が。

最初はスレッドが干渉して例外になってしまうのかと考えsynchronizedで包んでやりました。
同期させてしまうのならついでにCanvasも一緒に生成させるようにしてあげて再実行。

最初は上手く行ったと思ったら結局同じ例外が出てしまい、ちょっとありがちな制約が気になってドキュメントを見てみると…

This method can be used to avoid allocating a new bitmap, instead reusing an existing bitmap's allocation for a new configuration of equal or lesser size. If the Bitmap's allocation isn't large enough to support the new configuration, an IllegalArgumentException will be thrown and the bitmap will not be modified.

ありましたね…「a new configuration of equal or lesser size」 限定という罠です。
再割り当てするには割り当てられるメモリのサイズが同じか小さい場合ということで、大きくなった場合は、IllegalArgumentExceptionが発生して変更されないという話です。

経験上この辺の話は良くあることなので当たり前ですけど、やっぱりなんともということでした。
メモリの再割り当てを考えればへたに食いつぶすよりは素直に新たに割り当てたほうがメモリ効率は良くなるんじゃないかなぁって思うので結局毎回createすることにしました。
ただ、Canvasは毎回生成するよりは使いまわしてしまったほうが良さそうなので同期はそのままにしておきましょうかね。

Nexus 9 Android 5.1.1

ふときづくと通知が来ていました。 5.0の動作環境がなくなるのは残念な気持ちもありますが、悩みながらもアップデートしてしまいました。

2015年4月26日日曜日

AndroidManifest.xmlの変更後のアップデートインストール

AndroidManifest.xmlの変更を行ってapkをGoogleDriveなどから更新する場合どうも値が上手く反映されていない場合がある。

例えば<activity>タグ内に android:excludeFromRecents="true" を追加した時のことだが、更新後にアプリの履歴から変更したアクティビティーを消した後に、ランチャーから起動しても履歴に表示されてしまった。

2015年4月10日金曜日

ファイルをオープンする時にダイアログが開いてくれない

Android Studio 1.2 Beta の使い勝手が地味に悪くなっている。
プロジェクトファイルをオープンする時に今までは「新たにウィンドウを開くか、それともこのウィンドウに開くか?」と尋ねられたのにそれがなくなっている。
バグなのか仕様なのかわからないが、ちょっと使い勝手が悪くなっている。

リオープンの時の設定は生きているようなので、そちらを使えということなのだろうか?

2015年4月5日日曜日

Android Studio 1.2 Beta

一昨日の寝る前にアップデート通知が来たのでアップデートをかけてみました。

2015年4月2日木曜日

PocketWifiの切り替えタイミングが知りたい。

Pocket WIFIのON OFFだけでは
WIFI_STATE_CHANGED_ACTION
NETWORK_STATE_CHANGED_ACTION
だけでは何も送られてこない。WIFIをONの状態からPocketWifiをONにした場合は、WIFIも同時にON/OFFされるので上記2つのタイミングだけで十分なように思えたが、他の何が必要なのか?