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

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

Войти
Регистрация
Восстановить пароль
 
metrolog
4 / 4 / 0
Регистрация: 18.11.2012
Сообщений: 101
#1

Ошибка в SurfaceView - Программирование Android

13.04.2013, 23:16. Просмотров 982. Ответов 4
Метки нет (Все метки)

есть игра.
отрисовка идет через SurfaceView и поток привязанный к нему.
ошибка возникает в следующем моменте - я открываю сам игровой поток, все нормально работает, скрываю приложение и когда я снова его открываю выходит ошибка.

логи прикрепил.

это код конструктора класса отрисовки
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
public Game(Context context, AttributeSet attributeSet) {
        super(context, attributeSet);
            play = false;
        potok = new  Thread1(this);
            holder = getHolder();
            setFocusable(true);
            holder.addCallback(new SurfaceHolder.Callback()
            {
              public void surfaceDestroyed(SurfaceHolder holder)
                  {
                 Log.d(LOG_TAG, "удаление");
                      boolean retry = true;
                      potok.setRunning(false);
                      pos.clear();
                     
                       while (retry) {
                               try {
                                   potok.join();
                                     retry = false;
                               } catch (InterruptedException e) {
                               }
                        }
                  }
@Override
                  public void surfaceCreated(SurfaceHolder holder) 
                  {
    loadbitmap();
     Log.d(LOG_TAG, "создание");
        potok.setRunning(true);
        potok.start();
                  }
@Override
                  public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) 
                  {
    Log.d(LOG_TAG, "изменение");
                  }
           }
        );
        
}
это код потока
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
public class Thread1 extends Thread {
    private boolean running = true;
    int speed = 100;
    long timer;
    private Game game;
    
    public Thread1(Game game) 
    {
          this.game = game;
    }
 
    public void setRunning(boolean run) 
    {
          running = run;
    }
 
    long prevTime = System.currentTimeMillis();
    public void run() {
          while (running) {
             Canvas r  = null;
              long now = System.currentTimeMillis();
              long elapsedTime = now - prevTime;
              if (elapsedTime > speed){
                prevTime = now;
                timer = timer + elapsedTime;
 
                
                 try {
                        r = game.getHolder().lockCanvas();
                        synchronized (game.getHolder()) {
                               game.onDraw(r);
                               if (Game.play == true){
                                   game.onDraw1(r);
                               }
                         
                        }
                    
                 } finally {
                        if (r != null) {
                               game.getHolder().unlockCanvasAndPost(r);
                        }
                 }
          }
 
          }
          
}  
}
при повторном открывание доходит до тэга с созданием.
ошибка как я понял где то здесь
Java
1
2
3
4
5
6
7
 public void surfaceCreated(SurfaceHolder holder) 
                  {
    loadbitmap();
     Log.d(LOG_TAG, "создание");
        potok.setRunning(true);
        potok.start();
                  }
0
Вложения
Тип файла: txt log.txt (2.2 Кб, 5 просмотров)
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
13.04.2013, 23:16
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Ошибка в SurfaceView (Программирование Android):

Восстановление SurfaceView - Программирование Android
Кто работал с SurfaceView, помогите! Рисую на SurfaceView с помощью onTouchEvent(), без потока, все замечательно рисует, сворачиваю...

Работа с SurfaceView - Программирование Android
Отрисовка в SurfaceView никогда не вызывала трудностей, до тех пор, пока не запустил приложение на телефоне с экраном 1920х1080px. Фпс упал...

SurfaceView не отображается - Программирование Android
Учусь программировать по книге П. Дейтел, Х. Дейтел "Android для программистов. Создаём приложения". Делаю уже 5 приложение, но это не...

Мерцание в SurfaceView - Программирование Android
Всем привет! Рисую на SurfaceView фон и на нем анимированные объекты. Кадры беру из атласа. Появилось мерцание, причем фон не мерцает а...

SurfaceView + onKeyDown - Программирование Android
Проблемка очень простая - не реагирует на onKeyDown в классе, наследующем SurfaceView. Исправьте мою криворукость, пожалуйста, подскажите,...

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

4
V0v1k
1159 / 983 / 1
Регистрация: 28.06.2012
Сообщений: 3,462
13.04.2013, 23:24 #2
вы пытаетесь запустить уже запущенный поток.
0
metrolog
4 / 4 / 0
Регистрация: 18.11.2012
Сообщений: 101
13.04.2013, 23:25  [ТС] #3
где мне его тогда запускать если не в surfaceCreated ?
0
V0v1k
1159 / 983 / 1
Регистрация: 28.06.2012
Сообщений: 3,462
13.04.2013, 23:30 #4
Java
1
2
3
4
5
6
7
8
public void surfaceCreated(SurfaceHolder holder) 
                  {
    loadbitmap();
     Log.d(LOG_TAG, "создание");
        potok = new  Thread1(Game.this);
        potok.setRunning(true);
        potok.start();
                  }
попробуйте так.
1
metrolog
4 / 4 / 0
Регистрация: 18.11.2012
Сообщений: 101
13.04.2013, 23:38  [ТС] #5
уже лучше стало)
при первом скрывание ошибки не выдает, но если сразу второй раз скрыть раскрыть то выдает

04-13 23:34:17.120: E/AndroidRuntime(5453): FATAL EXCEPTION: Thread-28170
04-13 23:34:17.120: E/AndroidRuntime(5453): java.lang.NullPointerException
04-13 23:34:17.120: E/AndroidRuntime(5453): at com.example.games.Game.onDraw(Game.java:140)
04-13 23:34:17.120: E/AndroidRuntime(5453): at com.example.games.Thread1.run(Thread1.java:40)

Добавлено через 3 минуты
все. решил проблему.
большое спасибо.
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
13.04.2013, 23:38
Привет! Вот еще темы с ответами:

Простейший пример SurfaceView - Программирование Android
Здравствуйте. Напишите пожалуйста простейшую программу рисующую точку на экране с помощью SurfaceView.

SurfaceView поверх ImageView - Программирование Android
До этого вместо Surface использовался обычный View и Canvas в нём, но потребовалась анимация. Просто в background картинку засунуть не...

Узнать фон SurfaceView - Программирование Android
Как узнать фон SurfaceView? mSurfaceViewLeft = (SurfaceView)findViewById(R.id.surfaceViewLeft); mSurfaceViewRight =...

Воспроизведение видео в SurfaceView - Программирование Android
Ребят прощу у вас помощи, возникла такая проблема необходимо воспроизвести видео с помощью MediaPlayer(ранее использовал его для...


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

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

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