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

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

Войти
Регистрация
Восстановить пароль
 
Catchermax
0 / 0 / 0
Регистрация: 18.11.2016
Сообщений: 7
#1

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

18.11.2016, 19:17. Просмотров 128. Ответов 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();
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
18.11.2016, 19:17     Метод в новом потоке срабатывает только один раз
Посмотрите здесь:

Android Работа с изображениями в новом потоке
ServerSocket в новом потоке Android
Android Показать только один раз
Android Post,Get запрос в новом потоке
Как из одного потока вызвать метод таким образом, чтобы он выполнялся в другом потоке Android
Android OnTouch MotionEvent в андроид выполняется только один раз
Android OnKeyListener() не срабатывает на буквы, только на цыфры
Android Какой метод фрагмента срабатывает после закрытия диалога?
Android Какой метод срабатывает при повторном показе фрагмента
Android Обновление данных один раз в сутки
Android Handlers в новом потоке
Android Подскажите - не вызывается метод в потоке

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

Или воспользуйтесь поиском по форуму:
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Ответ Создать тему
Опции темы

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