Форум программистов, компьютерный форум CyberForum.ru

Программирование Android

Войти
Регистрация
Восстановить пароль
 
Stylish2013
7 / 7 / 1
Регистрация: 20.04.2013
Сообщений: 666
#1

Вылет приложения при использования бокового меню. О чем говорят логи - Android

14.10.2013, 20:20. Просмотров 709. Ответов 6
Метки нет (Все метки)

Помогите разобраться с ошибкой при работе с боковым меню. В лог выводит следующую информацию:

Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
10-14 19:14:05.209: D/AndroidRuntime(20524): Shutting down VM
10-14 19:14:05.209: W/dalvikvm(20524): threadid=1: thread exiting with uncaught exception (group=0x40018578)
10-14 19:14:05.219: E/AndroidRuntime(20524): FATAL EXCEPTION: main
10-14 19:14:05.219: E/AndroidRuntime(20524): java.lang.RuntimeException: Canvas: trying to use a recycled bitmap android.graphics.Bitmap@40643ab8
10-14 19:14:05.219: E/AndroidRuntime(20524):    at android.graphics.Canvas.throwIfRecycled(Canvas.java:955)
10-14 19:14:05.219: E/AndroidRuntime(20524):    at android.graphics.Canvas.drawBitmap(Canvas.java:1044)
10-14 19:14:05.219: E/AndroidRuntime(20524):    at android.graphics.drawable.BitmapDrawable.draw(BitmapDrawable.java:325)
10-14 19:14:05.219: E/AndroidRuntime(20524):    at android.widget.ImageView.onDraw(ImageView.java:854)
10-14 19:14:05.219: E/AndroidRuntime(20524):    at android.view.View.draw(View.java:6880)
10-14 19:14:05.219: E/AndroidRuntime(20524):    at android.view.ViewGroup.drawChild(ViewGroup.java:1646)
10-14 19:14:05.219: E/AndroidRuntime(20524):    at android.view.ViewGroup.dispatchDraw(ViewGroup.java:1373)
10-14 19:14:05.219: E/AndroidRuntime(20524):    at android.view.ViewGroup.drawChild(ViewGroup.java:1644)
10-14 19:14:05.219: E/AndroidRuntime(20524):    at android.view.ViewGroup.dispatchDraw(ViewGroup.java:1373)
10-14 19:14:05.219: E/AndroidRuntime(20524):    at android.view.View.draw(View.java:6883)
10-14 19:14:05.219: E/AndroidRuntime(20524):    at android.widget.FrameLayout.draw(FrameLayout.java:357)
10-14 19:14:05.219: E/AndroidRuntime(20524):    at android.view.ViewGroup.drawChild(ViewGroup.java:1646)
10-14 19:14:05.219: E/AndroidRuntime(20524):    at android.view.ViewGroup.dispatchDraw(ViewGroup.java:1373)
10-14 19:14:05.219: E/AndroidRuntime(20524):    at android.view.View.draw(View.java:6883)
10-14 19:14:05.219: E/AndroidRuntime(20524):    at android.widget.FrameLayout.draw(FrameLayout.java:357)
10-14 19:14:05.219: E/AndroidRuntime(20524):    at com.android.internal.policy.impl.PhoneWindow$DecorView.draw(PhoneWindow.java:1921)
10-14 19:14:05.219: E/AndroidRuntime(20524):    at android.view.ViewRoot.draw(ViewRoot.java:1528)
10-14 19:14:05.219: E/AndroidRuntime(20524):    at android.view.ViewRoot.performTraversals(ViewRoot.java:1264)
10-14 19:14:05.219: E/AndroidRuntime(20524):    at android.view.ViewRoot.handleMessage(ViewRoot.java:1866)
10-14 19:14:05.219: E/AndroidRuntime(20524):    at android.os.Handler.dispatchMessage(Handler.java:99)
10-14 19:14:05.219: E/AndroidRuntime(20524):    at android.os.Looper.loop(Looper.java:130)
10-14 19:14:05.219: E/AndroidRuntime(20524):    at android.app.ActivityThread.main(ActivityThread.java:3687)
10-14 19:14:05.219: E/AndroidRuntime(20524):    at java.lang.reflect.Method.invokeNative(Native Method)
10-14 19:14:05.219: E/AndroidRuntime(20524):    at java.lang.reflect.Method.invoke(Method.java:507)
10-14 19:14:05.219: E/AndroidRuntime(20524):    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:867)
10-14 19:14:05.219: E/AndroidRuntime(20524):    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:625)
10-14 19:14:05.219: E/AndroidRuntime(20524):    at dalvik.system.NativeStart.main(Native Method)
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
14.10.2013, 20:20     Вылет приложения при использования бокового меню. О чем говорят логи
Посмотрите здесь:

