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

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

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

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

13.01.2013, 17:41. Просмотров 918. Ответов 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)
                  //      {}
            }
        }
    }
}
0
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
13.01.2013, 17:41
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Прога крэшиться при сворачивании(нажатии Home) (Программирование Android):

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

Ошибка при сворачивании - Программирование Android
При сворачивании приложения (например при нажатии кнопки home) выходит сообщение "В приложении "narrator" произошла ошибка". Как исправить?...

Canvas-игра. Вылет при сворачивании - Программирование Android
public class GameView extends SurfaceView { private GameThread mThread; SurfaceHolder holder; Bitmap fon =...

При сворачивании приложения, останавливается радио - Программирование Android
Здравствуйте. у меня есть фрагмент, в котором при нажатии на play играет радио, когда я сворачиваю приложение, то останавливается радио....

Ошибка при запуске AsyncTask при нажатии на пункт ActionBar - Программирование Android
Здравствуйте, почему при нажатии на пункт Action Bar'а вылетает ошибка? @Override public boolean onCreateOptionsMenu(Menu menu)...

ListView: сбивается содержимое ImageView элемента при скроллинге + как сделать выделение пункта списка при нажатии? - Программирование Android
1. Есть свой класс ContactsSimpleCursorAdapter, в методе public void bindView(View view, Context context, Cursor c) которого происходит...

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
V0v1k
1158 / 982 / 1
Регистрация: 28.06.2012
Сообщений: 3,462
13.01.2013, 19:46 #2
смотрите логи.
0
EVP
322 / 244 / 43
Регистрация: 14.12.2010
Сообщений: 465
13.01.2013, 21:14 #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
                }
            }
        }        
    }
}
0
MegaSinner
91 / 91 / 3
Регистрация: 09.04.2010
Сообщений: 746
13.01.2013, 22:52  [ТС] #4
Добавил
Java
1
2
 if(!_surfaceHolder.getSurface().isValid())
                    continue;
в Run - не помогло друззя мои, крэшится при разворачивании...

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

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

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


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

Добавлено через 57 секунд
Цитата Сообщение от EVP Посмотреть сообщение
Метод onResume() возвращает с паузы (см. Activity Lifecycle).
вот и почитайте когда вызывается onPause
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
14.01.2013, 23:59
Привет! Вот еще темы с ответами:

Как закрыть приложение при нажатии кнопки back или home? - Basic4Android
Добрый день уважаемые! Помогите с написанием кода. Мне необходимо, что бы при нажатии кнопок back и home, мое приложение закрывалось. Как...

Запуск приложения при трехкратном нажатии кнопки Home - Objective-C
Добрый день! Есть ли возможность запустить приложение (на iPhone) при трехкратном нажатии кнопки Home? Ну или как нибудь, например при...

Нарисованное стирается при сворачивании формы и при изменении ее размеров - C#
Здравствуйте, пишу программу, которая рисует линию. Будьте добры, помогите с событием Paint, которое должно перерисовывать линии, если...

Съедается фон при сворачивании - HTML, CSS
Добрый день. Возникла такая проблема: при изменении размера окна на сайте alfalservice.ru "съедается" фон, который выходит за границы...


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

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

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