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

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

Войти
Регистрация
Восстановить пароль
Другие темы раздела
Программирование Android Получить width и height картинки из ресурса http://www.cyberforum.ru/android-dev/thread1733130.html
Добрый день! Что то я уже запарился искать решение. А задача на вид элементарная: Есть cat - это id картинки из ресурса. Требуется получить ее размер (длину и ширину в пикселях); Бросил кнопку, подцепил к ней следующий обработчик public void btn2Click(View view) { ImageView catImageView = new ImageView(getApplicationContext()); catImageView.setImageResource(R.drawable.cat);
Программирование Android Установить Alarm в нужную дату Мне нужно чтобы AlarmManager запустил сервис, который делает сетевой запрос в определенную дату - 17.05.2016. Как такое можно реализовать? Добавлено через 2 минуты Просто в каком формате передать дату в Alarm в милисекундах, ввиде String или как то еще?? http://www.cyberforum.ru/android-dev/thread1733078.html
Передача ArrayList<String> через intent Программирование Android
Создан класс для передачи через intent: package ru.frozik6k.lohouse; import android.os.Parcel; import android.os.Parcelable; import java.util.ArrayList; import java.util.List; /**
Программирование Android Добавление записей в OracleDB через JSONParser
Доброго дня. Пытаюсь добавить пользователей через класс JSONParser, но при дебаге код не доходит даже до серверной части, после этих строк protected JSONObject doInBackground(String... params) { JSONParser jsonParser = new JSONParser(); перестает работать и вылетает из эмулятора при попытке добавить(компиляция без ошибок и предупреждений), в чем может быть проблема? ...
Программирование Android Как создать сканер используя Zxing? http://www.cyberforum.ru/android-dev/thread1732788.html
Здравствуйте! Подскажите пожалуйста! Как с помощью библиотеки Zxing создать сканер штрих-кодов, не скачивая сторонних приложении? Посмотрел много видео просто несколько строк которые скачивает приложение через инет. Извините если с вопросом что-то не так. Спасибо! Добавлено через 10 минут Посмотрел много видео, там несколько строк которые скачивает приложение BarcodeScanner через инет. А как...
Программирование Android Кастомизация прогресс-бара Добрый день. Каким образом засунуть в прогресс, вместо колора изображение? Код прилагаю: <layer-list xmlns:android="http://schemas.android.com/apk/res/android"> <item android:id="@android:id/background"> <color android:color="#2ecc71"></color> </item> <item android:id="@android:id/progress"> <clip> <color android:color="#27ae60"></color> ... подробнее

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

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

12.05.2016, 20:00. Просмотров 279. Ответов 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) и он исчезает. После отрисовывается другой объект. Почему так происходит? Ведь каждый элемент пула ссылается на разные объекты, а не на один и тот же.
В логах нет никаких вылетов ошибок и прочего. Приложение просто останавливается и все...
Буду благодарен за помощь.
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
 
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru