Форум программистов, компьютерный форум, киберфорум
Программирование Android
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.78/9: Рейтинг темы: голосов - 9, средняя оценка - 4.78
3 / 27 / 2
Регистрация: 23.10.2013
Сообщений: 2,331
1

Handler

23.02.2016, 16:26. Показов 1722. Ответов 16
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
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
import android.app.Activity;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.util.Log;
import android.view.View;
import android.widget.TextView;
 
 
public class MyActivity extends Activity {
    public static final String LOG_D="MyDebug:";
    public boolean b=false;
    public Handler handler;
    public TextView chat;
    public String text;
 
    @Override
    protected void onSaveInstanceState(Bundle outState) {
        super.onSaveInstanceState(outState);
        outState.putBoolean("bool",true);
        Log.d(LOG_D,"Save");
    }
 
    public static Message getMessageFromString(String str, String key) {
        Bundle messageBundle = new Bundle();
        messageBundle.putString(key, str);
 
        Message message = new Message();
        message.setData(messageBundle);
        return message;
    }
    @Override
    public Object onRetainNonConfigurationInstance() {
        return text;
    }
    /**
     * Called when the activity is first created.
     */
    @Override
    public void onCreate(Bundle savedInstanceState) {
 
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        text="";
        chat = (TextView)findViewById(R.id.chat);
        handler = new Handler() {
            public void handleMessage (final Message msg) {
 
                MyActivity.this.runOnUiThread(new Runnable() {
                    public void run() {
                        String chatLine = msg.getData().getString("msg");
                        Log.d(LOG_D,chatLine);
                        chat.append(chatLine);
                        chat.append("\n");
                        chat.setVisibility(View.VISIBLE);
                        text+=chatLine+'\n';
                    }
                });
            }
        };
        if(savedInstanceState!=null){
            b = savedInstanceState.getBoolean("bool");
            text = (String)getLastNonConfigurationInstance();
            handler.sendMessage(getMessageFromString(text,"msg"));
            text="";
        }
 
 
 
        if(!b){
            new Thread(new Runnable() {
                @Override
                public void run() {
                    int i=0;
                    while(true){
                    try {
                        Thread.currentThread().sleep(6000);
                        handler.sendMessage(getMessageFromString("text"+i,"msg"));
                        i++;
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                    }
                }
            }).start();
        }
 
    }
}

Есть TextView и Handler к нему(для вывода в него). Я создаю поток в котором я с некоторым интервалом дергаю handler. Все идет нормально(все записи выводятся в textView). Но как только я поворачиваю телефон, перестают добавляться новые записи (но созданный поток продолжает работу). это происходит потому что поток будет обращаться к handler'у из прошлого объекта, и постить в него, а не в новый. А как тогда можно решить эту проблему, как исправить код, чтобы в TextView и после поворота добавлялись новые записи? Подскажите пожалуйста
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
23.02.2016, 16:26
Ответы с готовыми решениями:

Handler
Вот допустим обьект Handler был создан в активити(то есть в главном потоке). И мы запускаем через...

Не работает Handler
Я нахожусь на 66 уроке startandroid, здесь упоминается Handler. Почему то отсутствуют у меня...

Handler timer
Добрый вечер. С помощью какого метода в Handler...

Про Handler и ProgressBar
Есть 2 кнопки - Start и Stop, соответственно запуск и остановка прогресса в ProgressBar, запуск...

16
2883 / 2295 / 769
Регистрация: 12.05.2014
Сообщений: 7,978
23.02.2016, 16:40 2
у тебя же стоит проверка if(!b){
а при пересоздании outState.putBoolean("bool",true);
поэтому Thread после поворота уже не стартует, я так думаю
0
3 / 27 / 2
Регистрация: 23.10.2013
Сообщений: 2,331
23.02.2016, 17:02  [ТС] 3
То есть только в этом, а Handler получается автоматически пересоздает ссылку. То есть после поворота handler будет продолжать работу уже с handlerом из нового обьекта так получается?
0
2883 / 2295 / 769
Регистрация: 12.05.2014
Сообщений: 7,978
23.02.2016, 17:03 4
проверь и отпишись
0
3 / 27 / 2
Регистрация: 23.10.2013
Сообщений: 2,331
23.02.2016, 17:26  [ТС] 5
После поворота идет отчет сначала, то есть выводится text0 потом text1 и так дальше. То есть Handler создается новый а как сделать чтобы Handler новый не создавался а найти старый и с ним продолжить дальше работу которая не была закончена до поворота? Можно как нибудь ссылку пересоздать на новый обьект активити, чтобы после поворота не начинать с нуля работу?
0
2883 / 2295 / 769
Регистрация: 12.05.2014
Сообщений: 7,978
23.02.2016, 17:50 6
я вообще считаю что активити не нужно пересоздавать при поворотах, это сразу решит целую кучу проблем и можно будет выпиливать целые методы, которые что-то там сохраняют, а потом вытягивают при простом повороте экрана когда всего-то надо сделать - это пересчитать размеры вьюшек

некоторое время назад меня умники шапками начали закидывать, якобы это выльется боком когда-нибудь, когда Нибиру встанет в одну линию с Юпитером и Плутоном и солнце померкнет
0
3 / 27 / 2
Регистрация: 23.10.2013
Сообщений: 2,331
23.02.2016, 17:54  [ТС] 7
А как запретить пересоздание активити?
0
2883 / 2295 / 769
Регистрация: 12.05.2014
Сообщений: 7,978
23.02.2016, 17:56 8
Лучший ответ Сообщение было отмечено yura91 как решение

Решение

Как сохранить все данные при повороте
1
3 / 27 / 2
Регистрация: 23.10.2013
Сообщений: 2,331
23.02.2016, 18:06  [ТС] 9
То есть чтобы поворот происходил, но только активити не пересоздавалось можно как то так?

Добавлено через 9 минут
Все понял спасибо за ответ
0
43 / 16 / 6
Регистрация: 05.12.2015
Сообщений: 65
23.02.2016, 19:35 10
После поворота идет отчет сначала, то есть выводится text0 потом text1 и так дальше. То есть Handler создается новый а как сделать чтобы Handler новый не создавался а найти старый и с ним продолжить дальше работу которая не была закончена до поворота? Можно как нибудь ссылку пересоздать на новый обьект активити, чтобы после поворота не начинать с нуля работу?
Сервис... модно, современно)
0
Pablito
23.02.2016, 19:41
  #11

Не по теме:

Цитата Сообщение от xaat Посмотреть сообщение
Сервис... модно, современно)
я побоялся новой лавины вопросов, поэтому не стал говорить про сервисы и неявные интенты как средство общения между активитями или сервисом и активити )

0
3 / 27 / 2
Регистрация: 23.10.2013
Сообщений: 2,331
23.02.2016, 19:43  [ТС] 12
я побоялся новой лавины вопросов, поэтому не стал говорить про сервисы и неявные интенты как средство общения между активитями или сервисом и активити )
PendingIntent чтоли?
0
2883 / 2295 / 769
Регистрация: 12.05.2014
Сообщений: 7,978
23.02.2016, 19:55 13
не совсем
ну например есть сервис, который должен посылать данные в активити
можно в манифесте в свойствах активити указать что-то типа
XML
1
2
3
4
5
6
7
8
9
10
        <activity
            android:name=".MyCoolActivity"
            android:launchMode="singleTask"
            android:theme="@style/AppTheme" >
            <intent-filter>
                <action android:name="OLOLO_ACTION" />
                <category android:name="android.intent.category.DEFAULT" />
            </intent-filter>
 
        </activity>
и теперь если в сервисе написать
Java
1
2
                Intent intent = new Intent("OLOLO_ACTION");
                startActivity(intent);
то вызовется наша активити
обращаю внимание - мы не указываем какую именно активити надо вызвать, а говорим что action такой-то

так же важно указать android:launchMode="singleTask" что бы активити стартовала всегда в одном экземпляре

когда мы создаем интент и говорим startActivity() и наша активити реагирует то у нее вызывается метод
onNewIntent() (да да есть такой)

примерный код и логика активити такая
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
public class MyCoolActivity extends AppCompatActivity {
 
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_drawer);
 
        processIntent(); // метод в котором будет обрабатываться интент (если он есть)
    }
 
    @Override
    protected void onNewIntent(Intent intent) {
        super.onNewIntent(intent);
        setIntent(intent);
        processIntent();
    }
 
    private void processIntent() {
        Intent intent = getIntent();
        if (intent != null) {
            String action = intent.getAction(); // строка будет равна OLOLO_ACTION
            // вытягиваем из интента bundle и все, что в него наложили
            // или по раззному реагируем на разные action, если их несколько разных
        } else {
            // видимо активити только запустилась, она не была запущена до этого
        }
    }
}
1
3 / 27 / 2
Регистрация: 23.10.2013
Сообщений: 2,331
23.02.2016, 20:07  [ТС] 14
А если в момент обращения сервиса к активити пользователь повернет экран(опять тоже пересоздание), то как данная конструкция избавляет от ошибки? Сервис посылает интент а активити еще не успел пересоздаться чтобы его поймать что здесь будет?
0
Pablito
23.02.2016, 20:16
  #15

Не по теме:

мое сообщение не о том, как не пропустить собщение, а как можно перекидывать что-то между активностями или сервисом

о пересоздании выше уже говорили

0
3 / 27 / 2
Регистрация: 23.10.2013
Сообщений: 2,331
23.02.2016, 20:20  [ТС] 16
То есть активити в этом случае даже не будет заново стартовать как при явных интентах. Ей можно не заметно что то передать из сервиса это вы имели ввиду?
0
2883 / 2295 / 769
Регистрация: 12.05.2014
Сообщений: 7,978
23.02.2016, 20:26 17
если активити была запущена, например открыта на экране или свернута то вызовется метод onNewIntent
иначе активити запустится как обычно через onCreate()
Цитата Сообщение от yura91 Посмотреть сообщение
Ей можно не заметно что то передать из сервиса
точно, при этом ненадо в сервисе думать какой там у нас контекст сейчас, как класс называется и так далее

если сомневаться в том, что какой-то интент не дойдет до активности потому что та еще не пересоздалась то можно вообще всю систему интентов ставить под сомнение
0
23.02.2016, 20:26
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
23.02.2016, 20:26
Помогаю со студенческими работами здесь

Handler, поток не останавливается
Добрый вечер. Не могу остановить таймер, при переходе на другую Activity. Возможно ли это вообще? ...

Handler и интервал времени
Создаю хэндлер: Handler h = new Handler(); h.post(obrtimer); Runnable obrtimer = new...

Handler vs Service vs AsynkTask
Есть 2 Activity, пусть A1 и A2. В методе onCreate() Activity A1 запускается новый поток, в котором...

Потоки (Handler внутри synchronized)
private Handler Ocnova = new Handler(); private Object sync = new Object(); class newThread...


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

Или воспользуйтесь поиском по форуму:
17
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru