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 线程上调用 sleep 会阻塞 ui 线程。您不应该在 ui 线程上调用 sleep 。你可能会得到 ANR。

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

于 2013-09-19T04:07:53.083 回答
0

实际上,您大部分时间都在使用图像。在 andorid 中,图像是由 Bitmap 处理的,因此这些位图会消耗更多的“堆内存”,因为每次更改图像时都会创建更多的位图对象。所以我们必须使用“对象池方法”来避免 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

您是在主线程中执行此操作吗?如果是这样,请避免,因为它会导致应用程序没有响应对话框。有关于如何有效加载图像的漂亮文档。请阅读此链接

于 2013-09-19T04:07:17.677 回答
0

您正在使用不适合内存的太大位图,请先尝试对其进行缩放 。另外避免在 UI 线程中使用 Thread.sleep(),这是不好的 UX。

于 2013-09-19T04:11:47.627 回答
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 的位图。将其加载到内存中使用 0.75MB 而不是 12MB 的完整图像(假设位图配置为 ARGB_8888)。

于 2013-09-19T04:19:07.333 回答