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

Непонятное поведение многопоточного приложения - Android

Войти
Регистрация
Восстановить пароль
Другие темы раздела
Java SE Записать строки в текстовый файл, для последующего их добавления в ArrayList http://www.cyberforum.ru/android-dev/thread1733141.html
Доброго времени суток уважаемые форумчане! У меня есть такой вот вопрос. Имеется класс типа библиотека. В нем надо прописать возможность добавления новой книги в текстовый файл? для последующей его обработки в ArrayList. Пока для записи в файл использую вот такой вот метод, if (sc==6){ System.out.println("Введите новую книгу:"); String filePath = "Lib.txt"; ...
Java SE повлияет ли установка большего количества озу на работу genymotion если я поставлю дополнительную планку озу то увеличит ли это скорость эмулятора для андроид genymotion и увеличит ли скорость Android Studio а то они ужасно виснут ,сейчас стоит 2Gb планка. Если нет то как увеличить их скорость? http://www.cyberforum.ru/android-dev/thread1733086.html
Java Курсы
Всем - всем привет! Сразу прощу прощения, так как скорее всего тема не в том разделе но все же. Вот какой вопрос, на который прощу Вашего совета/помощи: Недавно начал изучать Java на курсах от универа. Закончил как бы их 1 курс по Java и теперь сообщают, что продолжение переносится на не определенный срок. Может Вы знаете какие-то хорошие курсы, желательно в Украине, чтоб с оплатой мороки не...
Java SE Преобразовать строку бит в строку байт в кодировке utf8
Всем доброго времени суток! Пишу программу шифровки/расшифровки DES (лабораторная работа) Осталось решить один момент. Когда я читаю текст из файла использую: Path path = file.toPath(); byte data = Files.readAllBytes(path);//Считали массив файл, как массив байт String content = new String(data, StandardCharsets.UTF_8);//Преобразовали массив байт в строку И программа мне...
Java SE ООП в Eclipse http://www.cyberforum.ru/android-dev/thread1732709.html
Cоздать программу через ООП. Меню кафе. Должна быть представлена следующая информация: категория (десерт, закуска, первое блюдо, напиток и т.д.), название, вес, стоимость. Функция Run () - определить самое дорогое блюдо указанной категории. Подскажите пожалуйста. ООП еще толком не начали проходить.
Java SE Чтение и запись файла Господа, добрый день! Прошу помощи, полгода назад данный код компилировался на компе в университете. Сейчас на домашнем он не работает. Программа даже не заходит в первый цикл, минуя его. Вывод совершает такой: import java.io.File; import java.io.FileNotFoundException; import java.io.FileWriter; import java.io.IOException; import java.util.ArrayList; подробнее

Показать сообщение отдельно
кверти
4 / 4 / 1
Регистрация: 22.09.2013
Сообщений: 139
Завершенные тесты: 2

Непонятное поведение многопоточного приложения - Android

12.05.2016, 20:00. Просмотров 257. Ответов 8
Метки (Все метки)

Всем добрый день. Ввожу в курс дела: я пишу игру под android и мне потребовалась в игре небольшая система, которая будет рендерить пул объектов хранящийся в HashMap<Integer, Object>.
Эта мапа заполняется в отдельном потоке. Элементы в мапу добавляются с небольшим промежутком времени(чтобы потом рендерились не все объекты сразу)
Вот код метода run();
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
@Override
    public void run() {
        if(!shotdown) {
            for(int i = 0; i < sizeArray; i++) {
                try {
                    Thread.sleep(100);
                    dummies.put(position, new Dummy(BodyFactory.createDummy(world)));
                    position++;
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
        }
        shotdown = !shotdown;
    }
Код тривиален... каждые 100 мс добавляем в мапу объект, который в дальнейшем будет рендериться

Для дальнейшего понимания: Есть некоторый класс Level унаследованный от Thread, соответственно код выше относится к этому классу
Объект класса Level создается в классе отвечающем за игровой мир. Вот код этого класса
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
public class PlayState extends State {
    private float frameCount;
    private World world;
    private Box2DDebugRenderer debugRenderer;
    private OrthographicCamera camera;
    private Level level;
    private SpaceShip spaceShip;
 
    public PlayState(GameStateManager gsm) {
        super(gsm);
        frameCount = 0;
        Constans.WIDTH = Gdx.graphics.getWidth();
        Constans.HEIGHT = Gdx.graphics.getHeight();
 
        world = new World(Constans.GRAVITY, Constans.SLEEP);
        world.setContactListener(new ContactObject());
 
        camera = new OrthographicCamera(Constans.WIDTH / 2, Constans.HEIGHT / 2);
        camera.position.set(new Vector2(100.0f, 100.0f), 0);
 
        debugRenderer = new Box2DDebugRenderer();
 
        level = new Level(world);
        level.start();
        spaceShip = new SpaceShip(BodyFactory.createSpaceShip(world));
    }
 
    @Override
    protected void handleInput() throws InterruptedException {
        if(Gdx.input.getX() >= 0 && Gdx.input.getX() <= 40 && Gdx.input.getY() >= Constans.HEIGHT -45 && Gdx.input.getY() <= Constans.HEIGHT +30) {
            dispose();
            gsm.set(new MenuState(gsm));
        }
 
        if(spaceShip != null) {
            if (Constans.STYLE_CONTROL) {
                spaceShip.tapControl();
            } else {
                spaceShip.AccControl();
            }
        }
    }
 
    @Override
    public void update(float time) throws InterruptedException {
        camera.setToOrtho(false, Constans.WIDTH / 2, Constans.HEIGHT / 2);
        handleInput();
 
        if(spaceShip != null) {
            spaceShip.update(time);
        }
        for (Map.Entry entry : level.getDummies().entrySet()) {
            if(entry != null && entry.getValue() instanceof Dummy) {
                level.checkScreen(entry.getValue(), level.getPosition());
                Dummy dummy = (Dummy) entry.getValue();
                level.setPosition((Integer) entry.getKey());
                dummy.update(time);
            }
        }
    }
 
    @Override
    public void render(SpriteBatch batch) throws InterruptedException {
        world.step(1f, 2, 2);
        debugRenderer.render(world, camera.combined);
        batch.setProjectionMatrix(camera.combined);
        batch.begin();
        frameCount += Gdx.graphics.getDeltaTime();
        batch.draw(Constans.BG_PLAY_SCREEN.getKeyFrame(frameCount, true),0, 0);
 
        if(spaceShip != null) {
            batch.draw(spaceShip.getParameters().getTypeShip(), spaceShip.getPosition().x, spaceShip.getPosition().y);
        }
        for (Map.Entry entry : level.getDummies().entrySet()) {
            if(entry != null && entry.getValue() instanceof Dummy) {
                level.checkScreen(entry.getValue(), level.getPosition());
                Dummy dummy = (Dummy) entry.getValue();
                level.setPosition((Integer) entry.getKey());
                batch.draw(dummy.getParameters().getSkin(), dummy.getPosition().x, dummy.getPosition().y);
            }
        }
 
        batch.draw(Constans.SETTING_PLAY_SCREEN, 0, 0);
        batch.end();
    }
 
    @Override
    public void dispose() {
        if(spaceShip != null) {
            spaceShip.resetParameters();
        }
        if(level != null) {
            level.stop();
            level.dispose();
        }
    }
}
В методе update и render мы пробегаемся по всем объектам нашего пула и вызываем соответствующие методы для обновления и рендеринга каждого объекта.
На словах все вроде бы не сильно сложно. Но по итогам такого алгоритма возникает куча непонятных проблем.
1) Игра крашится, спустя некоторое количество отрисованых объектов
2) Методы update и render у объектов, которые отрисовываются отрабатывают не до конца.
А конкретно выглядит это так: объект отрисовался прошло 100мс(время указанное в методе run) и он исчезает. После отрисовывается другой объект. Почему так происходит? Ведь каждый элемент пула ссылается на разные объекты, а не на один и тот же.
В логах нет никаких вылетов ошибок и прочего. Приложение просто останавливается и все...
Буду благодарен за помощь.
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
 
Текущее время: 11:09. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru