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

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

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

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

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

Показать только один раз - Программирование Android
Подскажите, как можно показать заставку(это может быть изображение, или активность с imageView) только при первом запуске приложения??? При...

OnTouch MotionEvent в андроид выполняется только один раз - Программирование Android
Так вот сам вопрос: MotionEvent.ACTION_UP выполняется только первый раз, что при использовании if, что case. Кликаем по копке звук...

Handlers в новом потоке - Программирование Android
Почему не могу создать handlers в новом потоке ? Thread streamThread = new Thread(new Runnable() { public void run() { ...

ServerSocket в новом потоке - Программирование Android
По нажатию на кнопку запускаю новый поток. в Потоке открывается порт и ждет подключения: public void onClick(View view) { // TODO...

Работа с изображениями в новом потоке - Программирование Android
Доброго времени суток! У меня возникла проблемка с потоками, а собственно, не выходит работать с изображениями в новом потоке. На...

Post,Get запрос в новом потоке - Программирование Android
Как переписать код чтобы было возможным отправить запрос на android 4.0.3? Возникает ошибка, читал что это от того что в главном потоке...

0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
18.11.2016, 19:17
Привет! Вот еще темы с ответами:

Подскажите - не вызывается метод в потоке - Программирование Android
progress = ProgressDialog.show(getActivity(), "Please wait...", "Applying changes may take a few minutes.",...

OnKeyListener() не срабатывает на буквы, только на цыфры - Программирование Android
Доброго всем! Подскажите пожалуйста: OnKeyListener() не срабатывает на буквы, только на цыфры и enter. Код стандартный: ...

Нажатие на пункт меню срабатывает только со второго раза - Программирование Android
Может кто знает, почему нажатие на пункт меню срабатывает только со второго раза?

Какой метод срабатывает при повторном показе фрагмента - Программирование Android
Доброго... Имею несколько фрагментов, работаю с ними так: if (fragmentManager.findFragmentByTag(String.valueOf(idQuestion)) !=...


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

Или воспользуйтесь поиском по форуму:
1
Ответ Создать тему
Опции темы

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