WebViewClient.onPageFinished

onPageFinishedは、ページのロードが終了した時のハンドラ・・・。

WebViewClient | Android Developers

これまで、TextViewのprogressTextViewで進捗を表示していたが、ロードしていない時は非表示、ロードを開始してからは表示状態にして、ロードが完了したらまた非表示になるようにする・・・。

CustomWebViewClient.javaで、

CustomWebViewClientからもprogressTextViewを使えるように・・・。

progressTextView.setVisibilityで最初はINVISIBLE(非表示)に・・・。

onPageStartedに来たら、VISIBLE(表示)に切り替える・・・。

onPageFinishedに来たら、INVISIBLE(非表示)に戻す・・・。

f:id:BG1:20170228180439p:plain

ロードしてない時は非表示・・・。

f:id:BG1:20170228180456p:plain

ロード中は進捗が表示される・・・。

f:id:BG1:20170228180514p:plain

終わると、また消える・・・。

Sample/android/WebViewClient/onPageFinished/src/WebViewClient at master · bg1bgst333/Sample · GitHub

WebViewClient.onPageStarted

onPageStartedは、ページのロードが開始された時のハンドラ・・・。

WebViewClient | Android Developers

shouldOverrideUrlLoadingだと、バックキーで戻って来た時に呼ばれないことがあるので、こちらでURLの更新をする・・・。

CustomWebViewClient.javaで、

shouldOverrideUrlLoadingにあったurlBar.setTextをonPageStartedに移動・・・。

f:id:BG1:20170228152446p:plain

Yahoo!トップ・・・。

f:id:BG1:20170228152509p:plain

スポナビトップ・・・。

f:id:BG1:20170228152526p:plain

野球・・・。
ここでバックキーを押すと、

f:id:BG1:20170228152552p:plain

URLもスポナビトップに変わっている・・・。
さらに戻ると・・・。

f:id:BG1:20170228152609p:plain

ページもURLもYahoo!トップに戻った・・・。

Sample/android/WebViewClient/onPageStarted/src/WebViewClient at master · bg1bgst333/Sample · GitHub

Activity.onBackPressed

バックキーでもgoBackで戻れるようにしたいが、そのためにはバックキーが押された時の動作を変えないといけない・・・。

Activity | Android Developers

onBackPressedをオーバーライドして、バックキーの動作を変える・・・。

MainActivity.javaで、

canGoBackがtrueならgoBack、falseなら既定の動作super.onBackPressedに任せる・・・。
(この場合の既定の動作はアクティビティを閉じる・・・。)
こうすることで、2ページ目以上なら戻るし、1ページ目ならアクティビティを閉じる・・・。

ついでに、

メニューもcanGoBackでfalseなら閉じるようにした・・・。

f:id:BG1:20170228132836p:plain

Yahoo!トップ・・・。

f:id:BG1:20170228132905p:plain

スポナビトップ・・・。

f:id:BG1:20170228132930p:plain

野球・・・。
そこからバックキーを押すと、

f:id:BG1:20170228132957p:plain

スポナビトップ・・・。
さらにバックして、

f:id:BG1:20170228133025p:plain

Yahoo!トップ・・・。
ここでバックすると、

f:id:BG1:20170228133124p:plain

onBackPressed既定の動作により、アクティビティを閉じる・・・。

Sample/android/Activity/onBackPressed/src/Activity at master · bg1bgst333/Sample · GitHub

WebView.canGoBack

canGoBackは、goBackで前のページに戻れるかどうかをチェックする・・・。

WebView | Android Developers

当然、1つ目のページからさらに前に戻ることはできないので、トーストで"戻れません!"と表示してみる・・・。

MainActivity.javaで、

webView.canGoBackがtrueなら、webView.goBackで戻る・・・。
falseなら、Toastで"戻れません!"と表示・・・。

f:id:BG1:20170228120616p:plain

Yahoo!トップから、

f:id:BG1:20170228120632p:plain

スポナビトップ・・・。

f:id:BG1:20170228120824p:plain

GoBackすると、

f:id:BG1:20170228120844p:plain

Yahoo!トップに戻るが、

f:id:BG1:20170228120908p:plain

ここでGoBackを押しても、

f:id:BG1:20170228120924p:plain

"戻れません!"

Sample/android/WebView/canGoBack/src/WebView at master · bg1bgst333/Sample · GitHub

WebView.goBack

goBackで一つ前のページに戻ることができる・・・。

WebView | Android Developers

resの下にmenuフォルダつくって、その下にmain.xmlを用意し、

今回はメニューにgoBackのアイテムを追加・・・。

strings.xmlは、

"GoBack"と表示されるアイテム・・・。

MainActivity.javaで、

メニューの準備・・・。
R.id.menu_gobackだったら、webView.goBackで戻る・・・。

f:id:BG1:20170228105130p:plain

Yahoo!トップから、

f:id:BG1:20170228105153p:plain

スポナビトップ、

f:id:BG1:20170228105213p:plain

野球・・・。
ここで、

f:id:BG1:20170228105233p:plain

メニューのGoBackを押すと、

f:id:BG1:20170228105255p:plain

スポナビトップに戻るので、

f:id:BG1:20170228105411p:plain

もう一回押すと、

f:id:BG1:20170228105523p:plain

トップに戻る・・・。
ただし、URLバーは変わらない・・・。
shouldOverrideUrlLoadingには来ないようだ・・・。

Sample/android/WebView/goBack/src/WebView at master · bg1bgst333/Sample · GitHub

pipe

pipeは、プロセス間通信に使う名前なしパイプを生成するシステムコール・・・。

Man page of PIPE

引数には要素数2のint型配列を渡す・・・。0番目が読み込み用、1番目が書き込み用に使われる・・・。
主に、親プロセスと子プロセスの間でのプロセス間通信に使う・・・。
今回は、親プロセスも子プロセスも読み書き両方するので、これをさらに2つ用意する・・・。

pipe.cで、

pipe1は親が書き込むパイプ(子は読み込む)、pipe2は子が書き込むパイプ(親は読み込む)・・・。

fork前に自分のプロセスIDを取得・・・。

pipeでpipe1とpipe2を作成・・・。

forkします・・・。
失敗した場合はすべてのパイプを閉じて終了・・・。

forkした後の、親の処理・・・。
親子のプロセスIDを出力したら、3秒後にpipe1[1]に書き込み・・・。
"parent written!~"という感じで、~を書き込んだことを出力・・・。
で9秒待つ・・・。
その後、pipe2[0]を読み込む・・・。
"parent read!~"の後に、子が書き込んだ文字列が入っているはず・・・。
読み込んだ文字列を出力したら、子が終るまでwaitで待つ・・・。
で子のプロセスID、親のプロセスIDを出力・・・。

子はプロセスIDを出力したら、6秒後にpipe1[0]を読み込む・・・。
"child read!~"で、親からの書き込み文字列が見える・・・。
その3秒後にpipe2[1]に書き込んで、
"child written!~"で書き込んだ文字列を見せる・・・。
で5秒待って子は終了・・・。

実行すると、

$ gcc pipe.c -o pipe
$ ./pipe
pid = 14378
I am parent!, getpid = 14378, child = 14379
I am child!, getpid = 14379

最初はこうで、3秒後に、

parent written!, I am parent! Are you child?

また3秒後に、

child read!, I am parent! Are you child?

また3秒後に、

child written!, I am child! Are you parent?

また3秒後に、

parent read!, I am child! Are you parent?

で最後は、

14379 finished!
getpid() = 14378
$

こんな感じ・・・。
親が書き込んだ文字列が子供側で読めているし、子が書いた文字列も親が読めてるので、プロセス間通信になってる・・・。

Sample/unixsyscall/pipe/pipe/src/pipe at master · bg1bgst333/Sample · GitHub

インデクサ

インデクサは、プロパティを拡張したようなもので、オブジェクトのメンバに配列のような添字でアクセスできる・・・。
さらに、プロパティと同じく、getとsetでアクセス制限もできる・・・。
オブジェクトの中に、配列やリストのようなコレクションをメンバとしておいといて、それをオブジェクトの外からアクセスするようなときに使う・・・。

Class1.csを追加し、

Class1のコンストラクタで、配列の大きさsizeを引数に取る・・・。
そのsizeの分の配列intArrayを生成・・・。メンバにsizeをセットしておく・・・。

インデクサは、

<戻り値型> this[<添字型> <添字変数>]

で定義・・・。
上のgetでは、生成した配列の範囲外だったらエラーで-1を返し、範囲内ならintArray[index]の値を返す・・・。

下のsetでは、indexだけじゃなく、値が負の場合もエラー・・・。範囲内かつ値が0以上なら、値をintArray[index]に入れる・・・。

MainClass.csは、

Class1のオブジェクトc1を生成・・・。
コンストラクタに5を渡しているので、要素数5の配列が内部で生成されている・・・。

値の設定・・・。
添字が-3、添字が100、代入する値が-5の場合はエラー・・・。

c1のそれぞれの値を取得し、vに代入・・・。
添字が-2、15の場合はエラー・・・。
c1[4]は設定の時点でエラーなので値がセットされていない・・・。

c1とvの値を出力・・・。

invalid!(index < 0)
invalid!(index > size - 1)
invalid!(value < 0)
invalid!(index < 0)
invalid!(index > size - 1)
c1[0] = 1
c1[1] = 0
c1[2] = 8
c1[3] = 0
c1[4] = 0
v[0] = 1
v[1] = -1
v[2] = -1
v[3] = 8
v[4] = 0
続行するには何かキーを押してください . . .

設定でエラーが出ていないところはc1に0以外の値がセットされている・・・。
取得でエラーが出ている場合は-1がセットされている・・・。
v[4]はc1[4]の値がセットされずに取り出されたので0・・・。

Sample/cs/Indexer/Indexer/src/Indexer at master · bg1bgst333/Sample · GitHub