トップページ⇒tech
1001コメント349KB

iモード携帯電話用Java(iアプリ) Part10

■ このスレッドは過去ログ倉庫に格納されています
0001デフォルトの名無しさん2005/11/10(木) 15:11:53
NTT DoCoMoのiモード携帯電話用Javaに関する話題を扱うスレッドです。

※DoCoMo以外は下記スレへ。

CLDC+MIDP+携帯電話用Javaスレッド part 4
http://pc5.2ch.net/test/read.cgi/tech/1108781476/

■ iアプリ特有ではなくJava一般に関する質問はこちらへ
【初心者】Java質問・相談スレッド68【大歓迎】
http://pc8.2ch.net/test/read.cgi/tech/1119115837/

■ iモード携帯電話用Java(iアプリ)まとめサイト
http://ton.my-sv.net/

■関連スレ
【日本携帯】Mascot Capsule/Micro3D【標準】
http://pc8.2ch.net/test/read.cgi/tech/1117773530/

過去スレ
Part 1 http://piza2.2ch.net/tech/kako/975/975428633.html
Part 2 http://pc3.2ch.net/tech/kako/1000/10007/1000723476.html
Part 3 http://pc2.2ch.net/test/read.cgi/tech/1040898596/
Part 4 http://pc5.2ch.net/test/read.cgi/tech/1067139509/
Part 5 http://pc5.2ch.net/test/read.cgi/tech/1084246226/
Part 6 http://pc5.2ch.net/test/read.cgi/tech/1091286071/
Part 7 http://pc5.2ch.net/test/read.cgi/tech/1102844217/
Part 8 http://pc8.2ch.net/test/read.cgi/tech/1110946222/
Part 9 http://pc8.2ch.net/test/read.cgi/tech/1120411353/
0153デフォルトの名無しさん2005/12/02(金) 07:03:15
>>148

1文字ずつ読むって、具体的にどうすればよいですか?
実はjavaって今回が初めてであまりわかってないんです・・・
0154デフォルトの名無しさん2005/12/02(金) 08:59:24
>>151
実はJAVAにはBYTE型なんていう型はなく、内部的にintに変換されている。
だから最初からintを使ったほうが(-127〜128への)丸め込みの処理が無くなる分だけ高速

>>158
readByteで読んで保存していき、'\n'にぶちあたったらそこが改行ポイントということでよいのでは?
01551512005/12/02(金) 09:27:07
>>152 >>154
凄いタメになりました…
何故悩んだかというと、

武器を装備できるかどうかのフラグを立てたく、

int型の多次元配列で フラグ,攻撃力,命中補正
って感じでやりたい、という話しをしたら、大学の講師さんが
「フラグは1か0でいいわけだから、int型を宣言するより、
BYTE型で1bitだけ使って後のbitを攻撃力とかに回した方が効率がいい」
と言ったためです

私が無知な事ももちろんありますが、152、154さんは本当凄いですね
このスレのレベルの高さを改めて実感しました
本当に感謝しています 有難う御座いました
0156デフォルトの名無しさん2005/12/02(金) 09:37:38
フラグは1か0でいいわけだから、int型を宣言するより、
BYTE型で1bitだけ使って後のbitを攻撃力とかに回した方が効率がいい
01571512005/12/02(金) 09:44:16
>>156

!!? (゜ д゜ )   ( ゜д゜ )

0158デフォルトの名無しさん2005/12/02(金) 09:52:28
「メモリ食わないか?」

っつー質問に

「こっちの方が高速」

っていう回答して
そっちを薦めるのは変じゃないか?
01591512005/12/02(金) 10:01:33
確かにそう言われてみれば…


メモリがいっぱいいっぱい 処理はもう少し余裕がある
→処理を犠牲にしてでも メモリ効率を気にする

メモリが余裕  処理がキチキチ
→メモリを気にするより 処理に余裕を持たせる

