1 :デフォルトの名無しさん:2012/07/24(火) 23:44:55.33
このスレではAndroidSDK・NDKやAndroidマーケットに関する質問を扱ってます。

※プログラミング自体が初めて!なあなたには↓↓↓こちらへ
スレ立てるまでもない質問はここで 120匹目
http://toro.2ch.net/test/read.cgi/tech/1341099441/
Eclipse統合M33【Java/C++/Ruby/Python/Perl】
http://toro.2ch.net/test/read.cgi/tech/1340974518/
★★Java質問・相談スレッド155★★
http://toro.2ch.net/test/read.cgi/tech/1340976913/

****関連リンク****
■ Android developers http://developer.android.com/
■ ソフトウェア技術ドキュメントを勝手に翻訳 http://www.techdoctranslator.com/

****前スレ****
Androidプログラミング質問スレ Part23
http://toro.2ch.net/test/read.cgi/tech/1340103432/


48 :デフォルトの名無しさん:2012/07/27(金) 10:00:31.75
掃除コードが実行されるかされないかではなく、
recycle()&参照null入れせずに終了すると、
ネイティブヒープに永久に残ったままになるのかどうかが知りたい

57 :デフォルトの名無しさん:2012/07/27(金) 21:10:02.27
>>48
Bitmapはfinalizeされるとリソースをクリアするみたいなので
普通は何もしなくていいんじゃないかな?
http://tools.oesf.biz/android-4.1.1_r1.0/xref/frameworks/base/graphics/java/android/graphics/Bitmap.java
http://tools.oesf.biz/android-4.1.1_r1.0/xref/frameworks/base/core/jni/android/graphics/Bitmap.cpp
http://tools.oesf.biz/android-4.1.1_r1.0/xref/frameworks/base/libs/hwui/ResourceCache.cpp
↑は4.1だけど。

なんでrecycleは、いつ動くかわからないfinalizeに任せられない
っていう人向けのメソッドなんじゃないかと思うけど。

C++はさっぱりわからんので、間違ってたら指摘してくれると嬉しい。


60 :デフォルトの名無しさん:2012/07/28(土) 04:30:54.39
>>57
recycleは必要になった時にisRecycledなら再ロードするから
メモリ不足になったら開放しても構わないよって指示する事でしょ?
nullにすればGCで開放されるけどrecycleならメモリ不足にならない限りは開放されない
要するにOutOfMemory対策用だよ

69 :デフォルトの名無しさん:2012/07/28(土) 16:45:43.66
そのメモリの事で質問させて下さい。
300KB程度のBitmapを、画面をタッチするごとに読み込むアプリを作っています。

Bitmap image=null;

if(touchAction==MotionEvent.ACTION_DOWN){
image=BitmapFactory.decodeResource(r,R.drawable.hoge,opt);
}

という感じで、同じBitmap変数の中身を入れ替えています。
そして、常にRuntime.getRuntime().totalMemory()などでメモリ状態を監視しているのですが、
ギャラクシーS3だけが特別大きなメモリ値になり、すぐにOOMで落ちてしまいます。

具体的には、
機種 totalMemory() totalMemory()-freeMemory()
P01D    7240  2800
SH13C   6140  2880
GalaxyS3 57600  56600
と、全く同じ内容で起動しても、GalaxyS3だけが、1桁多くのメモリを使用し(トータルも多いですが)
しかもギリギリいっぱいまで使っているような状態となってしまっています。

機種ごとに違う処理を施しているのは1点のみで、画面解像度に関わらず見た目を変えないように
BitmapのinTargetDensityを設定している事くらいです。

あまりにもメモリ確保の値が違いすぎて何がなにやら分からず困惑しています。
ちなみにGalaxyS3以外の端末ではOOMの連絡は全くきていないので、上記PやSHの機種以外でも
おそらくメモリ使用量は同じような感じだと思います。

よろしくお願いします。


70 :デフォルトの名無しさん:2012/07/28(土) 17:16:42.49
>>60
ごめん、OOM対策ってのはわかるんだけど
その前の説明がよくわからなかった。

BitmapとBitmapFinalizerの関係は
http://japan.internet.com/developer/20060404/26.html
の、Image2とNativeImage2のパターンと一緒(2.xとかは違うかも)なんで
recycleした場合は、次のGCで回収されるされるけど
recycleしない場合は、Finalizer(FinalizerDaemon)が動いた後のGCまで回収されない。
つまり、Finalizerのqueueがつまったり
他に重いfinalizeがあったりすると、OOMが発生する場合がある。

なんで、finalizeするまで待てない、って書き方をした、つもり。
自分の書き方が悪かったね。OOM対策って明記すればよかった。
ごめん。


75 :デフォルトの名無しさん:2012/07/28(土) 17:48:13.10
>>70
GCは不要になった(すなわち参照されていない)データを開放するもの
だけど、recycleを呼んでもオブジェクトは参照したままなんだからGC対象ではないはず

recycleは「必要になったときに片付けられちゃってたら再度準備する用意がプログラム側にありますよ」
ってシステムに伝える事をしてる

システム側はそれをうけて、メモリ不足になってしまったときに
「必要なら再確保してくれ」って印(isRecycled)をつけて画素データを開放する
Bitmap自体はそのまま残ってるけど画素データのないBitmapなんてサイズたかが知れてるはず

逆に言えばrecycleをしてもメモリ不足にならないうちはisRecycledにならないし
ならないうちならそのままBitmap使えるってこと、と理解してたんだけど何か覚え違ってるかな

103 :69:2012/07/30(月) 09:20:04.31
メモリの大量消費の原因が分かりました。
やはり、BitmapのinTargetDensityで高解像度に合わせた大きな数値に
合わせていたのが原因でした。
この数値を元々の画像サイズの160に設定してみると、全くメモリを食いませんでした。

ただ、いざどうやって800*480サイズを前提に作った画像使用しまくりアプリを1280*768も
(バキューン!)するか考えたのですが、
・inTargetDensity→使用メモリが膨大になりすぎてOOM
・Canvas#scale→setFilterBitmap(true)を設定したら、猛烈に重くなってしまい……
・高解像度用の画像も用意→アプリサイズが跳ね上がる

最終的には、
inTargetDensityで各Bitmapの画質を落とすなどしてメモリ消費を減らす、
Canvas#scaleのsetFilterBitmapをfalseでギザギザ画面で見てもらう

このどちらかでどうにかしたいと思います。

大量の画像や、画面幅いっぱいの画像などを使用しているアプリって、
今後、高解像度端末が増えたらOOMで落ちる現象が多発したりしないですかね
それとも自分の技術力不足で、他に何か良い方法があるのでしょうか…?


107 :デフォルトの名無しさん:2012/07/30(月) 11:09:52.05
>>103
静的な画像リソースはなるべくpurgeable なbitmap にする
動的な画像でもCPUが余ってるならオンメモリでJPEGやPNGにエンコードしてpurgeable bitmapにする
purgeable でないbitmapは不要になったら recycle してネイティブヒープを解放する

参照が切れれば勝手にrecycleされると思ってる人多いけど、
Androidのjavaのファイナライザは呼び出されない確率がやや高い
リソース解放を明示的に指定できるならそうしたほうがいい

>>75
デタラメ書くな。Bitmap.java くらい読めよ
お前の知識はrecycleとpurgeがごっちゃになってる

112 :69:2012/07/30(月) 18:18:55.63
>それとも高解像度のイラストをアニメーションをさせるギャルゲーでも
そこまでではないのですが、画面いっぱいの背景イラストの上をキャラクターが
歩いて回るようなイメージです。

ですので、毎フレーム、全画面の背景イラスト(350kb前後のjpg)を描画し、
その上に画面を動き回る透過PNG(200kb前後)を3キャラ描画しています。
setFilterBitmapをtrueにすると、このPNGキャラの動きが重くなってしまいました。
確かにドット絵ならカクカクの方が味があっていいのですが、今回画面上を
歩き回るキャラクターも、フルカラーで描いてもらったものなので……

>107
例えば、背景イラストは場面ごとにBitmap haikei=BitmapFactory.decodeResource(r,R.drawable.hai1,opt);
のように新背景を読みなおしているのですが、こんな感じで連続して同じ変数に何度も読み込み直して
使用している場合でも、recycleを呼んだ方が良いのでしょうか?
例えば画像読み込み前にnullを代入してrecycleして、それから新しいBitmapを読み込んだりする事で
効果があれば良いのですが、、

228 :デフォルトの名無しさん:2012/08/04(土) 23:30:48.14
手順通りに開発環境をインストールしても
Software being installed:Android Development Tools 20.0.2
とか出てインストールが完了できません
グーグルのサーバーが壊れてるのでしょうか?

232 :デフォルトの名無しさん:2012/08/05(日) 03:56:51.71
>>228
dl.google.com はときどき超遅いことがある
理由は知らない

261 :デフォルトの名無しさん:2012/08/06(月) 01:49:41.23
AsyncTaskにCursor渡すのは行儀悪いの?
2.2、4.0.3のエミュだと問題ないのに、
4.0.4の実機だと何故か固まる、、、

343 :デフォルトの名無しさん:2012/08/10(金) 05:46:07.09
スレチだったらすまん
久しぶりにAndroidの開発やろうとしてEclipse起動したらなんかSDKが読み込まないんですけどどうしたらいいのですかね

347 :デフォルトの名無しさん:2012/08/10(金) 13:34:29.70
>>343
最新バージョンに更新すると、なぜかぶっ壊れる。
Googleのミスだと思うので、Googleが修正してくれるまで無理そう。
マーケット登録者激増なんで、開発者を排除したいんですかね?


348 :デフォルトの名無しさん:2012/08/10(金) 13:47:38.64
>>347
r20

349 :デフォルトの名無しさん:2012/08/10(金) 13:48:47.75
>>348
途中で送信してしまった

r20で壊れるの?

361 :デフォルトの名無しさん:2012/08/11(土) 12:01:57.80
>>349
r20で壊れます。
Google的にも救済措置として、r14のダウンロードページを用意しているので、それを使用する。
そしてSDKのときADKを絶対更新しないことです。

566 :デフォルトの名無しさん:2012/08/19(日) 23:20:03.37
プレイストアで有料版とそのお試し版を登録している方、それぞれのソースはどうやって管理していますか?


568 :デフォルトの名無しさん:2012/08/19(日) 23:32:13.04
>566
毎年その話題が出るけど、人によって違うしアプリの構成によっても変わるから、なんとも言えない。俺はアプリの構成上if文でglobal変数でfalseにして最後にコピーして有料はtrueにするやり方が多いけど、やっぱり最後はアプリ次第って感じかな?

585 :デフォルトの名無しさん:2012/08/20(月) 17:44:13.63
>>568
その方法だと体験版クラックされて製品版として使用されるよ
そのFalse(0)部分のグローバル変数をTrue(1)にバイナリ書き換えするだけだし

631 :デフォルトの名無しさん:2012/08/22(水) 01:26:24.05
sqliteの中身はroot取らないと見れないの?

634 :デフォルトの名無しさん:2012/08/22(水) 10:37:52.53
画面の向きを変えるときonCreate()をやり直さない方法はありますか?

640 :デフォルトの名無しさん:2012/08/22(水) 17:16:28.49
sdもどうせandroidのは抜き差ししないんだからextとかパーミッション付のfs使えばいいんだよなぁ。
あ、フラッシュメモリの寿命を縮めないfsであるかは別の話で。

641 :デフォルトの名無しさん:2012/08/22(水) 17:46:25.41
お前らアイテム内課金の証明書どうやって隠蔽してますか

648 :デフォルトの名無しさん:2012/08/22(水) 22:52:58.99
textviewで表示された、文字列(読み物)をボタンのクリックイベントで、文末に向かってゆっくりスクロールする機能(読み物を読めるスピードでスクロール)を実装したいのですが、どのように実装すれば宜しいのでしょうか。


649 :デフォルトの名無しさん:2012/08/22(水) 22:59:20.33
タッチイベントの変数はどこからでも参照できるんですか?
全然意味が分かりません

651 :デフォルトの名無しさん:2012/08/23(木) 01:16:56.86
>>631
マルチ乙。ファイルとディレクトリのパーミッションとユーザ権限が合ってれば読めると思うよ。

>>634
ある。 android:configChanges をマニフェストに書くとか Activity#setRequestedOrientation とか。

ただし、なんだかんだでonCreateからやり直すパターンを選択せざるを得ないことが多い
たとえば「一時的に回転を禁止」とか設定しようとすると
画面が横向きの時に機種によって90度か270度が固定されてしまって
ユーザには上下反転したように見えてしまう、など。

>>640
USBメモリとかを視野にいれるとあまり意味ないね

>>641
アイテム内課金のレスポンスはそのまま自前サーバに送って
自前サーバの内部で検証・デコードする。
アプリ内に置くのはサンプルアプリだけっしょ

>>648
量が少ないんなら、FrameLayoutの中にでも入れて定期的にscrollToすればいい。
量が多いんならTextViewいっこでどうにかするよりカスタムView作ってonDrawで描画したほうがいい


>>649
イベントに渡された変数をアプリ側の適当な変数やコンテナに保持させるのはアリ

652 :デフォルトの名無しさん:2012/08/23(木) 03:16:50.91
>>651
usbメモリにアプリとか入れてんの?

664 :デフォルトの名無しさん:2012/08/23(木) 15:30:34.82
onClick内で、TextViewを変更したいのですが、変更がすぐに反映されず困っています
具体的には

public void onClick(View v){
int count = 0;
for(int i=0;i<100;i++){
textView.setText(++count);
}
}

ボタンを押した時にtextViewの内容が1,2,3,4...と次々変わっていくのを期待しているのですが、
実際には一瞬フリーズしたようになった後、100と表示されるだけです

リアルタイムでTextViewの変更を反映させるにはどうすれば良いのでしょうか?

669 :デフォルトの名無しさん:2012/08/23(木) 16:04:27.67
>>664
イベントハンドラの中に時間経過を入れるのはNG。 ANR タイムアウトしてアプリを落とされるぞ。

int i=0;
Runnable a= new Runnable(){
void run(){
textView.setText( ++i );
if( i < 100 ) handler.postDelayed(a,1000);
}
};

onClick(...){
i=0;
a.run();
}

671 :デフォルトの名無しさん:2012/08/23(木) 16:47:10.74
>>651
すみません。定期的にscrollToするとのことですが、
クリックリスナーの中でと言うことでしょうか?
恐れ入ります。

715 :デフォルトの名無しさん:2012/08/25(土) 10:21:13.68
if (canvas == null)
return;
drawA(canvas);
drawB(canvas);
drawC(canvas);


772 :デフォルトの名無しさん:2012/08/26(日) 02:45:53.97
Socket通信するときにCookieを保持させることはできますか?

778 :デフォルトの名無しさん:2012/08/26(日) 10:28:58.53
何をしたいのかもっと正確に書け。
ソケットでやりとりしたcookie(何のcookieかは知らんが)を保持するだけなら
Socket関係なく自分で保持しておけば良い。

782 :デフォルトの名無しさん:2012/08/26(日) 12:19:54.11
なら>>778の通り、そのProxyでHttpMessageからクッキーを取り出して保持しておくんだな。

783 :デフォルトの名無しさん:2012/08/26(日) 12:25:11.38
HTTPヘッダにクッキーを含めればいいだけだろう。
どこに疑問点があるのかさっぱり理解できない。

793 :デフォルトの名無しさん:2012/08/26(日) 18:07:07.88
>>782
取り出して使いたいのではなく持たせた状態で通信 したいんです
String cookie = "cookie=ok; Path=/";
HttpURLConnection http = (HttpURLConnection) url.openConnection();
http.setRequestMethod("GET");
http.setRequestProperty("Cookie", cookie);
http.connect();
こんな感じの接続をMediaPlayerで実現したいんです

>>783
MediaPlayerのHttpヘッダにCookieを含める方法もSocket通のhttp ヘッダにCookieを含める方法もわからないので困っているんです

830 :デフォルトの名無しさん:2012/08/27(月) 21:24:13.39
client.getOutputStream().write("\n".getBytes());

remoetInputStream = connection.getInputStream();
cacheOutputStream = new BufferedOutputStream(new FileOutputStream(
mCacheFile));

byte[] buf = new byte[BUF_SIZE];
int readSize;
while ((readSize = remoetInputStream.read(buf)) != -1 && !bStop) {
if (cacheOutputStream != null) {
try {
cacheOutputStream.write(buf, 0, readSize);
} catch (IOException e) {
Log.e("write cachefile", e);
try {
cacheOutputStream.close();
} catch (IOException ex) {
}
cacheOutputStream = null;
}
}
client.getOutputStream().write(buf, 0, readSize);
}
☆の位置でNullPointerExceptionが発生します
似たようなソースも見てみましたがNullPointerExceptionの対策がされてないようでした
本来はNullPointerExceptionが発生しない箇所なのでしょうか?
もしそうなら原因は何でしょうか?
URLはちゃんと接続できます

833 :デフォルトの名無しさん:2012/08/27(月) 21:59:45.56
>>830
確かgetHeaderFields()が返すMapの中にはキーnullだったか空文字列でレスポンスヘッダの1行目が入ってるような。
HTTPレスポンスは最初の一行目だけKey/Valueペアになっていないのでそのせいかも。
つまりkeyがnullなのは正常かも。

842 :デフォルトの名無しさん:2012/08/27(月) 23:24:12.00
スレチかもしれませんがすいません

Androidのプログラミングは初めてで解説書(やさしいAndroidプログラミング)を読みながらやろうと思ったんですが
「Android Project」ではなく「Android application project」と表示されていたり
Projectの作成してからレイアウトなどが表示されたり開発環境が作成するコードも違っていてなにがなんやらわからないです
何よりも解説書がまったく役に立たないです。

この本ではEclipse3.7でclassic?で作成と書いてあります
私はEclipse Indigoというのを使用しています
Eclipseのバージョンが違うからなのだろうと思い、いろいろ調べてみたのですがよくわかりません
どうすればいいんですかね

860 :デフォルトの名無しさん:2012/08/28(火) 15:10:18.10
教えてください。

スマホのカメラで写真を撮り、保存される時に透過画像に変換される
透過画像をテンプレートの上に重ねて、タッチパネル上で位置修正
といったプログラムって出来ますでしょうか?

http://up2.gembu.org/suck0289.png

894 :デフォルトの名無しさん:2012/08/29(水) 11:05:41.74
カーチャンじゃねぇんだから、いちいち調べて回答してやる義理もねぇだろ
たまたま自分が知ってることで、書くのに手間かからないものしか答える気にならんわ

895 :デフォルトの名無しさん:2012/08/29(水) 11:08:51.83
>>894
それって正しくはこうでしょ

たまたま自分が知ってること=誰でも知ってること
書くのに手間がかからないものしか答えるきにならない=知識が曖昧で簡潔に書けない

918 :デフォルトの名無しさん:2012/08/30(木) 12:47:21.34
それでもIntentがnullで来ることがあるのは変わりなかった気がするが…

919 :デフォルトの名無しさん:2012/08/30(木) 13:55:21.74
AndroidにてSQLiteを利用としています。
データベース操作が初めてなので、どのように行うべきかわかりません。
下記、処理についてどのようにコードで表現すればよいでしょうか?
問題: レコード数が10に達したら、1番目のレコードを削除し、2~10番目のレコードを一つ前にずらし、
最新レコードを10番目のカラム位置にセットする。
これを繰り返す。

宜しくお願い致します。

926 :デフォルトの名無しさん:2012/08/30(木) 14:39:40.58
これ流せばよくね?
delete from sample where id not in (select id from sample order by id desc limit 10);

1001 :1001:Over 1000 Thread
このスレッドは1000を超えました。
もう書けないので、新しいスレッドを立ててくださいです。。。


http://toro.2ch.net/test/read.cgi/tech/1343141095/l50/../人気ブログランキングへ