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

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

Войти
Регистрация
Восстановить пароль
 
MegaSinner
91 / 91 / 3
Регистрация: 09.04.2010
Сообщений: 746
#1

Прога крэшиться при сворачивании(нажатии Home) - Android

13.01.2013, 17:41. Просмотров 901. Ответов 14
Метки нет (Все метки)

Помогите, вот сорец:
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
package com.example;
 
import android.app.Activity;
import android.content.Context;
import android.graphics.*;
import android.os.Bundle;
import android.view.MotionEvent;
import android.view.SurfaceHolder;
import android.view.SurfaceView;
 
import java.util.ArrayList;
 
public class MyActivity extends Activity {
    /**
     * Called when the activity is first created.
     */
    public boolean _run = false;
    Panel pnl;
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        //setContentView(R.layout.main);
        pnl = new Panel(this);
        setContentView(pnl);
    }
    class Panel extends SurfaceView implements SurfaceHolder.Callback {
        private TutorialThread _thread;
 
        public Panel(Context context) {
            super(context);
            getHolder().addCallback(this);
            _thread = new TutorialThread(getHolder(), this);
            setFocusable(true);
        }
 
        @Override
        public boolean onTouchEvent(MotionEvent event) {
            synchronized (_thread.getSurfaceHolder()) {
                if (event.getAction() == MotionEvent.ACTION_MOVE) {
                }
                if (event.getAction() == MotionEvent.ACTION_DOWN) {
                }
                if (event.getAction() == MotionEvent.ACTION_UP) {
                }
                return true;
            }
        }
 
        @Override
        public void onDraw(Canvas canvas) {
            canvas.drawColor(Color.BLACK);
            Paint mPaint = new Paint();
            //int color = 0xaf000000;
            mPaint.setColor(Color.WHITE);
            mPaint.setStrokeWidth(2);
            canvas.drawText("something", 50, 50, mPaint);
        }
 
        @Override
        public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) {
            // TODO Auto-generated method stub
        }
 
        @Override
        public void surfaceCreated(SurfaceHolder holder) {
            _thread.setRunning(true);
            _thread.start();
        }
 
        @Override
        public void surfaceDestroyed(SurfaceHolder holder) {
            // simply copied from sample application LunarLander:
            // we have to tell thread to shut down & wait for it to finish, or else
            // it might touch the Surface after we return and explode
            boolean retry = true;
            _thread.setRunning(false);
            while (retry) {
                try {
                    _thread.join();
                    retry = false;
                } catch (InterruptedException e) {
                    // we will try it again and again...
                }
            }
        }
    }
    class TutorialThread extends Thread {
        private SurfaceHolder _surfaceHolder;
        private Panel _panel;
        //public boolean _run = false;
 
        public TutorialThread(SurfaceHolder surfaceHolder, Panel panel) {
            _surfaceHolder = surfaceHolder;
            _panel = panel;
        }
 
        public void setRunning(boolean run) {
            _run = run;
        }
 
        public SurfaceHolder getSurfaceHolder() {
            return _surfaceHolder;
        }
 
        @Override
        public void run() {
            Canvas c;
            while (_run) {
                try{
                    Thread.sleep(100);
                }catch(Exception x){}
                c = null;
                try {
                    //if(drawn == false)
                    {
                        //]drawn = true;
                        try{
                        c = _surfaceHolder.lockCanvas(null);
                        synchronized (_surfaceHolder) {
                            _panel.onDraw(c);
                        }
                        }catch (Exception cc)
                        {
                            cc.toString();
                        }
                    }
                } finally {
                    // do this in a finally so that if an exception is thrown
                    // during the above, we don't leave the Surface in an
                    // inconsistent state
                    if (c != null) {
                        _surfaceHolder.unlockCanvasAndPost(c);
                    }
                }
                //catch (Exception cx)
                  //      {}
            }
        }
    }
}
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
13.01.2013, 17:41     Прога крэшиться при сворачивании(нажатии Home)
Посмотрите здесь:

