ComidoDownloader ver.β
が完成しました!!
ついでに実行可能ファイルも上げときます。
実行可能環境は、
Windows8 64bit(32bitは未検証)以上
Java1.8.0_65以上
exeファイルをダブルクリックするだけで実行できます。
起動時コマンドプロンプトが起動しますが、気にしないでください。
そういう使用です。
なぜ起動するかはあとで説明します。
もし、ウイルスとして感知されたら、無視して大丈夫です。
launch4j でexe化してるので大丈夫です。
使い方
起動する前に、必ず、どこかのディレクトリに移動してください。
起動時に複数のファイルを生成します。
こんな感じで、漫画ディレクトリ、漫画ページ用CSS、LOGフォルダ、コンフィグフォルダ、一時フォルダが生成されます。
起動すると
このウィンドウが開きます。
更新の左の部分をクリックすると、いろいろと出てくるのですがデフォルトでは追加という項目のみあります。
それを選択すると、漫画追加ダイアログが開きます。
漫画タイトルとidを入力して追加ボタンを押すと、新しい漫画が追加されます。
idというのはComicoの漫画のURL
http://www.comico.jp/articleList.nhn?titleNo=9604
(URLはロヂウラくらし)の、No=のあと(この場合だと9604)になります。
ReLIFEの場合2
で、追加が完了したら(一度追加すればあとは起動時に読み込みます)更新ボタンを押してください。
すると、話の情報を更新します。
その間、ウィンドウはフリーズします(笑)コマンドプロンプトでも眺めてください(笑)
たくさんのログが流れてます。(笑)
で、ダウンロードしたい話を選択して、Downloadを押します。すると、漫画のダウンロードが開始します
この時もフリーズします(笑)中では処理してるのよ。
気長に待ってください(笑)
そのあとHTMLBuildボタンを押してください。すると漫画が見れるファイルが生成されます。
なぜDownloadで1発にしなかったかというと、めんどくさかったのと、間違えてHTMLを消してしまった場合再ダウンロードになるのを防ぐためです。
で、なぜフリーズするか、
JavaFXというのは1つのスレッドで動いています。
ウィンドウの描写からアクションリスナーまで、で、ボタンを押されたアクションで時間のかかる処理を実行すると、1つのスレッドですので、当然ウィンドウの更新が行われません。
なのでフリーズします。
で、ver.1.0.0で対処します。
マルチスレッドにして時間のかかる処理を別で行えばいいのです。
ただ、僕、マルチスレッドプログラミング初めてです。。。
まず、FXのウィンドウが起動したら、イベント処理スレッドを立ち上げます。
このスレッドは、常に起動していて、イベントバッファーに処理が来ると、それをリクエストの順に処理していきます。
この機能は成功しました。
終了時、すべてのイベントが消化されてなければ終了できないようにもしました。
(ダイアログを表示して強制終了させるかは、また別の話)
でも、どのぐらいイベントがバッファーに溜まってるのかがわからないと、何かと不安です。
そこでイベントリストを作成しましたが...
はい、例外が発生しました。
不正または不適切なときにメソッドが呼び出されたことを示します。すなわち、Java環境またはJavaアプリケーションは、要求されたオペレーションに適した状態ではありません。
まじかぁ...これは厄介です...
なぜなら、詳しいエラー情報がないからです...
少なくとも、この例外はマルチスレッドプログラムに多く発生するってことは知ってます。
で、いろいろ調べたところ、リストの実行が終わったところを消去するときに発生してるみたい...
なんでだろ...
例外情報は全部ダイアログで表示するようにしているんですが、なぜかコンソールに表示されるし...
まあ、ということは、内部で、例外が処理されている、となるとFX内ですね。
で、エラーメッセージはJavaFX Application Threadとの文字が...
調べました。
どうやらFXのUIにアプリケーションスレッド以外からアクセスすると、例外が発生するみたいです。
これって...FXのマルチスレッドプログラム無理なんじゃ...
そんなことはなかった。
FXのクラスPlatform
がありました。
このクラスのrunLaterメソッド、これがカギを握ってました。
このメソッドは、引数にRunnableインターフェイスを渡します
Runnableクラスは、ラムダ式用のクラスみたいなものなのでラムダ式を渡しましょう。
そしてその式内のコードを、アプリケーションスレッドで実行してくれるのです!!
つまりUIを更新したければそのメソッドを使えばいいという。
これで問題解決かな?またいろいろ実験してきます。
それではまた。

