[Android] warning に対応してみる

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

Android Studio 3.0.1
Android 8.1.0

 



Warnings

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

 

@NonNull

 
Not annotated parameter overrides @NonNull parameter
 

 
これは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
 


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

 

package-private

 
Access can be package-private


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

 

NullPointerException

 
XXX may produce ‘java.lang.NullPointerException’
 

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

 

 

buttonBarButtonStyle

 

 
これはレイアウトファイルで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的なボタンになりました。
 

どうかなという気がしますけど。

 

This field leaks a context object

 

 

 
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の使い方

 

override performClick

 

or

 
“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 で作成します。(そのままコピペしないように)