【Android日誌】2016_02_08週_Collectionとは
Javaでまだまだわかってない部分もあるので、改めて調べる機会などもありました。 今週のアウトプット少ない。
Collectionとは
Collection * List * ArrayList * LinkedList * Vector * * Set * SortedSet * HashSet * TreeSet * * Map * Hashtable * HashMap * TreeMap * SortedMap
LinkedList
LinkedListとArrayListの違い d.hatena.ne.jp
LinkedListの特徴 www.javadrive.jp 特にできることは同じだが、
- 読み出し性能重視はArrayList
- 挿入や削除の性能重視はLinkedList
Set
重複を許さないコレクション。 o1.equals(o2)が成り立つものはaddしてもaddされないし例外も吐かれない。
Set set = new TreeSet<>(); set.add(3); set.add(6); set.add(0); set.add(1); Iterator iterator = set.iterator(); while(iterator.hasNext()){ System.out.println(iterator.next()); } //0,1,3,6
独自にcomparator()をセットすれば自分で並び順を変えることができる。デフォルトは要素の自然順序付け
によって行われる。
【Android日誌】2016_02_01週_Invalid Gradle JDK configuration found他
コーディング以外にも調べる機会があったのでアウトプットしていきます。
ディープリンクとは
Topページ以外のページへのリンクのこと。元々はWebサイトについての言葉だが、アプリに対しても使う。 アプリをインストールしているユーザーだった場合は、アプリの該当画面(詳細画面など)に遷移する方法。 インテントフィルターで受け取る方法などの公式。
https://developers.google.com/app-indexing/android/app?hl=jadevelopers.google.com
AppIndex
検索結果画面からアプリに飛ばされるアレ。Rettyとかよく飛ばされるイメージだけど、結構使いづらくてあまり印象よくない。
アンバンドリング
複数機能を持ったアプリを1アプリ1機能に分割すること。最近のトレンドらしい。 facebookのメッセンジャーなどが代表的な例みたい。元々はアプリ都合の部分もあったみたいだが、アプリは何かの目的別のもの、と見ると機能(目的)ごとに分割するのは合理的なのかもしれない。 www.gizmodo.jp newspicks.com
Android Studioの設定ファイルimport
- File>import Settings で設定ファイルを読み込めるし、Export Settingsで吐き出すこともできる
Invalid Gradle JDK configuration found?
- チームで使われていた設定ファイルをimportしてからか?のタイミングでgradleが走らなくなった。
JDK Locationのjdkのverがローカルにあるのがjdk1.8.0_51
だったが、プロジェクトに設定してあるのはjdk1.8.0_31
だった。1.8は一緒だったため、なかなかきづけなかった。
At first update your java. Then check your JDK version. for example: jdk1.8.0_51. Then go to android studio and then go to File ---->Project Structure----> JDK Location (If you install update version of JDK, android studio JDK Location hold older versions jdk url.For example: C:\Program Files\Java\jdk1.8.0_45).
Android Studioのアップデート
Updateする時、こんな警告が出て、Updateできなかった問題が発生。
qiita.com この記事を参考にしていて以下のファイルを触ったことが問題みたい。
/Applications/Android Studio.app/Contents/plugins/android/lib/templates/gradle-projects/NewAndroidProject/root/project_ignore
消すだけじゃダメ、空ファイルでもダメみたい?
結局初期のファイルのままを置いてやるとやっと大丈夫に。
solutionの欄がNONE
がなくなれば、proceedのボタンが出現し、無事updateが進む。
vim系のtips
DDMSとは
- Androidのデバッガツール
- スレッドとかヒープとかは見たことなかったので、確認してみたい techbooster.jpn.org
端末を一意に取得するID
広告配信系のサービスを導入する時に話題に。 リタゲのようなことをして他アプリに広告を配信するには端末を一意に取得していないと出せないよね、と。 どういう値を取得しているんだろう?というお話。
http://iridge.jp/blog/201404/4836/iridge.jp
GSM端末とCDMA端末の違い
IMEI とは
なんとなく、ネットワーク制限などもできるとするとこれを取得するのはかなり強いな、というイメージ。 悪用とかもできちゃう?のかな。個人情報とされるのか、みたいのが問題になる可能性があるみたい。 kaoru0822.seesaa.net
advertisingId とは
名前からもわかるように広告用の匿名性を保った上で端末を一意に判別するIDみたい。 tech.admax.ninja
【Android日誌】2016_01_25週:どこまでnullチェックすればいいのか他
shouldOverrideUrlLoading()はpostだと呼ばれないよ
webViewのページ読み込み時にURLを割り込みできる関数だが、
/** * Give the host application a chance to take over the control when a new * url is about to be loaded in the current WebView. If WebViewClient is not * provided, by default WebView will ask Activity Manager to choose the * proper handler for the url. If WebViewClient is provided, return true * means the host application handles the url, while return false means the * current WebView handles the url. * This method is not called for requests using the POST "method". * * @param view The WebView that is initiating the callback. * @param url The url to be loaded. * @return True if the host application wants to leave the current WebView * and handle the url itself, otherwise return false. */
と書いてある通り、postだとこの関数は呼ばれない。
WebView form - POST をインターセプト-Oboe吹きプログラマの黙示録
じゃあどうするのかと、jsで埋め込んでなんとかする方法がちらほら…。 ここまで対応すべきかどうかどうかは不明。
どこまでnullチェックすればいいのか?
自分の中で、いまいちこのへんの感覚がわからなかったので、調査。
呼んでくるメソッドがnullを返さないことがわかっていれば、もちろんnullチェックをしなくていいけど、
onDestory()
が呼ばれた後に通信のコールバックが返ってくる時とかは、nullになることがあるし…。
アプリを触りながらそういうところをチェックするのではなく、ソースの中でロジックで考えるように心がけようと思った。
webView読み込み途中でのクラッシュ
05:27:57.165 799-14680/? W/ActivityManager﹕ Process jp.co.hoge.hogeapp has crashed too many times: killing! 01-29 05:27:57.165 799-14680/? W/ActivityManager﹕ Force finishing activity hogehoge
webViewにてページの読込中の際に読み込み途中のページのボタンをタップすると落ちることはある。 RuntimeErrorではないからエラーログなどは取れない代わりにこのようなログアリ。
いくつもスレッドが走ることで落ちるものなのかな、と思いつつ根本的な解決が不明。
- 読み込みが終わるまでwebViewをINVISIBLEにしておく
これで対応するしかないのかもしれない…。
Android Javaでフィールドにプレフィックスをつけるのはやめようの理由
今週話題になった記事について結局なんでこんなこと言ってるの?がわからなかった。
- 昔のテキストエディタは精度が悪かったため、今みたいにメンバ変数に色とかつけてくれなかった
- 昔のCの名残りなど
- 今はIDEなどが発達してきて色などをつけてくれるから、プレフィックスが必要なくなったと考える
みたい!
【Android日誌】2016_01_18週:WebViewのキャッシュモード他
webViewのヒストリーバック時にERR_CACHE_MISS
ブラウザでも同じ挙動になるが、入力→確認→完了画面といった遷移でポストで情報を受け渡ししているとき、historyバックするとERR_CACHE_MISSというエラーになってonReceivedError
に入ってしまう。今回担当の要件は、onReceivedError
ではネットワークエラーに入るものとして使用していたので、ちょっとおかしなことになる(ネットワークはあるのに、通信エラーとしてダイアログが出る、など)
sdk19以降の挙動とかどこで見ればいいんだろう
http://developer.android.com/intl/ja/reference/android/webkit/WebSettings.htmldeveloper.android.com
webViewの設定setCacheMode
webViewのWebSettingにはキャッシュモードが選択できる。 キャッシュについては奥深そう・・・ http://dayafterneet.blogspot.jp/2011/08/androidwebview_23.htmldayafterneet.blogspot.jp
SDKバージョンとOSバージョン
リファレンスではSDKバージョンで説明してあることが多いのでここの対応関係は頭に入れておきたい。 結構OSバージョンで考えていることが多い。
WebView内のiframeについて
4.2以下の端末ではwebView内のiframeリンクタップ時にshouldOverrideUrlLoadingが呼ばれない。
何回もこの記事見てたけど、このことだったのか、と再実感。 ぶち当たる前に頭に入れておけたらいいのになぁ… qiita.com
Logを適切に使う
Fragmentの"java.lang.IllegalStateException: Can not perform this action after onSaveInstanceState"
絶妙なタイミングでactivityが破棄されるとこの例外でアプリが落ちる可能性あり。
DialogFragmentのshowの中をどうカスタマイズするか http://kokufu.blogspot.jp/2014/08/onactivityresult-dialogfragmentshow.htmlkokufu.blogspot.jp
プロジェクトによってはtry,catchで囲んで握りつぶしているところもあったので、どういう対処が賢いのかちょっとわからない。
onReceivedErrorが複数回呼ばれる
弱電界から読み込み途中の際に圏外になった場合に発生(4.2以下でっぽい) そのうち、historyに何個も積まれるので、そのあとbackキー押しても同じページをloadするばかりで困る
アプリのcacheには何が入ってるのか
http://blog.livedoor.jp/an_square/archives/51803192.htmlblog.livedoor.jp
ブラウザのキャッシュもアプリのキャッシュに含まれるみたい。 他にはtempファイルも含まれるみたい。
http://computerexpert.web.fc2.com/android/recipe10-4.htmlcomputerexpert.web.fc2.com
API通信で一度読み込んだページはCacheしておいて、二度目の来訪にはキャッシュを使うなど、で自分でもCacheに保存できるみたい。 ブラウザは元々キャッシュ取ってるからwebViewでも知らぬ間にキャッシュを取っているんだろうな。
webViewのpostで遷移してきたページを戻す
LOAD_NO_CACHE
にwebVIewの設定をしたけど、スタックはしないが、結局アプリ内のキャッシュを見に行ってしまっていた キャッシュを消せばすべてインターネットから取得してくるようになって、最初から画面が読み込まれるようになった
ifの条件式の書き方
if文の条件式の書き方でレビューをもらった。
@DebugLog @Override public boolean shouldOverrideUrlLoading(WebView view, String url) { if (mHogePresenter != null && mHogePresenter.shouldOverrideUrlLoading(url)) { return true; } else { return super.shouldOverrideUrlLoading(view, url); } }
考えかた
- 独自でハンドルする部分は、独自でハンドルする条件で条件を書く
- それ以外はsuperに任せる
@DebugLog @Override public boolean shouldOverrideUrlLoading(WebView view, String url) { if (mDandoriWebViewPresenter == null) { return false; } return mDandoriWebViewPresenter.shouldOverrideUrlLoading(url) || super.shouldOverrideUrlLoading(view, url); }
イレギュラーなケースを先に持ってきて、後で正常な動きをする思想のときはこの書き方。 nullの時は例外としてfalseを返す、それ以外はまず独自でハンドルする、その方法じゃないと返ってきた時はsuperにお願いする。
@DebugLog @Override public boolean shouldOverrideUrlLoading(WebView view, String url) { if (mDandoriWebViewPresenter == null) { return super.shouldOverrideUrlLoading(view, url); } else { return mDandoriWebViewPresenter.shouldOverrideUrlLoading(url); } }
これはあんまりよくない例で、nullチェックとsuperを呼ぶことに繋がりがない。
google +1の挙動
webViewのテストをしている時に+1の正しい挙動がわからなかったので、メモ。 webViewの中からgoogle+1を押下すると正しく動かない(6.0ですらブラウザに飛ばされて閉じられるだけで動かない) www.actzero.jp
4.2.2でWebViewのキャッシュクリアが効かない問題
// 4.4以降のヒストリーバック時のERR_CACHE_MISS・4.2以前のwebback後の遷移できない不具合をふせぐための設定 mHogeWebView.getSettings().setCacheMode(WebSettings.LOAD_NO_CACHE);
でこのように設定していたが、4.2(.2)に関してはキャッシュが残ってしまうみたい。
@DebugLog @Override public boolean shouldOverrideUrlLoading(WebView view, String url) { /* * OSVer:4.2.2のみ * setCacheMode(WebSettings.LOAD_NO_CACHE) * を設定しても、キャッシュを保存してしまうためページを読み込む前に明示的にキャッシュをクリアしています。 */ view.clearCache(false); if (mHogePresenter != null && mHogePresenter.shouldOverrideUrlLoading(url)) { return true; } else { return super.shouldOverrideUrlLoading(view, url); } }
onPageFinished()
やonPageStarted()
で呼ぶとキャッシュから読み込んでしまう間にキャッシュを切るので画像などが読み込めずに終わるため、ページを読み込む前のshouldOverrideUrlLoading()
に追加することにした。
Androidその他
Togglを使ってみる
時間管理の話で、Togglというサービスを見つけたので、現在使ってみている。 一旦は一日で実装の時間がどれくらいあって、それ以外の時間がどれくらいあるのか?を可視化してみるため。
英語読むの辛い時の情報収集
Forkwell Press – 「煽って盛り上げるのは“自分がその技術を使いたいから”なんです」-Increments...
ですので、先ほど挙げた「Hacker News」や、JS版のHacker Newsのような「Echo JS」といったサイトで、まずは見出しを中心に目を通すようにしています。「最近、この単語が見出しによく出ているのに、自分は手を付けていないな」と感じた時に、きちんと調べ出すといった感じですね。
英語読めないし読んでも頭に入らないのに読んだほうがいいって言われても・・・と思っていたので、こういうのは勇気づけられる。
2016_01_12週_子要素のstateに合わせてstyleを変える他
子要素のstateに合わせてstyleを変える
子要素にcheckboxが入っているlinearLayoutとかで、子要素のchecked
に合わせて親のlinearlayoutもstyleを変えたい時
LinearLayout CheckBox
こういう状態で、CheckBoxのchecked
の状態によってLinearLayoutのスタイルを変える
android:addStatesFromChildren="true"
これをLinearLayout
につけて、いつものselectorを設定すれば、子要素のcheckboxのchecked
を取得してきて見た目を変えることができる。便利〜。コードがすっきりする〜
WebViewClient#shouldOverrideUrlLoadingとは何者
onPageStarted
の前に呼ばれる
url見てwebView内の挙動にしたくない時などに使える
※今回は外部サイトなので、外部ブラウザに飛ばす時に使用
resourceでstring-arrayを持つ
<string-array name="url_patterns"> <item>hoge.jp</item> <item>hoge.hoge.jp</item> <item>hoge.fuga.net</item> </string-array>
呼び方は
context.getResources().getStringArray(R.array.url_patterns);
簡単。
OkHttp3リリースについて
TextViewのデフォルトカラー
コードから文字色を変える時
hogeView.setTextColor(R.color.res);
という風にはかけない
webViewのreload
postで送られた画面などはreload()
では機能しない。
loadUrl()
を用いてreloadを実装する
引数の中身を変える
@Override public void showHoge(String url) { if (TextUtils.isEmpty(url)) { url = getResources().getString(R.string.webview_http); } ・ ・ ・ }
基本渡ってきた引数を使うけど、空だったらとかイレギュラーな値だったら特定のものを入れたい、とか 新しく変数つくらなきゃいけないと思ってたけどこれでいいんだ、知らなかった…
暗黙的インテントでActivityNotFoundException
外部アプリにインテント投げるときに、該当のアプリがない場合はActivityNotFoundException
が起きる
return を||で返す選択肢
return hogePresnter.shouldOverrideUrlLoading(url)|| super.shouldOverrideUrlLoading(view, url);
2016_01_05週_Parcelable内のwriteとreadの順番他
毎日メモはしてるので土日にまとめて公開することにします。 一週間経つだけでも全然忘れてしまうな…。ブログに公開することで、自分が目に通す回数を増やしたりできればいいな。 良い復習にはなりそう。
JVMとJREの違い
聞かれてわからなかった・・・
http://www.mltlab.com/wp/archives/406www.mltlab.com
Dalvikとは
http://www.wdic.org/w/TECH/Dalvikwww.wdic.org
WebViewのonReceivedErrorが呼ばれない
API 23ではonReceivedError
の仕様が変わったそう。
でも新しいonReceivedError
だとネットワークエラー時に呼ばれない。
complieSdkVersionを23にすると非推奨の打ち消し線が入るのでなんでこうなっているのかわからなかった
何が原因なんだろうか、なにかのverな気がする…
結局compileSdkVersionを22に下げても、6.0端末で試してもこの新しいonReceivedError
は呼ばれなかった
LinearLayoutでparentBottomを表現する
http://ichitcltk.hustle.ne.jp/gudon2/index.php?pageType=file&id=Android055_layout4ichitcltk.hustle.ne.jp
特定のコミットからブランチを切る
デフォルトのDialogを使うのがよくない理由
getFragmentManagerとgetSupportFragmentManager
getSupportFragmentManager().executePendingTransactions(); if (getSupportFragmentManager().findFragmentByTag(DatePickerDialogFragment.TAG) != null) { return; } DatePickerDialogFragment.newInstance().show(getSupportFragmentManager(), DatePickerDialogFragment.TAG);
ダイアログの二重起動での制御について、
findFragmentByTag()
がいつもnullで帰ってきてしまう問題。
今回はsupportのDialogFragmentを使ってるので、FragmentManagerを呼ぶ時はサポートの方で呼ばなくては返ってくるFragmentManagerが異なる。
getFragmentManager()
もgetSupportFragmentManager()
も呼べるため、なぜ合っていないのか気づきにくかった.
supportlibraryを使ってるのかそうでないのかみたいなところが意外と時間を食われる元な経験が最近多い…
久しぶりにgitでミスった
最近revertとかresetなど多用していてdiffがすごいことになった死にたい
masterとheadのdiffを一覧で見る
git diff master..head --stat
一度pushした後にローカルでresetしたりするとnon-fast-forward
で怒られる
git push origin :hoge
で空をremoteのhoge
ブランチにプッシュすることになるので、リモートのブランチが消える
git push origin hoge
でもう一度pushすればいい
特定のファイルだけmergeする
文字列のちょっと凝った操作
意外とよく使うけどすぐ忘れちゃう
http://y-anz-m.blogspot.jp/2011/03/android-xml.htmly-anz-m.blogspot.jp
どのタイミングで状態が変わるのかコメントに付け足しておく
void hoge(){ if(mDisable){ return } mDisable = true; ・ ・ ・
のようなインスタンスフィールドのboolean値などはなるべくインスタンスフィールドに持たない方がよいと言われてるくらいだから、 どの状態で変わるのかはコメントしておいたほうがあとで見た人(自分も含む)が理解しやすそう。
今回は親のクラスで使われている変数だったため、なおさら。
license情報
- リリース用のものだけでOK(リリース用apkに含まれるもののみ)
- テスト用・デバッグ時にしか使ってないもの(loggingのものなど)は表示しなくてよい
AndroidManifest Activityの設定
http://docs.monaca.mobi/cur/ja/reference/reference/config/android_configuration/#manifest-xmldocs.monaca.mobi
自動でlabelがついてくるけど、特になくてもよさそう。ある場合は、lancherの時アプリ名として表示される。 なかったらデフォルトのものが表示される。
Acitivityのデフォルトに入っている値を利用する
知らなかったけど結構、元々用意されているものが多い。自分で定数設定しなくて済むので、いろいろ書き留めておきたい。
ActivityのRESULT_OK ex)Activity.RESULT_OK
MVP設計におけるDtoを持つ場所
Activityにインナークラスで次画面に渡すためのインナークラスを持っていたところ、インターフェースに持つよう指摘された
理由としては、Activity / Fragment に関係なく、View に固有する dto であれば、View のインターフェースの定義するのが望ましいからです。
どこに依存している情報なのか?を考える。
strings内のCDATA内でのエラー
ライセンスページを作ってる際にエラーが出た
インターフェース内の省略範囲
- インターフェース内に定義した内部クラスに
public static
は省略できる - コンパイルすると自動的に付与してくれる
Parcelable内のwriteとreadの順番
@Override public void writeToParcel(Parcel dest, int flags) { dest.writeInt(mUrl); dest.writeInt(mTitle); } public ParamDto() { } protected ParamDto(Parcel in) { mUrl = in.readInt(); mTitle = in.readInt(); }
このwriteとreadの順番が逆になっていると変数に入ってくる情報が変わってくる
Linearlayout内にdivider
真ん中だけ動的に区切り線をいれたいが、linearlayoutにviewをaddviewをしても、反映されなかった
dividerというものを設定できるみたいなので、これ便利
./gradlew app depencies
で依存しているライブラリを表示する gradleコマンド
ビルドが通らないソースをコミットしない
当たり前だけど、タイポミスがあったままコミットしてしまった。
javadocのtips
こんなのもある blogs.oracle.com
inflateの引数
inflate()の第三引数の話。
第三引数のboolean attachToRoot
の値は、falseにしないと第二引数に渡した親viewが返り値として返ってくる。
http://developer.android.com/intl/ja/reference/android/view/LayoutInflater.html#inflate(org.xmlpull.v1.XmlPullParser, android.view.ViewGroup, boolean)developer.android.com
scrollView内のlinearLayout
scrollViewもその中のlinearlayoutいずれもwrap_content
が推奨されている
実際にscrollView内のlinearLayoutにmatchをつけてもmatchにならない
<style name="TaskDetailButton" parent="@style/Widget.AppCompat.Button.Borderless">
2016_01_04_CursorIndexOutOfBoundsException他
新年。引き続き学んだことの記録を。新年の抱負など冬休みの記録は改めて。
SDK更新後のAndroid studioのエラー
sdk更新したりしてたらエラー出まくって心臓に悪かった。
logcatでエラー
http://www.hangout.co.jp/blog/archives/148www.hangout.co.jp
こんなのが出まくる
dalvikvm﹕ VFY: unable to find class referenced in signature (Landroid/webkit/WebResourceRequest;)
http://theoldmanandthedroid.blogspot.jp/2013/06/fixbug-vfy-unable-to-find-class.htmltheoldmanandthedroid.blogspot.jp
SDK更新するとなったりするみたい。rebuild projectでひとまずはdalvikvm
はいなくなった
リモートのコミットを取り消したい
CursorIndexOutOfBoundsException
わかりやすかった。Cursorの性質みたいなのを知ってなきゃいけなかったのかな
Parcelableの話
http://y-anz-m.blogspot.jp/2010/03/androidparcelable.htmly-anz-m.blogspot.jp
AndroidでBorderBottomをつける
いつも忘れてしまう…
http://wada811.blogspot.com/2013/07/android-view-border-bottom.htmlwada811.blogspot.com
GradleのBuildが遅い!
Android Studio の ビルド がやけにトロいandroid.benigumo.com
checkboxやradiobuttonのcheck部分を隠す
android:button="@null"
checkboxのcheckのデフォルトのstyleをリセットする。
buttonのデフォルトのstyleをリセットするにはbackground="@null"
scrollViewの下にfooterを置く
画面下部に固定配置muchag.undo.jp
layout_weight=1
をscrollViewに追加すると解決する、なんでや…