つまづきの記録「random.nextIntの引数に0はダメ!」「Jpegで実機が重くなる!?」
どうも!LSSです!!
次の月曜日が祝日で、土日休みなので三連休!!
いやっほぉぉぉぉお!!
で、この三連休を利用して、休息もとりつつ、公開に向けたアプリ開発をやっていこうと思ったんです。
ブログ開設から50日、↑に「スマホアプリの開発を行う LittleStrangeSoftware のブログです。」とうたっておきながら未だに上げてないのはどうよ?って思ってたのと、そろそろそこそこの見栄えのアプリを作るのに必要な知識が身についたかな?ってとこで。
こんなエラーは嫌だ
それで、今までも何通りかの案をあたためてはいたんですが、まずはゲームアプリを作る事にしました!
SHAPE、タイマー、アニメ、SharedPreferencesぐらい扱えると、それなりの演出とかも大丈夫かな?と^^
で、実際に作り始めると、やっぱ「つまづき」は発生しますね。
AndroidStudioはエディタ上でリアルタイムに、あるいはコンパイル時に色々とエラーを検出してくれて、どこがおかしいかも親切に教えてくれます。
が!
エディタ上は異常無し、コンパイルも通る、が実際にエミュレータや実機で走らせると発生するエラーってのが、かなり厄介^^;
…正直、AndroidStudioに甘え過ぎてたかな?とも思いますけどねw
で、さらに厄介なのが「確率で発生するエラー」。
うまく動いてるな、よしよし、と思っていると突然、アプリが落ちる^^;
try{ }catch(){ }をちまちまと使って、原因究明→対策、で無事、解決を見ました。
こうした「つまづき」を乗り越える事こそが、
勉強中の身としては経験値になるのだなぁ、と
今日だけで2つもつまづきに出会えた事を
ラッキーだと思うようにしますw
random.nextInt()でアプリが落ちるケース
まずこれ。
結論からいうと、おまぬけなヒューマンエラーです^^;
val rnd0=Random()
intC=rnd0.nextInt(10)
intA=rnd0.nextInt(intC)
↑こういうコードを書いていました。
「アプリが確率で強制終了」の発生個所はここでした。
…そら、乱数使ってるから確率で発生するエラーにもなりますよねw
で、nextInt(引数)は、「0」から「引数-1」までの間の整数をランダムで返す、という仕様です。
例えばnextInt(4)なら、0か1か2か3になる(4になる事はない)んですね。
で、上記コードで自分がやりたかった事は
- まず0~9の整数をランダムで取得
- 次に0~さっきの整数までの値をランダムで取得
という事をしたかったのですが、これが何回か回してるとアプリが落ちる^^;
ここで落ちる、という事が分かってからも少しの間「???」状態でしたが、気づいた時「ああああああ…!!」となりました!
答えは、nextIntの仕様、
「0」から「引数-1」までの間の整数をランダムで返す
にありました!
intC=rnd0.nextInt(10)
intA=rnd0.nextInt(intC)
でintCが「0になりうる」、また自分もそれを望んでいたのですが、その場合、
intA=rnd0.nextInt(0)
という事になります。
これを仕様に照らすと「0以上-1以下の整数を返せ」と、
nextIntちゃんに無茶ぶり
しちゃってた事になるんですねぇ^^;
ごめんよ、nextIntちゃん。
nextInt(0)だと0を返してくれるものと、あらぬ期待をかけてしまってましたw
なぜか実機上の動作がエミュレータ上の動作より重い
お次はこちら。
ふと気づくと、エミュレータ上では期待通りのスピードで動作するのに、実機上で走らせると動作がもっさりになる、という問題に直面しました。
こちらはエラーじゃないのでtry&catchで原因を探る事もできない^^;
作ってるゲームアプリというのが、
「制限時間内に正しい答えのボタンを押し、回答数を競う」
という種類のものなので、ボタンを押してから次の出題に謎のタイムラグがあると0.5秒程度とはいえ死活問題になります-_-;
Google先生にお問い合わせするも、適切な検索ワードが分からず
「androidstudio 実機 エミュレータより遅い」
とかではエミュレータの遅さを嘆く声多数でしたが、なんとか見つけました!
https://teratail.com/questions/21511
「背景画像を無くしてみたら動作が急に軽くなり、それが原因と思われました。」
とあります!
自分も画面を賑やかにしたくて、背景に以前スマホで撮影したJpeg画像を入れてたので、それを外してみると
…ウソのように動作が軽快になりました!!^^
「うーん、でも背景が単色ってのはちと寂しいしなぁ」
と、色々試してみたところ、Jpegだった画像をpngで保存しなおし、そちらを背景にすると
「背景はちゃんと出るし、動作も軽快!」
という結果にたどり着けました!!
ただの背景画像で、アプリ動作中にはそこにあるだけで処理をかけてないのになぁ、とは思いますが、Androidアプリ上ではJpeg×、png〇みたいです。
初日からなかなかの進展^^
「三連休中に、とりあえず遊べるところまで持っていく」
つもりでいましたが、つまづきながらも一日で
「とりあえず遊べる」
までいきました!!
明日からまた頑張ります!