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

Handler - Android

Восстановить пароль Регистрация
 
yura91
28 / 26 / 2
Регистрация: 23.10.2013
Сообщений: 2,136
23.02.2016, 16:26     Handler #1
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)
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Паблито
не спать!
1882 / 1616 / 500
Регистрация: 12.05.2014
Сообщений: 5,836
Завершенные тесты: 1
23.02.2016, 16:40     Handler #2
у тебя же стоит проверка if(!b){
а при пересоздании outState.putBoolean("bool",true);
поэтому Thread после поворота уже не стартует, я так думаю
yura91
28 / 26 / 2
Регистрация: 23.10.2013
Сообщений: 2,136
23.02.2016, 17:02  [ТС]     Handler #3
То есть только в этом, а Handler получается автоматически пересоздает ссылку. То есть после поворота handler будет продолжать работу уже с handlerом из нового обьекта так получается?
Паблито
не спать!
1882 / 1616 / 500
Регистрация: 12.05.2014
Сообщений: 5,836
Завершенные тесты: 1
23.02.2016, 17:03     Handler #4
проверь и отпишись
yura91
28 / 26 / 2
Регистрация: 23.10.2013
Сообщений: 2,136
23.02.2016, 17:26  [ТС]     Handler #5
После поворота идет отчет сначала, то есть выводится text0 потом text1 и так дальше. То есть Handler создается новый а как сделать чтобы Handler новый не создавался а найти старый и с ним продолжить дальше работу которая не была закончена до поворота? Можно как нибудь ссылку пересоздать на новый обьект активити, чтобы после поворота не начинать с нуля работу?
Паблито
не спать!
1882 / 1616 / 500
Регистрация: 12.05.2014
Сообщений: 5,836
Завершенные тесты: 1
23.02.2016, 17:50     Handler #6
я вообще считаю что активити не нужно пересоздавать при поворотах, это сразу решит целую кучу проблем и можно будет выпиливать целые методы, которые что-то там сохраняют, а потом вытягивают при простом повороте экрана когда всего-то надо сделать - это пересчитать размеры вьюшек

некоторое время назад меня умники шапками начали закидывать, якобы это выльется боком когда-нибудь, когда Нибиру встанет в одну линию с Юпитером и Плутоном и солнце померкнет
yura91
28 / 26 / 2
Регистрация: 23.10.2013
Сообщений: 2,136
23.02.2016, 17:54  [ТС]     Handler #7
А как запретить пересоздание активити?
Паблито
не спать!
1882 / 1616 / 500
Регистрация: 12.05.2014
Сообщений: 5,836
Завершенные тесты: 1
23.02.2016, 17:56     Handler #8
Сообщение было отмечено автором темы, экспертом или модератором как ответ
Как сохранить все данные при повороте
yura91
28 / 26 / 2
Регистрация: 23.10.2013
Сообщений: 2,136
23.02.2016, 18:06  [ТС]     Handler #9
То есть чтобы поворот происходил, но только активити не пересоздавалось можно как то так?

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

Не по теме:

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

yura91
28 / 26 / 2
Регистрация: 23.10.2013
Сообщений: 2,136
23.02.2016, 19:43  [ТС]     Handler #12
я побоялся новой лавины вопросов, поэтому не стал говорить про сервисы и неявные интенты как средство общения между активитями или сервисом и активити )
PendingIntent чтоли?
Паблито
не спать!
1882 / 1616 / 500
Регистрация: 12.05.2014
Сообщений: 5,836
Завершенные тесты: 1
23.02.2016, 19:55     Handler #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
28 / 26 / 2
Регистрация: 23.10.2013
Сообщений: 2,136
23.02.2016, 20:07  [ТС]     Handler #14
А если в момент обращения сервиса к активити пользователь повернет экран(опять тоже пересоздание), то как данная конструкция избавляет от ошибки? Сервис посылает интент а активити еще не успел пересоздаться чтобы его поймать что здесь будет?
Паблито
23.02.2016, 20:16
  #15

Не по теме:

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

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

yura91
28 / 26 / 2
Регистрация: 23.10.2013
Сообщений: 2,136
23.02.2016, 20:20  [ТС]     Handler #16
То есть активити в этом случае даже не будет заново стартовать как при явных интентах. Ей можно не заметно что то передать из сервиса это вы имели ввиду?
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
23.02.2016, 20:26     Handler
Еще ссылки по теме:

Android Работа с Handler из другого активити
Android Не работает Handler
Android Почему Handler не отображает сообщение на экране
Android Handler
Android Handler при пересоздании активити

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

Или воспользуйтесь поиском по форуму:
Паблито
не спать!
1882 / 1616 / 500
Регистрация: 12.05.2014
Сообщений: 5,836
Завершенные тесты: 1
23.02.2016, 20:26     Handler #17
если активити была запущена, например открыта на экране или свернута то вызовется метод onNewIntent
иначе активити запустится как обычно через onCreate()
Цитата Сообщение от yura91 Посмотреть сообщение
Ей можно не заметно что то передать из сервиса
точно, при этом ненадо в сервисе думать какой там у нас контекст сейчас, как класс называется и так далее

если сомневаться в том, что какой-то интент не дойдет до активности потому что та еще не пересоздалась то можно вообще всю систему интентов ставить под сомнение
Yandex
Объявления
23.02.2016, 20:26     Handler
Ответ Создать тему
Опции темы

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