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

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

Войти
Регистрация
Восстановить пароль
 
 
yura91
30 / 28 / 2
Регистрация: 23.10.2013
Сообщений: 2,248
#1

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

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

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 и после поворота добавлялись новые записи? Подскажите пожалуйста
Лучшие ответы (1)
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
23.02.2016, 16:26
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Handler (Программирование Android):

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

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

Handler timer - Программирование Android
Добрый вечер. С помощью какого метода в Handler http://developer.android.com/reference/android/os/Handler.html(беда пока с английским) ,...

Про Handler и ProgressBar - Программирование Android
Есть 2 кнопки - Start и Stop, соответственно запуск и остановка прогресса в ProgressBar, запуск каждый раз идет с нуля. Если нажать...

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

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

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Pablito
2470 / 1915 / 595
Регистрация: 12.05.2014
Сообщений: 6,740
Завершенные тесты: 1
23.02.2016, 16:40 #2
у тебя же стоит проверка if(!b){
а при пересоздании outState.putBoolean("bool",true);
поэтому Thread после поворота уже не стартует, я так думаю
yura91
30 / 28 / 2
Регистрация: 23.10.2013
Сообщений: 2,248
23.02.2016, 17:02  [ТС] #3
То есть только в этом, а Handler получается автоматически пересоздает ссылку. То есть после поворота handler будет продолжать работу уже с handlerом из нового обьекта так получается?
Pablito
2470 / 1915 / 595
Регистрация: 12.05.2014
Сообщений: 6,740
Завершенные тесты: 1
23.02.2016, 17:03 #4
проверь и отпишись
yura91
30 / 28 / 2
Регистрация: 23.10.2013
Сообщений: 2,248
23.02.2016, 17:26  [ТС] #5
После поворота идет отчет сначала, то есть выводится text0 потом text1 и так дальше. То есть Handler создается новый а как сделать чтобы Handler новый не создавался а найти старый и с ним продолжить дальше работу которая не была закончена до поворота? Можно как нибудь ссылку пересоздать на новый обьект активити, чтобы после поворота не начинать с нуля работу?
Pablito
2470 / 1915 / 595
Регистрация: 12.05.2014
Сообщений: 6,740
Завершенные тесты: 1
23.02.2016, 17:50 #6
я вообще считаю что активити не нужно пересоздавать при поворотах, это сразу решит целую кучу проблем и можно будет выпиливать целые методы, которые что-то там сохраняют, а потом вытягивают при простом повороте экрана когда всего-то надо сделать - это пересчитать размеры вьюшек

некоторое время назад меня умники шапками начали закидывать, якобы это выльется боком когда-нибудь, когда Нибиру встанет в одну линию с Юпитером и Плутоном и солнце померкнет
yura91
30 / 28 / 2
Регистрация: 23.10.2013
Сообщений: 2,248
23.02.2016, 17:54  [ТС] #7
А как запретить пересоздание активити?
Pablito
2470 / 1915 / 595
Регистрация: 12.05.2014
Сообщений: 6,740
Завершенные тесты: 1
23.02.2016, 17:56 #8
Сообщение было отмечено автором темы, экспертом или модератором как ответ
Как сохранить все данные при повороте
yura91
30 / 28 / 2
Регистрация: 23.10.2013
Сообщений: 2,248
23.02.2016, 18:06  [ТС] #9
То есть чтобы поворот происходил, но только активити не пересоздавалось можно как то так?

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

Не по теме:

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

yura91
30 / 28 / 2
Регистрация: 23.10.2013
Сообщений: 2,248
23.02.2016, 19:43  [ТС] #12
я побоялся новой лавины вопросов, поэтому не стал говорить про сервисы и неявные интенты как средство общения между активитями или сервисом и активити )
PendingIntent чтоли?
Pablito
2470 / 1915 / 595
Регистрация: 12.05.2014
Сообщений: 6,740
Завершенные тесты: 1
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 {
            // видимо активити только запустилась, она не была запущена до этого
        }
    }
}
yura91
30 / 28 / 2
Регистрация: 23.10.2013
Сообщений: 2,248
23.02.2016, 20:07  [ТС] #14
А если в момент обращения сервиса к активити пользователь повернет экран(опять тоже пересоздание), то как данная конструкция избавляет от ошибки? Сервис посылает интент а активити еще не успел пересоздаться чтобы его поймать что здесь будет?
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
23.02.2016, 20:16     Handler
Еще ссылки по теме:

Handler и интервал времени - Программирование Android
Создаю хэндлер: Handler h = new Handler(); h.post(obrtimer); Runnable obrtimer = new Runnable() { public void run() { ...

Работа с Handler из другого активити - Программирование Android
Здравствуйте, пишу чат приложение и не могу понять как можно обрабатывать входящие сообщение из другого активити. У меня есть форма...

Потоки (Handler внутри synchronized) - Программирование Android
private Handler Ocnova = new Handler(); private Object sync = new Object(); class newThread extends Thread { //...String mes..... ...

Handler при пересоздании активити - Программирование Android
У меня есть поток Thread, который запускается во фрагменте и получает ссылку на изображение с сервера(парсит JSON выделяет ссылку). И...


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

Или воспользуйтесь поиском по форуму:
Pablito
23.02.2016, 20:16     Handler
  #15

Не по теме:

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

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

Yandex
Объявления
23.02.2016, 20:16     Handler
Ответ Создать тему
Опции темы

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