[Android] warning に対応してみる

警告ですが、エラーにならないので、そのままにしていることがあります。真面目に向き合ってみようという趣旨です。




Warnings

 

最近のemulator、Android Studio 3.0 ではwarningがはっきり表示されるようになったので(仕方なく) 積極的にバグの種をつぶせるようになりましたね。
 

 

@NonNull

 Not annotated parameter overrides @NonNull parameter 1x1.trans - [Android] warning に対応してみる

 

これはNullness アノテーション| Android Studioにあるように
このメソッドの引数はNullを許容しないことを表明するアノテーションです。
 
Nullにならないのであればこのアノテーションを付加します。
あるいは、ここにNullが入ってはいけないというこのメソッドを使う人(自分も含め)への警告ともなり得ます。
 
warningが出ている引数の前に@NonNullを付加して
NonNullが使うためのライブラリもimportしておきます。

この onRequestPermissionsResult ではシステムから返されるものなのでこちら側では操作できないと思っていましたが
Android Quickstartにはこういうコメントをみつけました。
 
permissions
grantResults
Never null
とありますから@NonNullをつけても大丈夫、というかwarning入れなくてもいいような気もします。
 

 

Unchecked call

 unchecked call to XXX as a member of raw type ZZZ 

1x1.trans - [Android] warning に対応してみる


このケースではArrayAdapterの設定でメソッドを使おうとした時のwarningです。うっかりジェネリックを設定しないでビルドしてもエラーではなかったのが、基本的にジェネリックが必要だという警告です。
java.lang.Object
↳ android.widget.BaseAdapter
android.widget.ArrayAdapter<T>
 

 

package-private

 Access can be package-private

1x1.trans - [Android] warning に対応してみる


 
ありがちなのがクラスをpublicで作成していたけれど、最終的にスコープがパッケージ内部のみで済んだ場合などで、package-privateにし忘れてます的な警告でしょう。

 

NullPointerException

 XXX may produce ‘java.lang.NullPointerException’ 1x1.trans - [Android] warning に対応してみる

 

Nullになる可能性があるという警告です。nullチェックを入れろという警告ですね
 

 

 

buttonBarButtonStyle

 1x1.trans - [Android] warning に対応してみる

 

これはレイアウトファイルでButtonにwarningが表示されました。これは最近見なくなりましたが 

Buttons in button bars should be borderless;
use style=”android:attr/buttonBarButtonStyle”
(and ?android:attr/buttonBarStyle on the parent)

ということで、Buttons – Components – Material Designにリンクが貼られていますが、Material Designを周到せよということらしいです。
 
レイアウトファイルに2箇所の追加をします。

 
ボーダーレスのフラットな、Material Design的なボタンになりました。
 

1x1.trans - [Android] warning に対応してみる
1x1.trans - [Android] warning に対応してみる
 

This field leaks a context object

 1x1.trans - [Android] warning に対応してみる

 1x1.trans - [Android] warning に対応してみる 

A static field leak contexts.
Non-static inner class have an implicit reference to their outer class.
If that outer class is for example a Fragment or Activity, then this reference means that long-running handler/loader/task will hold a reference to the activity which prevent it from getting garbage collected.

Similarly, direct field references to activities and fragments from these longer running instances can cause leaks.

ViewModel class should never point to Views or non-application Contexts.
 
つまりstaticでないインナークラスは参照を持っているので、ガーベージコレクションされずリークしますよということです。
 
解決策は、ケースバイケースになります。この場合は非同期AsyncTaskのクラスからメインのテキストを表示させたかったのです。カスタムのlistenerを実装して解決しました。
AsyncTaskが非推奨になったのであまりみることもないかもしれませんが
非同期AsyncTaskの使い方

 

override performClick

 1x1.trans - [Android] warning に対応してみる

or
1x1.trans - [Android] warning に対応してみる
 
“Custom View has onTouchListner called on it but doesn’t override performClick”
 
ViewにonClickを実装すると警告されるのですが、
performClickをoverrideしないといけないという警告です。これは簡単にはできないのでそれぞれのView, 例えばここではImageViewの場合を想定すると、ImageViewを継承したカスタムImageViewクラスを作ってoverrideします。
 

 
また、カスタムImageViewなので
com.example.testimageviewdrag.CustomImageView
のようにpackage name + class name で作成します。(そのままコピペしないように)
 

 

prindtStackTrace()

 

堅牢なログに置き換えるべき

1x1.trans - [Android] warning に対応してみる


try catch の例外検査としてprintStackTrace()を設定しときのWarningです

これじゃ後々何のことか分からなくなるよという警告だと思います

例えばAssetから呼び込む例で、画像ファイルがない場合

ファイルがないというWariningになりますが、アプリとしては画像なしで起動します

非検査例外の
RuntimeException()に変更すると

アプリは起動せずエラーログが出力されます

ファイル名を間違えてCallした場合はエラーとして認識できる方が
robust なんでしょうか
ちなみに、このRuntimeExceptionでも、ファイルは存在しても中身がテキストだったりすると、Warningでアプリは起動してしまいます

シェアする

  • このエントリーをはてなブックマークに追加

フォローする