Android Действие при нажатии на ссылку
Ошибка при сворачивании Android
Дизайн кнопки при наведении, нажатии Android
Android ListView: сбивается содержимое ImageView элемента при скроллинге + как сделать выделение пункта списка при нажатии?
Android Ошибка при запуске AsyncTask при нажатии на пункт ActionBar
Вылет при нажатии кнопки Android
Android Ошибка при нажатии
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
V0v1k
1158 / 982 / 1
Регистрация: 28.06.2012
Сообщений: 3,462
13.01.2013, 19:46     Прога крэшиться при сворачивании(нажатии Home) #2
смотрите логи.
EVP
319 / 241 / 43
Регистрация: 14.12.2010
Сообщений: 462
13.01.2013, 21:14     Прога крэшиться при сворачивании(нажатии Home) #3
Surface уничтожается при приостановке активности.
Надо проверять её валидность и не рендерить когда прога на паузе.
Пример из книжки:

Кликните здесь для просмотра всего текста
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
package com.example.testproject;
 
import android.os.Bundle;
import android.app.Activity;
import android.content.res.Configuration;
import android.graphics.Bitmap;
import android.graphics.Canvas;
import android.graphics.Rect;
import android.graphics.Bitmap.Config;
import android.view.Menu;
import android.view.SurfaceHolder;
import android.view.SurfaceView;
import android.view.Window;
import android.view.WindowManager;
 
public class MyActivity extends Activity {
    private AndroidFastRenderView renderView;
    
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        
        requestWindowFeature(Window.FEATURE_NO_TITLE);
        getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,
                WindowManager.LayoutParams.FLAG_FULLSCREEN);
        
        boolean isLandscape = getResources().getConfiguration().orientation == Configuration.ORIENTATION_LANDSCAPE;
        int frameBufferWidth = isLandscape ? 480 : 320;
        int frameBufferHeight = isLandscape ? 320 : 480;
        Bitmap frameBuffer = Bitmap.createBitmap(frameBufferWidth,
                frameBufferHeight, Config.RGB_565);
        
        renderView = new AndroidFastRenderView(this, frameBuffer);
        setContentView(renderView);
    }
 
    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        // Inflate the menu; this adds items to the action bar if it is present.
        getMenuInflater().inflate(R.menu.activity_my, menu);
        return true;
    }
    
    @Override
    public void onResume() {
        super.onResume();
        renderView.resume();
    }
    
    @Override
    public void onPause() {
        super.onPause();
        renderView.pause();
    }
 
    class AndroidFastRenderView extends SurfaceView implements Runnable {
        Bitmap framebuffer;
        Canvas canvas;
        
        float color = 0;
        
        Thread renderThread = null;
        SurfaceHolder holder;
        volatile boolean running = false;
        
        public AndroidFastRenderView(Activity game, Bitmap framebuffer) {
            super(game);
            this.framebuffer = framebuffer;
            this.canvas = new Canvas(framebuffer);
            this.holder = getHolder();
        }
 
        public void resume() { 
            running = true;
            renderThread = new Thread(this);
            renderThread.start();         
        }
        
        private void update(float deltaTime)
        {
            int w = framebuffer.getWidth();
            int h = framebuffer.getHeight();
            color += 0.2f *deltaTime;
            if (color > 1)
                color = 0;
            int c = (int)(255*color);
            canvas.drawARGB(255, c, c, c);
        }
        
        public void run() {
            Rect dstRect = new Rect();
            long startTime = System.nanoTime();
            while(running) {  
                if(!holder.getSurface().isValid())
                    continue;           
                
                float deltaTime = (System.nanoTime()-startTime) / 1000000000.0f;
                startTime = System.nanoTime();
 
                update(deltaTime);
                
                Canvas canvas = holder.lockCanvas();
                canvas.getClipBounds(dstRect);
                canvas.drawBitmap(framebuffer, null, dstRect, null);                           
                holder.unlockCanvasAndPost(canvas);
            }
        }
 
        public void pause() {                        
            running = false;
            while(true) {
                try {
                    renderThread.join();
                    break;
                } catch (InterruptedException e) {
                    // retry
                }
            }
        }        
    }
}
MegaSinner
91 / 91 / 3
Регистрация: 09.04.2010
Сообщений: 746
13.01.2013, 22:52  [ТС]     Прога крэшиться при сворачивании(нажатии Home) #4
Добавил
Java
1
2
 if(!_surfaceHolder.getSurface().isValid())
                    continue;
в Run - не помогло друззя мои, крэшится при разворачивании...