Вылет приложения при работе с jsoup Android
Android Вылет приложения из-за android:background
Непонятный вылет приложения при установки значения в NumberPicker Android
Вылет при нажатии кнопки Android
Запуск Activity из "бокового меню" Android
Android Ошибка при создании бокового меню. Navigation Drawer
Android Canvas-игра. Вылет при сворачивании
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
korsaj
148 / 117 / 9
Регистрация: 16.08.2013
Сообщений: 508
14.10.2013, 20:51     Вылет приложения при использования бокового меню. О чем говорят логи #2
http://stackoverflow.com/questions/1...bitmap-android
Stylish2013
7 / 7 / 1
Регистрация: 20.04.2013
Сообщений: 666
14.10.2013, 21:10  [ТС]     Вылет приложения при использования бокового меню. О чем говорят логи #3
немного не подходи к моей проблеме, может вы разберетесь вот код:

Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
package com.korovyansk.android.slideout;
 
import android.app.Activity;
import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.Rect;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.ViewGroup;
import android.view.Window;
import android.view.WindowManager;
import android.view.animation.Animation;
import android.view.animation.Animation.AnimationListener;
import android.view.animation.TranslateAnimation;
import android.widget.ImageView;
import android.widget.RelativeLayout.LayoutParams;
 
public class SlideoutHelper {
 
    private static Bitmap sCoverBitmap = null;
    private static int sWidth = -1;
 
    public static void prepare(Activity activity, int id, int width) {
        if (sCoverBitmap != null) {
            sCoverBitmap.recycle();
        }
        Rect rectgle = new Rect();
        Window window = activity.getWindow();
        window.getDecorView().getWindowVisibleDisplayFrame(rectgle);
        int statusBarHeight = rectgle.top;
 
        ViewGroup v1 = (ViewGroup) activity.findViewById(id).getRootView();
        v1.setDrawingCacheEnabled(true);
        Bitmap source = Bitmap.createBitmap(v1.getDrawingCache());
        v1.setDrawingCacheEnabled(false);
        if (statusBarHeight != 0) {
            sCoverBitmap = Bitmap.createBitmap(source, 0, statusBarHeight, source.getWidth(), source.getHeight() - statusBarHeight);
            source.recycle(); 
            
        } else {
            sCoverBitmap = source;
        }
        sWidth = width;
    }
 
    public SlideoutHelper(Activity activity) {
        this(activity, false);
    }
    
    public SlideoutHelper(Activity activity, boolean reverse) {
        mActivity = activity;
        mReverse = reverse;
    }
 
    public void activate() {
        mActivity.setContentView(R.layout.slideout);
        mCover = (ImageView) mActivity.findViewById(R.id.slidedout_cover);
        mCover.setImageBitmap(sCoverBitmap);
        mCover.setOnClickListener(new OnClickListener() {
            @Override
            public void onClick(View v) {
                close();
            }
        });
        int x = (int) (sWidth * 1.2f);
        if (mReverse) {
            @SuppressWarnings("deprecation")
            final android.widget.AbsoluteLayout.LayoutParams lp = new android.widget.AbsoluteLayout.LayoutParams(LayoutParams.FILL_PARENT, LayoutParams.FILL_PARENT, x, 0);
            mActivity.findViewById(R.id.slideout_placeholder).setLayoutParams(lp);
        } else{
            @SuppressWarnings("deprecation")
            final android.widget.AbsoluteLayout.LayoutParams lp = new android.widget.AbsoluteLayout.LayoutParams(LayoutParams.FILL_PARENT, LayoutParams.FILL_PARENT, 0, 0);
            mActivity.findViewById(R.id.slideout_placeholder).setLayoutParams(lp);
        }
        initAnimations();
    }
 
    public void open() {
        mCover.startAnimation(mStartAnimation);
    }
 
    public void close() {
        mCover.startAnimation(mStopAnimation);
    }
 
