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







アプリ開発が上達するお勧め

アプリ開発を始めたけどわからないところがあり、誰かに聞きたいけど周りにはそんな人はいない…あるいは、会社で働いていて日中そんなに時間をとれないなど、オンラインのプログラミングスクールがいいでしょう。

TECH ACADEMY
オンライン説明会


侍エンジニア塾
侍エンジニア塾 無料体験レッスン


とても簡単なことなのに本やネットの画像だけでは分かりにくいことはあります。実際に質問してピンポイントで教えてもらうと、なんだそんなこと、と言うのがけっこうあります。


シェアする

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

フォローする