2017年10月31日火曜日

メモリリーク その3 AdMob広告の表示で

こんにちは。



AdMobの広告を表示させるために、AdMobの以下のガイドに沿ってソースを修正しました。

https://developers.google.com/admob/android/quick-start?hl=ja


ガイドより↓

しかし、これだとメモリリークを起こします。


以前にも書きましたが、ActivityのContextを渡し、そのContextを保持されてしまうとActivityを解放できません。

ApplicationContextを渡せば、Activityはメモリリークを起こしません。

また、MobileAds.initializeは、一回だけで良いと上記のガイドに記述があるので、ApplicationのonCreateで呼び出すようにしました。

なぜなら、MainActivityのonCreateは、一回だけ呼び出されるとは限りません。起動時以外にも、画面を回転させると呼び出されます。

以下のように修正しました。



以上です。


2017年10月16日月曜日

画面タップが効かなくなったスマホ

こんばんは。

以前使っていたスマホの画面をタップしても何も反応しなくなってしまい、もうだめかと放置していました。

しかし、公開しているアプリは、古いAndroidも対応しているため、どうしても動作確認がしたくなり、どうにか動かせないか調べました。

まず分かったのが、パソコンとUSB接続して、パソコン上であるアプリを動かすと、スマホの画面がパソコンの画面に表示され、操作できるというものがあるということです。
ただし、スマホをデバッグモードにしてあることが前提です。

Android Control

しかし、スマホの画面は、パソコンに表示されますが、クリックしても反応しません。

上記に加え、以下のHPで、Version1.2betaを落として、やっと反応しました。

http://droid-at-screen.org/download.html


ここで、調子に乗って、やりたかった初期化をしました。

すると、初期化が終わった後起動すると、Android Controlは、使えなくなりました。

デバッグモードも解除されますから、当たり前でした。


そこで、別の方法を探してみると、衝撃的なことを知りました!

スマホにマウスを繋げば、操作できるとのことです!

知らなかった・・・。

早速、ヨドバシカメラに行き、以下の変換アダプタを542円で買いました。




帰宅して、スマホにマウスを繋いでみると・・・完璧に動く!

最初から、こうすればよかったです。

2017年10月12日木曜日

メモリリーク その2 AlertDialog

こんばんは。

今回もメモリリークについてです。

AlertDialogで、メモリリークが発生していました。

そもそも、使い方を誤っていました。

以下のようにすれば、簡単にメッセージダイアログが表示できますが、これではいけません。



画面を回転した場合などに、メモリリークが発生します。

Androidデベロッパーのページにも書かれていました。

https://developer.android.com/guide/topics/ui/dialogs.html?hl=ja

DialogFragmentを使ってダイアログを管理すると、ライフサイクルイベントが正しく処理されると書かれています。

個人のブログで、AlertDialogの使い方を見てコーディングしたのですが、ある程度コーディングした後に、上記のページを見つけました。

そして、実際にメモリリークするか調査してみると、しっかりとメモリリークしていました。

全てのAlertDialogを修正とテストするのは大変でした。

それから、ネットで検索する場合は、Androidデベロッパーのページや、リファレンスを最初に読むようにしています。

DialogFragmentを使ったAlertDialogのコーディング方法は、上記のページを参考にしてください。


2017年10月11日水曜日

メモリリーク その1

こんばんは。

忙しくて、なかなか更新できませんでした。

前回メモリリークを調査した結果、検出した内容です。

今回は、単純なコーディングミスです。

Staticな変数に、Contextを渡したクラスのインスタンスを保持しているのですが、ContextにActivityをキャストしたContextを渡していました。


ソースで説明します。


ToastクラスのインスタンスをContextを渡して作成し、Staticな変数で保持しています。
上記のshowToastを以下のように呼び出していたのです。


上記の例は、Activityで呼び出していたので、thisは、Activityです。

Contextは、ApplicationかActivityをと書かれていますので、以下のように変更したら、メモリリークはなくなりました。


Staticな変数は、要注意です。