    protected void initAnimations() {
        int displayWidth = ((WindowManager) mActivity.getSystemService(Context.WINDOW_SERVICE)).getDefaultDisplay().getWidth();
        final int shift = (mReverse ? -1 : 1) * (sWidth - displayWidth);
        mStartAnimation = new TranslateAnimation(
                TranslateAnimation.ABSOLUTE, 0,
                TranslateAnimation.ABSOLUTE, -shift,
                TranslateAnimation.ABSOLUTE, 0,
                TranslateAnimation.ABSOLUTE, 0
                );
 
        mStopAnimation = new TranslateAnimation(
                TranslateAnimation.ABSOLUTE, 0,
                TranslateAnimation.ABSOLUTE, shift,
                TranslateAnimation.ABSOLUTE, 0,
                TranslateAnimation.ABSOLUTE, 0
                );
        mStartAnimation.setDuration(DURATION_MS);
        mStartAnimation.setFillAfter(true);
        mStartAnimation.setAnimationListener(new AnimationListener() {
 
            @Override
            public void onAnimationStart(Animation animation) {
            }
 
            @Override
            public void onAnimationRepeat(Animation animation) {
            }
 
            @Override
            public void onAnimationEnd(Animation animation) {
                mCover.setAnimation(null);
                @SuppressWarnings("deprecation")
                final android.widget.AbsoluteLayout.LayoutParams lp = new android.widget.AbsoluteLayout.LayoutParams(LayoutParams.FILL_PARENT, LayoutParams.FILL_PARENT, -shift, 0);
                mCover.setLayoutParams(lp);
            }
        });
 
        mStopAnimation.setDuration(DURATION_MS);
        mStopAnimation.setFillAfter(true);
        mStopAnimation.setAnimationListener(new AnimationListener() {
 
            @Override
            public void onAnimationStart(Animation animation) {
            }
 
            @Override
            public void onAnimationRepeat(Animation animation) {
            }
 
            @Override
            public void onAnimationEnd(Animation animation) {
                mActivity.finish();
                mActivity.overridePendingTransition(0, 0);
            }
        });
    }
 
    private static final int DURATION_MS = 400;
    private ImageView mCover;
    private Activity mActivity;
    private boolean mReverse = false;
    private Animation mStartAnimation;
    private Animation mStopAnimation;
}
verylazy
Заблокирован
14.10.2013, 21:38     Вылет приложения при использования бокового меню. О чем говорят логи #4
имхо
вот эти строки там совсем лишние
Java
1
2
3
if (sCoverBitmap != null) {
            sCoverBitmap.recycle();
        }
Stylish2013
7 / 7 / 1
Регистрация: 20.04.2013
Сообщений: 666
14.10.2013, 21:45  [ТС]     Вылет приложения при использования бокового меню. О чем говорят логи #5
Цитата Сообщение от verylazy Посмотреть сообщение
имхо
вот эти строки там совсем лишние
Да если это закаментить, то приложение не крашится. Но а вы можете объяснить почему они лишние? и не будет ли утечки памяти без них?
verylazy
Заблокирован
14.10.2013, 22:03     Вылет приложения при использования бокового меню. О чем говорят логи #6
http://developer.android.com/trainin...ge-memory.html
Caution: You should use recycle() only when you are sure that the bitmap is no longer being used. If you call recycle() and later attempt to draw the bitmap, you will get the error: "Canvas: trying to use a recycled bitmap".
Его нужно вызывать когда уже картинка совсем не будет нужна. Я недели две возился с Out of Memory, а потом стал вызывать этот метод только тогда, когда надо сменить битмап на вьюшке. То есть создается новый объект Bitmap, который потом назначается ImageView например. При этом переменная сама-то остается. Я не пейсатель, не могу четче объяснить

Добавлено через 8 минут
я сейчас не за своим компьютером, не могу пример рабочий скопировать, что бы показать разницу, но своими словами примерно так, псевдокод:
Bitmap b;
b = new Bitmap();
view.setBitmap(b);
b = Bitmap.createBitmap(bla-bla-bla);
view.setBitmap(b); \\атата, имхо так будет утечка, перед этой строкой надо бы вызвать recycle()
как-то так
view.getDrawable().getBitmap().recycle();
не отвечаю за правильность последней строки, но идея в том, что мы делаем recycle примененному на вьюшку битмапу, не переменной b
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
18.10.2013, 17:20     Вылет приложения при использования бокового меню. О чем говорят логи
Еще ссылки по теме:

Android Меню выбора на фоне запущенной камеры при старте приложения?
Как посмотреть логи мобильного приложения Вконтакте? Android
Вылет приложения с MediaPlayer Android
Вылет при фотографировании Android
Android Не выводятся логи приложения на некоторых устройствах

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
Stylish2013
7 / 7 / 1
Регистрация: 20.04.2013
Сообщений: 666
18.10.2013, 17:20  [ТС]     Вылет приложения при использования бокового меню. О чем говорят логи #7
Цитата Сообщение от verylazy Посмотреть сообщение
имхо
вот эти строки там совсем лишние

if (sCoverBitmap != null) {
* * * * * * sCoverBitmap.recycle();
* * * * }

А если это закаментить и работать, так можно? или нужно в другом месте где-то этот код использовать, что очищать bitmap?
Yandex
Объявления
18.10.2013, 17:20     Вылет приложения при использования бокового меню. О чем говорят логи
Ответ Создать тему
Опции темы

Текущее время: 04:01. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru