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

Метод в новом потоке срабатывает только один раз - Android

Войти
Регистрация
Восстановить пароль
Другие темы раздела
Android Ошибка в контекстном меню AppCompatActivity http://www.cyberforum.ru/android-dev/thread1854088.html
Здравствуйте! Я только начинаю изучать разработку под Android. Использую IDE Android Studio 2.2.2, встроенный эмулятор, Android SDK Platform 24. Не знаю, по адресу ли обратился, но самостоятельно найти решение у меня не получается, надеюсь на помощь опытных форумчан. Суть проблемы - решил поэкспериментировать с контекстным меню: public class MainActivity extends Activity { ...
Android Блокировка кнопки на час У меня есть кнопка, я хочу, что бы при её нажатии она блокировалась на час, естестественно, при перезапуска таймер шел дальше. Час проходит - она активная. Как это называется, и как это сделать? http://www.cyberforum.ru/android-dev/thread1854055.html
Android Один Executor на все приложение
Здравствуйте. Начала изучать андроид и по учебе встала такая задача написать читалку для новостей все худо бедно пишется но уперся в одном месте Нужно создать один пул нитей на все приложение. с Executor раньше не работал поэтому все в новинку. Хотелось бы получить помощь по этому вопросу. Скажу сразу что создание публичной статик переменной не катит по указание препода на вопрос как это...
Как добавить событие в календарь Android
Такой вопрос. Как добавить событие в календарь ? Видел в одном приложении что можно.
Android Перевод значения из Text Edit в hex http://www.cyberforum.ru/android-dev/thread1853728.html
Добрый день! подскажите как перевести в Hex. msgG = edit_send.getText().toString(); пробывал msgG = edit_send.getText().toHexString(); но нифига не работает. Чего то непонимаю
Android Работа с устройством через bluetooth Требуется сделать приложение на андройд чтобы оно соединялось с блютуз устройством и приняло от него данные. Идея создать блютуз передатчик с установленным датчиком давления, надо принять с него показания на телефон. Без наворотов и всяких украшательств, самое простое. подробнее

Показать сообщение отдельно
Catchermax
0 / 0 / 0
Регистрация: 18.11.2016
Сообщений: 5

Метод в новом потоке срабатывает только один раз - Android

18.11.2016, 19:17. Просмотров 119. Ответов 0
Метки (Все метки)

Господа комрады, выручайте)

В целях обучения себя любимого пишу простенькую игрушку, смысл заключается в том что на экране появляется ImageButton и она должна перемещаться по экрану в случайную координату каждую секунду (с течением времени должна ускоряться) и на неё надо нажать, если успел то зачисляется одно очко. Вот, вроде звучит просто, но сломал себе голову над таймером.

Вот полный код
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
package com.example.max.davydparty;
 
import android.app.Activity;
import android.os.Bundle;
import android.os.Handler;
import android.view.View;
import android.view.Window;
import android.view.WindowManager;
import android.widget.EditText;
import android.widget.ImageButton;
import android.widget.TextView;
 
import java.util.Random;
import java.util.concurrent.TimeUnit;
 
public class MainActivity extends Activity {
    private int countDavyds;//это счетчик давыдов
    private ImageButton faceDavyd;//изоброжение Давыда
    public int getCountDavyds() {
        return countDavyds;
    }
    public void setCountDavyds(int countDavyds) {
        this.countDavyds = countDavyds;
    }
 
    public int time;//это время, оно будет идти в обратную сторону
    public int getTime() {
        return time;
    }
    public void setTime(int time) {
        this.time = time;
    }
 
    Random random=new Random();
    //метод выдающий координату ширины
    public int getRandomCoordinateWidth() { //!!поменять значения до какого рандом может меняться, так как не знаю полные координаты
        return random.nextInt(575);
    }
    //метод выдающий координату высоты
    public int getRandomCoordinateHeight() { //!!поменять значения до какого рандом может меняться, так как не знаю полные координаты
        return random.nextInt(1090);
    }
 
    private TextView countDavydsTextView;//две переменные для редактирования значений в таймере и давыдах
    public TextView timeTextView;
    public boolean flagStop=true;//это флаг который выкидывает false когда надо остановиться
 
 
 
    //метод движения
    public void Run(){
        faceDavyd.setX(getRandomCoordinateWidth());
        faceDavyd.setY(getRandomCoordinateHeight());
    }
    //метод вычисления времени
    public void davidsAndTime(){
        faceDavyd.setX(getRandomCoordinateWidth());
        faceDavyd.setY(getRandomCoordinateHeight());}
 
 
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        requestWindowFeature(Window.FEATURE_NO_TITLE);//эти две строки мы сделали
        getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN); //чтобы забрать весь экран =)
        setContentView(R.layout.activity_main);
        setCountDavyds(0);//установили начальное значение давыдов
        setTime(30);//установили начальное значение таймера
        countDavydsTextView=(TextView)findViewById(R.id.textViewDavyds);//привязано к текстовому полю Давыды
        timeTextView=(TextView)findViewById(R.id.textView2Time);
        countDavydsTextView.setText("Давыды: "+getCountDavyds());//назначили начальные условия
        timeTextView.setText("Время: "+getTime());
        faceDavyd=(ImageButton)findViewById(R.id.imageButton);
 
        //начинаем обрабатывать перемещение давыда само по себе
        Thread t = new Thread(new Runnable() {//метод заставляющий давыда двигаться с все большей скоростью нужно доделать
            public void run() {
                try {
                    while(time>0){
                    TimeUnit.MILLISECONDS.sleep(1000);
                    Run();}
 
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
        });
        t.start();
 
        Thread w = new Thread(new Runnable() {//метод уменьшающий время
            public void run() {
 
                try {
                    while (time>0){
                    TimeUnit.MILLISECONDS.sleep(1000);
                    setTime(getTime()-1);
                        timeTextView.setText("Время: "+getTime());
                    }
 
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
        });
        w.start();
        
    }
 
 
 
    public void onClickHeadDavyd(View view) {
 
    }
 
 
}
А вот собственно участок который вызывает много вопросов

Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
Thread w = new Thread(new Runnable() {//метод уменьшающий время
            public void run() {
 
                try {
                    while (time>0){
                    TimeUnit.MILLISECONDS.sleep(1000);
                    setTime(getTime()-1);
                        timeTextView.setText("Время: "+getTime());
                    }
 
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
        });
        w.start();
Тут пока таймер не будет равен нулю, поток должен засыпать на секунду, потом уменьшать значение time и записывать это значение в поле TextView. Но при запуске поле меняется с 30 на 29 и останавливается, почему time меняется, но новое значение не записывает в TextView(записывает только один раз)?
При этом аналогичный код в котором кнопка прыгает по экрану работает как надо
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
Thread t = new Thread(new Runnable() {//метод заставляющий давыда двигаться с все большей скоростью нужно доделать
            public void run() {
                try {
                    while(time>0){
                    TimeUnit.MILLISECONDS.sleep(1000);
                    Run();}
 
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
        });
        t.start();
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
 
Текущее время: 10:47. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru