1

ユーザーがボタンをクリックしたときにアクティビティを実行しようとしていますが、アクティビティは着信音の音量に応じて画像を表示します。何らかの理由で実行すると、機能しません。助けていただければ幸いです。

private void show() {
    AudioManager am=(AudioManager)this.getSystemService(AUDIO_SERVICE);
    mode=am.getRingerMode();
    switch(mode){
    case AudioManager.RINGER_MODE_NORMAL:
    try{

        tv.setBackground(this.getResources().getDrawable(R.drawable.a1));
        Thread.sleep(1000);

        tv.setBackground(this.getResources().getDrawable(R.drawable.a2));
        Thread.sleep(1000);

        tv.setBackground(this.getResources().getDrawable(R.drawable.a3));
        Thread.sleep(1000);

        tv.setBackground(this.getResources().getDrawable(R.drawable.a31));
        Thread.sleep(1000);

        tv.setBackground(this.getResources().getDrawable(R.drawable.a4));
        Thread.sleep(1000);

        tv.setBackground(this.getResources().getDrawable(R.drawable.a5));
        Thread.sleep(1000);

        tv.setBackground(this.getResources().getDrawable(R.drawable.a6));
        Thread.sleep(1000);

        tv.setBackground(this.getResources().getDrawable(R.drawable.a7));
        Thread.sleep(1000);

    } catch (InterruptedException e) {
            e.printStackTrace();
        }

    break;
    case AudioManager.RINGER_MODE_SILENT:
    case AudioManager.RINGER_MODE_VIBRATE:

        try{

            tv.setBackground(this.getResources().getDrawable(R.drawable.a7));
            Thread.sleep(1000);

            tv.setBackground(this.getResources().getDrawable(R.drawable.a6));
            Thread.sleep(1000);

            tv.setBackground(this.getResources().getDrawable(R.drawable.a5));
            Thread.sleep(1000);

            tv.setBackground(this.getResources().getDrawable(R.drawable.a4));
            Thread.sleep(1000);

            tv.setBackground(this.getResources().getDrawable(R.drawable.a31));
            Thread.sleep(1000);

            tv.setBackground(this.getResources().getDrawable(R.drawable.a3));
            Thread.sleep(1000);

            tv.setBackground(this.getResources().getDrawable(R.drawable.a2));
            Thread.sleep(1000);

            tv.setBackground(this.getResources().getDrawable(R.drawable.a1));
            Thread.sleep(1000);

        } catch (InterruptedException e) {
                e.printStackTrace();
            }


    }

}

ログには次のように書かれています -

09-19 09:12:54.656: W/dalvikvm(555): threadid=1: thread exiting with uncaught exception (group=0x409c01f8)
09-19 09:12:54.696: E/AndroidRuntime(555): FATAL EXCEPTION: main
09-19 09:12:54.696: E/AndroidRuntime(555): java.lang.OutOfMemoryError
09-19 09:12:54.696: E/AndroidRuntime(555):  at android.graphics.Bitmap.nativeCreate(Native Method)
09-19 09:12:54.696: E/AndroidRuntime(555):  at android.graphics.Bitmap.createBitmap(Bitmap.java:605)
09-19 09:12:54.696: E/AndroidRuntime(555):  at android.graphics.Bitmap.createBitmap(Bitmap.java:551)
09-19 09:12:54.696: E/AndroidRuntime(555):  at android.graphics.Bitmap.createScaledBitmap(Bitmap.java:437)
09-19 09:12:54.696: E/AndroidRuntime(555):  at android.graphics.BitmapFactory.finishDecode(BitmapFactory.java:524)
09-19 09:12:54.696: E/AndroidRuntime(555):  at android.graphics.BitmapFactory.decodeStream(BitmapFactory.java:499)
09-19 09:12:54.696: E/AndroidRuntime(555):  at android.graphics.BitmapFactory.decodeResourceStream(BitmapFactory.java:351)
09-19 09:12:54.696: E/AndroidRuntime(555):  at android.graphics.drawable.Drawable.createFromResourceStream(Drawable.java:773)
09-19 09:12:54.696: E/AndroidRuntime(555):  at android.content.res.Resources.loadDrawable(Resources.java:1935)
09-19 09:12:54.696: E/AndroidRuntime(555):  at android.content.res.Resources.getDrawable(Resources.java:664)
09-19 09:12:54.696: E/AndroidRuntime(555):  at Sarath.app.SilencePlzz.Androidzip.show(Androidzip.java:75)
09-19 09:12:54.696: E/AndroidRuntime(555):  at Sarath.app.SilencePlzz.Androidzip.onResume(Androidzip.java:28)
09-19 09:12:54.696: E/AndroidRuntime(555):  at android.app.Instrumentation.callActivityOnResume(Instrumentation.java:1154)
09-19 09:12:54.696: E/AndroidRuntime(555):  at android.app.Activity.performResume(Activity.java:4539)
09-19 09:12:54.696: E/AndroidRuntime(555):  at android.app.ActivityThread.performResumeActivity(ActivityThread.java:2434)
09-19 09:12:54.696: E/AndroidRuntime(555):  at android.app.ActivityThread.handleResumeActivity(ActivityThread.java:2472)
09-19 09:12:54.696: E/AndroidRuntime(555):  at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:1986)
09-19 09:12:54.696: E/AndroidRuntime(555):  at android.app.ActivityThread.access$600(ActivityThread.java:123)
09-19 09:12:54.696: E/AndroidRuntime(555):  at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1147)
09-19 09:12:54.696: E/AndroidRuntime(555):  at android.os.Handler.dispatchMessage(Handler.java:99)
09-19 09:12:54.696: E/AndroidRuntime(555):  at android.os.Looper.loop(Looper.java:137)
09-19 09:12:54.696: E/AndroidRuntime(555):  at android.app.ActivityThread.main(ActivityThread.java:4424)
09-19 09:12:54.696: E/AndroidRuntime(555):  at java.lang.reflect.Method.invokeNative(Native Method)
09-19 09:12:54.696: E/AndroidRuntime(555):  at java.lang.reflect.Method.invoke(Method.java:511)
09-19 09:12:54.696: E/AndroidRuntime(555):  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:784)
09-19 09:12:54.696: E/AndroidRuntime(555):  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:551)
09-19 09:12:54.696: E/AndroidRuntime(555):  at dalvik.system.NativeStart.main(Native Method)
4

5 に答える 5

2

画像を効率的にロードする必要があります。サンプルを確認できます

ビットマップのメモリ不足エラー

http://developer.android.com/training/displaying-bitmaps/load-bitmap.html

適切なデコード方法を使用して画像を縮小します

http://developer.android.com/reference/android/graphics/BitmapFactory.html

Android 2.3.3 (API レベル 10) 以下では、使用がrecycle()推奨されます。アプリで大量のビットマップ データを表示している場合、OutOfMemoryError エラーが発生する可能性があります。recycle() メソッドを使用すると、アプリはできるだけ早くメモリを再利用できます。

Android 3.0 (API レベル 11)ではBitmapFactory.Options.inBitmapフィールドが導入されています。このオプションが設定されている場合、Options オブジェクトを受け取るデコード メソッドは、コンテンツをロードするときに既存のビットマップを再利用しようとします。これは、ビットマップのメモリが再利用されることを意味し、パフォーマンスが向上し、メモリの割り当てと割り当て解除の両方が削除されます。

詳細については、以下のリンクを確認してください

http://developer.android.com/training/displaying-bitmaps/manage-memory.html

また、UIスレッドをブロックするUIスレッドでスリープを呼び出しています。UI スレッドで sleep を呼び出さないでください。ANR が発生する可能性があります。

http://developer.android.com/training/articles/perf-anr.html

于 2013-09-19T04:07:53.083 に答える
0

メインスレッドでこれをやっていますか?その場合、アプリケーションが応答しないというダイアログが表示されるため、避けてください。画像を効果的に読み込む方法についての美しいドキュメントがあります。このリンクを読んでください

于 2013-09-19T04:07:17.677 に答える
0

以下のコードを使用して、画像を画像ビューに設定します。

BitmapFactory.Options options = new BitmapFactory.Options();
options.inSampleSize = 4;
Bitmap bitmap = BitmapFactory.decodeResource(getResources(),R.drawable.a1,options);
// Then set this bitmap to your imageview
tv.setImageBitmap(bitmap);

inSampleSize 4 でデコードされた解像度 2048x1536 の画像は、約 512x384 のビットマップを生成します。これをメモリにロードすると、画像全体に 12MB ではなく 0.75MB が使用されます (ARGB_8888 のビットマップ構成を想定)。

于 2013-09-19T04:19:07.333 に答える
0

実際、ほとんどの場合、画像を使用しています。andorid では、イメージはビットマップによって処理されるため、イメージを変更するたびにビットマップ オブジェクトが作成されるため、これらのビットマップはより多くの「ヒープ メモリ」を消費します。したがって、java.lang.OutOfMemoryError 例外を回避するには、「オブジェクト プーリング メソッド」を使用する必要があります。

オブジェクトプーリングを作成する方法のリンクは次のとおりです。

リンク: http://www.devahead.com/blog/2011/12/recycling-objects-in-android-with-an-object-pool-to-avoid-garbage-collection/

于 2013-09-19T04:55:19.377 に答える
0

メモリに収まらない大きすぎるビットマップを使用しています 。最初にサイズを変更してみてください。さらに、UI スレッドで Thread.sleep() を使用しないでください。これは UX が悪いためです。

于 2013-09-19T04:11:47.627 に答える