Добавлено через 7 минут
Не знаю как продебагать такое...
V0v1k
1158 / 982 / 1
Регистрация: 28.06.2012
Сообщений: 3,462
13.01.2013, 22:58     Прога крэшиться при сворачивании(нажатии Home) #5
логи смотрите говорю.
MegaSinner
91 / 91 / 3
Регистрация: 09.04.2010
Сообщений: 746
14.01.2013, 00:33  [ТС]     Прога крэшиться при сворачивании(нажатии Home) #6
Цитата Сообщение от V0v1k Посмотреть сообщение
логи смотрите говорю.
где и как? Среда - Intelij IDEA.
V0v1k
1158 / 982 / 1
Регистрация: 28.06.2012
Сообщений: 3,462
14.01.2013, 00:51     Прога крэшиться при сворачивании(нажатии Home) #7
в IDEA не знаю, но это первый вопрос который вы должны были выяснить.
tester3000
4 / 4 / 0
Регистрация: 19.10.2012
Сообщений: 33
14.01.2013, 04:14     Прога крэшиться при сворачивании(нажатии Home) #8
MegaSinner, Shift-F9 внизу после запуска будет вкладка Logсat
Salty_Sugar
26 / 26 / 1
Регистрация: 02.04.2012
Сообщений: 140
14.01.2013, 05:31     Прога крэшиться при сворачивании(нажатии Home) #9
MegaSinner, там внизу после запуска выйдет меню. Еще ниже будут вкладки "Run", "Debug", "TODO", "Android".
Переключись на вкладку "Android". Красным цветом будут выделены ошибки. Если будет трудно ориентироваться можно в поиске вбить название вашего пакета или приложения.
MegaSinner
91 / 91 / 3
Регистрация: 09.04.2010
Сообщений: 746
14.01.2013, 19:13  [ТС]     Прога крэшиться при сворачивании(нажатии Home) #10
Пасибо, нашел, буду раздупляться...

Добавлено через 3 часа 40 минут
В логах значит:
FATAL EXCEPTION: main
java.lang.IllegalThreadStateException: Thread already started.
Я так понял поток уже создан. Что мне с этим делать, как пофиксить?

Добавлено через 46 минут
Не удается повторно запустить поток
V0v1k
1158 / 982 / 1
Регистрация: 28.06.2012
Сообщений: 3,462
14.01.2013, 19:33     Прога крэшиться при сворачивании(нажатии Home) #11
а зачем запускать уже запущенный поток?
MegaSinner
91 / 91 / 3
Регистрация: 09.04.2010
Сообщений: 746
14.01.2013, 20:13  [ТС]     Прога крэшиться при сворачивании(нажатии Home) #12
Он приостанавливается при нажатии HOME. Поменял while (_run) на while (true) и добавил If(_run), чтобы цикл был вечным. Метод OnResume() не вызывается при разворачивании, пробовал вручную поменять значение _run на тру - получил NullPointerException на 124 строке..
EVP
319 / 241 / 43
Регистрация: 14.12.2010
Сообщений: 462
14.01.2013, 20:54     Прога крэшиться при сворачивании(нажатии Home) #13
В твоём примере поместить 32 строчку перед 66-ой.
Метод onResume() возвращает с паузы (см. Activity Lifecycle).
MegaSinner
91 / 91 / 3
Регистрация: 09.04.2010
Сообщений: 746
14.01.2013, 23:46  [ТС]     Прога крэшиться при сворачивании(нажатии Home) #14
Помогло, как я раньше не додумался..
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
14.01.2013, 23:59     Прога крэшиться при сворачивании(нажатии Home)
Еще ссылки по теме:

Android Ошибка при нажатии на кнопку
Android Canvas-игра. Вылет при сворачивании
Как закрыть приложение при нажатии кнопки back или home? Basic4Android
Действие при сворачивании или при выходе Android
При сворачивании приложения, останавливается радио Android

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

Или воспользуйтесь поиском по форуму:
V0v1k
1158 / 982 / 1
Регистрация: 28.06.2012
Сообщений: 3,462
14.01.2013, 23:59     Прога крэшиться при сворачивании(нажатии Home) #15
просто нельзя дважды запустить один инстанс потока, даже если остановили.


Цитата Сообщение от MegaSinner Посмотреть сообщение
Метод OnResume() не вызывается при разворачивании
должен вызываться.

Добавлено через 57 секунд
Цитата Сообщение от EVP Посмотреть сообщение
Метод onResume() возвращает с паузы (см. Activity Lifecycle).
вот и почитайте когда вызывается onPause
Yandex
Объявления
14.01.2013, 23:59     Прога крэшиться при сворачивании(нажатии Home)
Ответ Создать тему
Опции темы

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