という解釈は間違っていますか?
0160デフォルトの名無しさん2005/12/02(金) 10:19:09
int型でも1bitだけ使って後のbitを(ry
0161デフォルトの名無しさん2005/12/02(金) 10:33:26
フラグ,攻撃力,命中補正

それぞれに必要なbit数を数える。

8bit以内ならbyteでもいいと思う。
0162デフォルトの名無しさん2005/12/02(金) 10:35:21
ギリギリまで性能を使うってのも悪くは無いと思うんだけど、
携帯アプリの新端末が出るたびに保守対応をしていく状況と、
開発者が次々に辞めたり手が空いてる人がいなくて
他人のソースを見る必要がある現状だと
ソースの保守性の方を優先して欲しいと思う(´・ω・`)
0163デフォルトの名無しさん2005/12/02(金) 10:45:45
>>159
そもそも、intとbyteの容量差ごときを気にしなければならないほどメモリの使用状況がシビアなの?

>>155
> int型の多次元配列で フラグ,攻撃力,命中補正って感じでやりたい

これを見る限りそのような話にはとても見えないが。

> 大学の講師さんが「フラグは1か0でいいわけだから、int型を宣言するより、
> BYTE型で1bitだけ使って後のbitを攻撃力とかに回した方が効率がいい」

また時代錯誤な。象牙の塔の人間にありがちだなm9(^Д^)プギャーとか言ってみるテスト。

「効率がいい」って、いったい何がどのように効率がいいのですか。
そうした面倒な工夫をすることで、実際のプログラムは高速になってますか。
また、そもそもメモリを節約する必要はあるのですか。
そうした工夫は、単に汚くて保守困難なバグの多いコードを生み出すだけではありませんか。

その講師に超おすすめのページ↓
http://pitecan.com/articles/Bit/Fugo/fugo.html

効率を云々する前に、まず「そんなこと気にせんでも動くんちゃうの?」と考えよう。
パフォーマンスが出ないなり、実際にメモリ不足で止まるなり、問題が起きてから対処すればよい。
0164デフォルトの名無しさん2005/12/02(金) 10:54:53
うるせーよ
フラグなら素直にboolean使っとけや
0165デフォルトの名無しさん2005/12/02(金) 11:46:46
>>155
そもそもビットで管理する事とintとbyteの容量差を混ぜて語ってるのが間違いなんだよね。

さらにいうなら、フラグはビットでいいが攻撃力はビットじゃ足りないだろ。
昔のTRPGみたいにサイコロの範囲内で決着が付くなら問題ないけど、攻撃力300
とか行くなら9bit必要でしょ?byteにどうやっていれるのさ?
よしんばintの32bitで管理したとして、フラグと、攻撃力と、補正値を出し入れするのに
いちいちビット演算する気? & マスクとビットシフトするくらいなら素直に配列
使った方がマシだと思う。
試しに、32bitにその3つの情報を出し入れするコードを書いてみればいい。

1bitで済む情報だけを、1つのintに複数個入れるならいいけど、数値を扱うなら
ビット演算なんて検討するのは無駄。
0166デフォルトの名無しさん2005/12/02(金) 11:53:32
FFばりにステを255までにすれば問題ない
0167デフォルトの名無しさん2005/12/02(金) 11:56:13
>>165
>>155の内容は
「フラグ」の管理の離しだけだと思うのだが?
0168デフォルトの名無しさん2005/12/02(金) 12:12:16
なぜに荒れてるのか判らんが・・・・>>159の解釈でおおかた間違ってないよ。
ただ最近の携帯ならメモリや速度でんでんより、ビット圧縮解凍処理を入れる事によって
アプリ本体の容量が増えてしまってり、バグ発生時の対処が大変だったり、
仕様変更に耐えれなかったり、面倒な種になることが多いw

知識として持っておくには良い事だろうと思うよ。やるかどうかは別で。
プログラマとしてはビット演算によるデータの保持は基本とも言えるし、
知識がないと後から考察しろと言われても出来ないor苦労するわけだし。

余談:
メモリ効率どうこうとは話変わるが携帯でビットでフラグを所持するのは
外部ファイルとして持つ場合有効とも言える。セーブデータなんかも。
が・・・最近は外部JAR(ZIP)解凍が出来るようになったので
下手にビット演算して小さくすると逆効果になったりもするwww
ケースバイケースだなw
0169デフォルトの名無しさん2005/12/02(金) 13:23:04
でふぉの攻撃力が離散的な値しかとらず

0 : 0
1 : 20
2 : 50
3 : 100
4 : 200
5 : 300

とかならbit数少なくても問題なし
0170デフォルトの名無しさん2005/12/02(金) 13:47:05
とりあえず完成させてから悩め
0171デフォルトの名無しさん2005/12/02(金) 13:58:31
で、定数をfinal intで定義して余計にソースが膨れ上がるとw
0172デフォルトの名無しさん2005/12/02(金) 14:13:36
>>158
メモリ食わないか?という疑問に関しては、JAVAにBYTE型なんて存在しないという返事で一蹴している。
結論的には「メモリ食う量は同じ」だからね。

その上で、より高速なintを薦めた。
0173デフォルトの名無しさん2005/12/02(金) 14:42:45
配列が前提なら、パケットしてくれた・・・よね?
0174デフォルトの名無しさん2005/12/02(金) 15:20:58
うるせーよ
素直にバイト配列使っとけや
0175デフォルトの名無しさん2005/12/02(金) 16:05:58
配列も、定数で初期化するとヒドイ事になるからなぁ。
private final static byte[] b = { 0, 1, 2, 3, 4 };
とか、バイトコード眺めて唖然としたわ。
0176デフォルトの名無しさん2005/12/02(金) 17:29:37
>>171
腫れ上がらない
圧縮技術を勉強知る
0177デフォルトの名無しさん2005/12/02(金) 18:32:05
>>176
finalでないシンボルを作るのに比べたらはるかに少ないけど、やはり膨れるぞ。
それはjarで圧縮してもいっしょ。proguard使えば話はかなり違うだろうな。
ちゃんと携帯java技術を研究知る
0178デフォルトの名無しさん2005/12/02(金) 18:48:45
自分で定義した場合、 final static でも置換動作をしてくれませんっ
本当にごめんなさいっ!

だからプリプロセッサを使うハメになる…。
0179デフォルトの名無しさん2005/12/02(金) 18:54:50
しかし、仕事でアプリ作ってて自分じゃアプリ動かない昔の携帯使ってるけど、
なんでこんな糞端末使う気になるんかね?
メニュー周りのわずらわしさだけで会社の携帯地面に叩き付けそうになるヨ'`,、('∀`) '`,、
0180デフォルトの名無しさん2005/12/03(土) 01:06:09
メーカーによって使い勝手はかなり違う
おそらくあなたの携帯が使い難いんでしょう
0181デフォルトの名無しさん2005/12/03(土) 07:31:32
えーマジbyte!! byteが許されるのは小学生までだよねー
つーかbyte型ここ数年全然使ってないことに気づいた。

>>174
> 素直にバイト配列使っとけや

Javaではint配列のほうが1億万倍素直だ。
VMのインストラクションセットとコンパイル結果のバイトコードをよーく見てみろ。
01821812005/12/03(土) 07:39:31
DoJaのドキュメントbyteで検索してもろくなの引っかからないじゃん。ImageMapくらいだな。
俺はImageMap使ってないし、これもDoJa-4.0からはint型のに置き換えられてる。

まあ、今時1バイトでデータを格納するなんてさもしくないかってこった。
0183デフォルトの名無しさん2005/12/03(土) 08:21:35
マップデータをSPに保存してあって1マス1byteで管理してます。
このマップをメモリにロードするときbyte[]ではなくint[]使えということでしょうか?

0184デフォルトの名無しさん2005/12/03(土) 08:38:27
そうなりますね
0185デフォルトの名無しさん2005/12/03(土) 09:30:06
ちなみに
Connector.openDataInputStreamでSPにアクセスして
DataInputStream.read(byte[] buf)でロードしてますが
int[]型にするにはどうするのですか?
0186デフォルトの名無しさん2005/12/03(土) 10:44:15
>>181
前レスみたかい?
0187デフォルトの名無しさん2005/12/03(土) 13:04:45
>>183
他への移植も考えたら別にbyteでもいいんじゃね?
0188デフォルトの名無しさん2005/12/03(土) 21:29:01
すんません、曖昧な質問なのですが、携帯アプリ環境でテスト駆動開発は可能でしょうか?
JUnitもしくはそれに似たようなものをDoja環境で使っているという人います?
0189デフォルトの名無しさん2005/12/04(日) 00:22:07
>>188
書けるよ。ただしテストやビルド用の環境をちゃんと作らないとダメだぞ。
0190デフォルトの名無しさん2005/12/04(日) 12:27:43
会社で支給されたパソコンのメモリが256。
EclipseとDo-ja動かしていると程よく殺意とストレスが溜まってきます。
ココに要られる方で低スペックパソコンでストレス無く開発されている方がおられましたら
是非そのテクニックを伝授して欲しいのです。
ちなみにOSはXPで無駄なアンチウイルスソフトとか、XPの機能などは全て停止させています。
0191デフォルトの名無しさん2005/12/04(日) 14:16:07
メモリを買い足す(今は安いからオススメ)
HDDを大容量にする

Eclipseは2.x
高速化ソフトを入れる
フリーソフト窓の手を入れる
雑誌・本をレジストリをごにょごにょ

最終手段 SafeModeで起動

でも一番苦労しないのは新しいのを買うこと
新品が59800円なんて5年前なら内臓破裂ものだぜ?
0192デフォルトの名無しさん2005/12/04(日) 14:18:18
Eclipseを使わなければ(ry
0193デフォルトの名無しさん2005/12/04(日) 16:27:19
iアプリ開発ツールをインストールしようとしたら、

「iappli Development Kit for doja-4.0(FOMA)を完全にインストールする
前にウィザードが中断されました。

システムが変更されていません。後でこのプログラムをインストールするに
は、再度インストールを実行してください。
ウィザードを終了するには[完了]をクリックしてください。」

と表示されてインストールできないんですが、何が悪いのでしょう?
ちにみに、j2sejdk1.3.1_16はインストールしてあります。
0194デフォルトの名無しさん2005/12/04(日) 16:34:50
再起動してもう一回実行すれば
0195デフォルトの名無しさん2005/12/04(日) 18:56:50
エミュレータではポインティングデバイスの動作確認はできないのでしょうか?
マウスを動かしても全然反応ないというか,エミュレータでのポインティングデバイス
に相当するものがわかりません.
0196デフォルトの名無しさん2005/12/04(日) 20:53:55
何のポインティングデバイスですの?
0197デフォルトの名無しさん2005/12/04(日) 23:42:37
N900とかのことか?
エミュでできたかな…。試したことねーや…。
0198デフォルトの名無しさん2005/12/05(月) 19:37:15
すいません。教えてください。
最近になって FOMAのアプリの開発を始めました。
初歩的なことですいません。
バックライトを常時点灯させたいために以下のコードを
書いたのですが、 isAvailable()のリターン値が必ず falseが
帰ってきてしまいます。
なにか、書き方が良くないのでしょうか?
テストした機種はSH901isです。
よろしくお願いします。

if ( PhoneSystem.isAvailable(PhoneSystem.DEV_BACKLIGHT) == true ){
PhoneSystem.setAttribute(PhoneSystem.DEV_BACKLIGHT,PhoneSystem.ATTR_BACKLIGHT_ON);
}
0199デフォルトの名無しさん2005/12/05(月) 20:07:32
>isAvailable()のリターン値が必ず falseが帰ってきてしまいます。
何も不思議はない。バックライト制御ができない端末ってことだ。
0200デフォルトの名無しさん2005/12/05(月) 20:11:23
余談だが、携帯電話にはバッテリーを長持ちさせたいという設計上の意図がある。
だからアプリからバックライトやバイブレーションの制御が好き勝手に出来ない端末がある。
明かり点けっぱなし、モーター回しっぱなしでバッテリー消費しまくりのアプリを防ぎたい、ってことで。
0201デフォルトの名無しさん2005/12/05(月) 21:01:15
>>198
本体側の設定で、バックライト制御の項目が「システム」になってると
falseが返ってくるようになってるんじゃないの?
0202デフォルトの名無しさん2005/12/05(月) 21:03:49
>>194
何回再起動しても同じです・・・。
0203デフォルトの名無しさん2005/12/05(月) 23:00:23
第5回iアプリコンテスト ドコモカップ東北のスレ
http://hobby7.2ch.net/test/read.cgi/appli/1133790912/
02041952005/12/06(火) 00:16:35
>>196-197
N端末のやつです.
N端末を買ったらニューロポインタがついてたので,それを使ったアプリが
作れないかと思いまして.
ん・ぱか工房の辺りを見るとエミュレータで動かしてるっぽい画像が載ってる
のですが,やり方が全然書いてないみたいなので.
何か見落としてるんでしょうか?
0205デフォルトの名無しさん2005/12/06(火) 00:51:45
ニューロポインタって、表示非表示をAPIから指定できたよな?
とりあえず表示ってやってみた?
一回しかニューロポインタ使ったアプリ作ったことないからうろ覚えで悪いが。
02061982005/12/06(火) 11:43:15
>何も不思議はない。バックライト制御ができない端末ってことだ。

やはりそういうことなんですね。

>本体側の設定で、バックライト制御の項目が「システム」になってると
>falseが返ってくるようになってるんじゃないの?

 設定をいろいろ見たのですが、そういう設定が見当たらないのです。

0207デフォルトの名無しさん2005/12/06(火) 13:20:12
絶対あるから探せ。端末名はなんだ。
02081982005/12/06(火) 13:26:41
>>207
SH901isとN701です。
02091952005/12/06(火) 14:16:28
>>205
とりあえず
PointingDevice.setEnabled(true);
って書いてあります.で,
PointingDevice.getX()とかで座標を表示してみたのですが,0って書いてあるまま
変化がありません.
0210デフォルトの名無しさん2005/12/06(火) 14:58:24
PointingDeviceについて、今はもう会社を辞めた人のソースを見てみた。

初期化は

if( PointingDevice.isAvailable()){
 PointingDevice.setEnabled(true);
 PointingDevice.setMode( PointingDevice.MODE_JOYSTICK );
}

だけっぽい。
0211デフォルトの名無しさん2005/12/06(火) 15:18:05
>>208
俺SHだが・・・ないなwwww
説明書どこかあったら見れてみればいいんでない?w
02121952005/12/06(火) 16:09:16
>>210
すみません,実機で試すのを忘れていました.
実機では普通に動きました.
エミュレータだけうまくいってないようです.
「DoJa-4.0プロファイル向けiアプリ開発ツール」というのを使っているのですが,
これはポインティングデバイスには対応してないのでしょうか?
0213デフォルトの名無しさん2005/12/06(火) 16:17:12
>>212 いいかげん、自分で調べたら?
02141952005/12/06(火) 16:25:14
>>213
すみません.ただ,Googleで検索しても全然ヒットしないので・・・
APIのリファレンスにはエミュレータの使い方なんて書いてありませんし,
ポインティングデバイスを使った場合のエミュレータの使い方を解説したサイトが
ないみたいなんです.
0215デフォルトの名無しさん2005/12/06(火) 16:36:01
全く調べてない俺が、無理だと言っておく。
0216デフォルトの名無しさん2005/12/06(火) 17:30:11
>>195
実機でテストしろ
0217デフォルトの名無しさん2005/12/06(火) 19:33:31
>>195=212=214
なぜエミュレータのドキュメントを読まないのさ。
「エミュレーションの範囲」の項目を読んで自分で判断しろ。
0218デフォルトの名無しさん2005/12/06(火) 19:35:11
>>195
setMode() で MODE_MOUSE にして
setVisible(true) ってしてみたら?
02191952005/12/06(火) 19:56:43
>>216
うーん,やっぱりそうなってしまうんでしょうか.

>>217
私が見た限りでは触れていないように見えます.
エミュレータで動かせるだろうと判断した根拠は
ここ http://www.saturn.dti.ne.jp/~npaka/sorami/2/index.html
の画像を見たからなんですが・・・

>>218
試してみましたが駄目でした.
0220デフォルトの名無しさん2005/12/06(火) 20:29:25
PCのマウスカーソルをエミュレータの画面上で…
02211952005/12/06(火) 20:52:13
>>220
いろいろ動かしたりクリックしたりしましたが駄目でした.
getX()しても0しか返ってきません.
0222デフォルトの名無しさん2005/12/06(火) 22:14:37
PointingDevice.setMode(PointingDevice.MODE_MOUSE);
PointingDevice.setEnabled(true);
PointingDevice.setVisible(true);

↑初期化、setModeを先にやらないと例外が発生する端末がある
後は getX() とかで座標を拾う

操作はエミュレータの「決定ボタンの上」で、マウスの右ボタンを押しながらマウスを動かす


MODE_JOYSTICK の場合は getDirectionX() とかを使う
この場合画面の座標ではなく、入力方向が得られる
02231952005/12/06(火) 22:22:45
>>222
できました,ありがとうございます.
どこかに書いてあったのを見落としていたのでしょうか.
0224デフォルトの名無しさん2005/12/06(火) 22:51:11
/*
 ふと思ったんだけどさ。
 そろそろモバイルで悪魔召喚プログラムとか出ねーのかな。
*/
0225デフォルトの名無しさん2005/12/06(火) 23:04:52
>>223
エミュレータでのポインタ操作については DoJa4.0のドキュメントには書いてない(と思う)
でもどっかで見たことあるなぁ〜と探していたら DoJa2.1のドキュメントに記述があったw
0226デフォルトの名無しさん2005/12/07(水) 01:22:23
IApplication.getCurrentApp().getSourceURL()
↑でダウンロードしたURLが取れるみたいなんですが、
これ以外に、ADFの値って取れないですか?
例えば、AppVer(バージョン)とか、取りたいんですが。。。
0227デフォルトの名無しさん2005/12/07(水) 03:51:29
ログ嫁。
0228デフォルトの名無しさん2005/12/07(水) 10:11:39
ドキュメントも読めない奴はとっとと中国に帰ってくれ。
0229デフォルトの名無しさん2005/12/07(水) 11:14:04
>>224
メガテンのサイトにおいきなさい。
0230デフォルトの名無しさん2005/12/08(木) 19:27:15
質問良いでしょうか?

�@SPのgifのパレット部分を0xFFで埋める
�AgifをMediaManager.getImageで作成、表示
�BSPのgifのパレット部分を元に戻す
�CgifをMediaManager.getImageで作成、表示
�D1へ戻る
上記の様にして白点滅を行っています。

この時、
P901iはスムーズに動き、
P902iは激しく遅いんですが、原因が分かりません。。。

なぜでしょうか???
0231デフォルトの名無しさん2005/12/08(木) 19:38:54
>>230
実機無いからわからんがP902はスクラッチパッド読み書きが遅いとかそういうのは無い?


あと質問、D505でサウンドを止めたり鳴らしたりしてると
たまにサウンドが再生されないことって無い?
心当たりがあって対応したことある人の情報求む(´・ω・`)
02322302005/12/08(木) 19:43:45
>>231
返答ありがとうございます。

iアプリのベンチ
ttp://npaka.yoko.ne.jp/bench/bench.jsp
こちらを見る限り、P902iの方が早い様です。

ゲームデータのセーブ(1.5kB程)もP902iは非常に遅いのですが、
奇妙な事に2回目以降のセーブは、P901iよりも早かったりします。

う〜む。。。
0233デフォルトの名無しさん2005/12/08(木) 19:46:29
>>230
902はSP書き込みがちと遅かったような。
てか、毎回作り直しゃ遅いに決まってるので
�Aと�Cの画像を1回だけ作って保持、交互に出せばいいだけかと。。。

>>231
D505i(S) iアプリ作成に関する注意事項の一番最初の項目参照。
0234デフォルトの名無しさん2005/12/08(木) 19:57:55
>>233
あり�d(´・ω・`)

とりあえずsleep入れて駄目だったらAUDIO_STOPPED待ってみる。
容量が足りればだけどね(ノ∀`)
02352302005/12/08(木) 20:05:04
>>233
返答ありがとうございます。

実はその処理への移行途中でして、、、

全データ(260kB)のダウンロード時間を計ってみました。
P901i 1分6秒
P902i 1分10秒

Connector.openOutputStream の初回呼び出しがやたら遅い気がしてきました。
とりあえず、白点滅処理を変更して様子を見てみます。

ありがとうございました。
0236デフォルトの名無しさん2005/12/08(木) 20:46:38
待ち受けアプリで、次のような実装をしてみました、

while( true ) {
try {
print("->1");
((MApplication)IApplication.getCurrentApp()).deactivate();
print("->2");
((MApplication)IApplication.getCurrentApp()).sleep();
print("->3");
break;
}
catch( Exception e ) {
print("->err");
}
}

アプリボタンを連打していると(おそらく、スリープ状態に移行したタイミングでアプリボタンを押す)sleepのところでハングします。
AppTraceにて確認したところ、
->1
->2
->3
->1
->2
ここで停止

"->err"の例外もとれていないし、そもそもjavaの実行自体が止まっているような感じです。
機種はD902iです。
動作が正常なものと同じようにハングする機種があって困っています。何か情報をお持ちの方教えてもらえませんか?
0237デフォルトの名無しさん2005/12/08(木) 21:34:02
>>236
そもそも何がしたいの?
02382362005/12/08(木) 21:49:40
>>237
単純にただの待ち受けアプリなんですが、アプリボタンを連打するとsleepに移行しない機種があるので、
ふつうはどんな実装にするのかなと思ったんです。
0239デフォルトの名無しさん2005/12/08(木) 22:29:17
>>236
連打すると、非活性のときにsleepしようとする
ことがあるから休眠に遷移しないのでわ。
whileループはどこに書いたの?start()かね。

(1) 連打しないとき
非活性 deactivate()
↓
休眠 sleep()
↓← 活性化ボタン
活性

(2) 連打したとき
非活性 deactivate()
↓← 活性化ボタン
活性
↓
休眠 sleep() ※例外 IllegalStateException
0240デフォルトの名無しさん2005/12/08(木) 22:42:33
>>239
ちなみにスレッドにしてみたのですが、現象は変わりませんでした。
いまはstart()内のメソッドを無限ループさせています。

タイミングによって
deactivate()
←ここで活性化される
sleep()
活性化状態なので例外発生

の部分は考慮していて、try〜catch部分でループするようになっています。

今回の場合は、sleepメソッドを実行してるにもかかわらず、待ち受けに遷移しない+JavaVMの実行自体は止まってるっぽい。という状態になってます。
sleepが素直に例外を吐けば、sleepできるまでループすればいいだけなんですが、止まってしまうので悩んでます。

タイミング的に「sleep→待ち受け→ここで即座にαボタン」でこの現象が起こります。
0241デフォルトの名無しさん2005/12/08(木) 23:03:48
>>240
トレースが出ないことを除けば、動作しているように見えるんだけど。

・JavaVMの実行自体は止まってるっぽい ←sleepできたからVMが止まる
・sleepが素直に例外を吐けば ←sleepが成功したから例外を吐かないのでは

ついでにそもそも、どうしてsleep(休眠状態)にするのかというと、

・携帯を折り畳んだから休眠する
・一定時間、ボタン操作がないから休眠する

だろうから、sleepするために
ループでぐるぐる回すのはAPIの使い方として変な気がする。
0242デフォルトの名無しさん2005/12/08(木) 23:10:46
>>241
whileで回してるのは、deactivate() →sleep()の間に、たまたま活性化の割り込みが入る場合があるから、その対処としてwhileしています。
そもそも、sleepから復帰したらwhileは抜けるし、 通常よっぽど間が悪くなければ例外吐かずに1発で休眠してくれます。

問題なのは、休眠していない(待ち受け状態になっていない)のに、JavaVMが停止してかつ、その時にいっさい例外を吐かない状態があるということなんです。
ショートプログラムを作成してみたので気になるところがあったら教えてもらえませんか?
↓
0243デフォルトの名無しさん2005/12/08(木) 23:14:02
import com.nttdocomo.ui.*;
import java.io.*;

public class Exec extends MApplication {
public void start() {
System.out.println("[start]");
while( true ) {
System.out.println(" >>[loop]");
}
}
public void resume() { }
public void processSystemEvent(int ptype,int param) {
System.out.println("[event]");
while( true ) {
System.out.println(" >>[0]");
try {
System.out.println(" >>[1]");
deactivate();
System.out.println(" >>[2]");
sleep();
System.out.println(" >>[3]");
break;
}
catch(Exception e) {
System.out.println(" >>[err]");
}
System.out.println(" >>[4]");
}
System.out.println("[end]");
}
}
0244デフォルトの名無しさん2005/12/08(木) 23:50:31
>>243
このコードだと、sleepが終わるとまたprocessSystemEventが
呼ばれるだろうから、永遠に休眠状態から出られない気がするんだけど。

トレースが出ないのは、processSystemEvent→processSystemEventの
ループがシステムのイベントキューを占有するからだと思うが。

すまんが漏れにはこれ以上の分析はできん。
0245デフォルトの名無しさん2005/12/09(金) 00:06:49
>>244
なるほど、キューがたまるのか。。。と思って、今度はstart()側に、flagを設定して、flagの状態でsleepしてみたが、状況は変わらなかったです。
processSystemEvent()もsynchronized設定して、他のスレッドから割り込みかからない状態にしてみました(下に書いてみた)

public synchronized void processSystemEvent(int ptype,int param) {
System.out.println("[event]");
flag = true;
System.out.println("[end]");
}

うーん、待ち受けに戻った直後にαボタンを押すのは駄目ってことなのか・・・。
F901iCの場合は、電源を切るしかない状態になってしまうんだけど。。。。
0246デフォルトの名無しさん2005/12/09(金) 00:23:15
>>243
聞きわすれたけど、start()の中に無限ループがあるのは
なんでなの?
0247デフォルトの名無しさん2005/12/09(金) 13:48:10
>>246
ふつうゲームをつくるときに、start()のなかでスレッドを起動するか、そこで無限ループさせるから、それを状況的に再現してるって感じです。
プログラム的にはべつに意味はありません。

いろいろ調べたんだけど、非活性から待ち受け状態に移行した直後にαボタン押すとやっぱり駄目みたい。
メーカー発表あってもいいような不具合だと思うんだけど、最近ドコモなんにも発表しなくなったような・・。
0248デフォルトの名無しさん2005/12/09(金) 15:08:43
経験上、活性から一気に「非活性を経由して待ちうけに至る」という処理は、
不安定っぽいです。で私はこうしてます。

まずイベントハンドラ内でdeactivate()だけ呼んだ後にタイマを仕掛けます。
次にprocessSystemEvent()のWAKEUP_TIMER_EVENTで、
  そのタイマが発火したら(1000msとか一定時間経過後)、
  もう一度deactivate()してsleep()します。
この時processSystemEvent()がMODE_CHANGE_EVENTを受けたら
  無条件でそのタイマーを止めます。

こうするとprocessSystemEventがパラで呼ばれない限り、
deactive()とsleep()の呼び出しがアプリボタン(MODE_CHANGE_EVENT)で分断されるということはありません。
02492482005/12/09(金) 15:13:05
>>248
> 次にprocessSystemEvent()のWAKEUP_TIMER_EVENTで、
>   そのタイマが発火したら(1000msとか一定時間経過後)、
>   もう一度deactivate()してsleep()します。
(中略)
> こうするとprocessSystemEventがパラで呼ばれない限り、
> deactive()とsleep()の呼び出しがアプリボタン(MODE_CHANGE_EVENT)で分断されるということはありません。

ごめん、嘘書いた。 orz

ともかくTimer回して、そっちでdeactivate();sleep()するようにすると安定するよ、
ということだと思ってください。
0250デフォルトの名無しさん2005/12/09(金) 18:10:06
>>249
なるほど。言うとおりにやってみたら安定した。サンクス。
せっかくなので状況をまとめます。
1・休眠→活性化→非活性→休眠→活性化・・・と続けることができるアプリの場合、非活性から休眠まで一定時間がないと落ちる機種がある。
2・無限ループ、スレッドsleepを入れる、キューがたまるから・・・は関係なし。
3・対処として、deactivate後に一定時間おいてsleep。検証では時間の長さではなく、同一スレッドでdeactivate();sleep()としてるのがまずい。
4・待ち受けスケルトン作ってみた。
0251デフォルトの名無しさん2005/12/09(金) 18:13:34
import com.nttdocomo.ui.*; import java.io.*;
public class Exec extends MApplication {
canvas can = null;
public void start() {
can = new canvas();
Display.setCurrent(can);
// 特に意味はありません。ゲーム的なループです
while( true ) { System.out.println(" >>[loop]"); }
}
public synchronized void processSystemEvent(int ptype,int param) {
if( ptype == MApplication.MODE_CHANGED_EVENT ) {
System.out.println("[event]");
((MApplication)IApplication.getCurrentApp()).deactivate();
can.stime.stop(); can.stime.start();
}
}
}
class canvas extends Canvas {
ShortTimer stime = null;
public canvas( ) { stime = ShortTimer.getShortTimer(this,1,100,false); }
public void paint( Graphics g ) {}
public synchronized void processEvent( int ptype, int param ) {
if( ptype == Display.TIMER_EXPIRED_EVENT ) {
try {
System.out.println(" >>[sleep]");
((MApplication)IApplication.getCurrentApp()).sleep();
}
catch(Exception e) { stime.stop(); stime.start(); }
}
}
}
02522482005/12/09(金) 20:58:28
>>251
安定したなら良いんだけど、そのサンプルは微妙に意味合いが違うかも。

ポイントは、同一スレッドでというよりは、
ユーザが起こしたイベント(キー入力とか)のハンドラ内でMApplication.sleep()を呼んではダメで
タイマーなどシステムが起こすイベントのハンドラ内ならOKっぽい。という点ね。
■ このスレッドは過去ログ倉庫に格納されています