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

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

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

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

14.10.2013, 20:20. Просмотров 738. Ответов 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
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Вылет приложения при использования бокового меню. О чем говорят логи (Программирование Android):

Ошибка при создании бокового меню. Navigation Drawer - Программирование Android
Суть в чем. Делал по уроку. Там создавался класс. Например menu1 menu 2 и т.д и лейауты к ним( menu_layout1, menu_layout2 и т.д) я...

Вылет приложения при работе с jsoup - Программирование Android
приложение вылетает на строках : String html = "<html>Some html text</html>"; Document doc = Jsoup.parse(html);либу пробовал по разному...

Непонятный вылет приложения при установки значения в NumberPicker - Программирование Android
Доброго времени суток. Никак не получается не передать значение, ни получить значения NumberPicker. Программа вылетает при нажатии на...

Вылет приложения при запуске после загрузки шрифта - Программирование Android
Android Studio 2.3 В папке \app\src\main\ (рядом с манифестом) создал папку assets\fonts и положил файл ds-digit.TTF При добавлении...

Вылет приложения с MediaPlayer - Программирование Android
Использую один MediaPlayer. Даю ему разный звук при нажатии на каждую из 5 кнопок вот так: @Override public void...

Вылет приложения из-за android:background - Программирование Android
Доброго времени суток. Прошу помощи вот в чем: Приложение состоит из нескольких активити, из главного можно перейти на одно из двух...

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
korsaj
148 / 117 / 9
Регистрация: 16.08.2013
Сообщений: 510
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
Stylish2013
7 / 7 / 1
Регистрация: 20.04.2013
Сообщений: 666
18.10.2013, 17:20  [ТС] #7
Цитата Сообщение от verylazy Посмотреть сообщение
имхо
вот эти строки там совсем лишние

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

А если это закаментить и работать, так можно? или нужно в другом месте где-то этот код использовать, что очищать bitmap?
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
18.10.2013, 17:20
Привет! Вот еще темы с ответами:

Вылет приложения сделанного на Android Studio - Программирование Android
Здравствуйте! Создал проект на AndroidStudio, создал apk. Скинул на телефон, установил... При запуске программы, она тут же закрывается и...

Запуск Activity из "бокового меню" - Программирование Android
Всем привет! У меня возник небольшой вопрос. Я создал боковое меню. И в этом боковом меню есть элементы. Как мне сделать так, чтобы при...

Не выводятся логи приложения на некоторых устройствах - Программирование Android
Пишу приложение для Android. Из тех устройств, что доступны мне для тестирования, 2 смартфона не выводят мои логи в logcat при отладке....

Как посмотреть логи мобильного приложения Вконтакте? - Программирование Android
Здравствуйте, подскажите пожалуйста можно ли как то посмотреть логи или журналы пользования, выхода в интернет, в мобильным приложением...


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

Или воспользуйтесь поиском по форуму:
Yandex
Объявления
18.10.2013, 17:20
Ответ Создать тему
Опции темы

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