Как решить проблему с handler-ом для textview?

Возникла следующая проблема.
Есть TextView и Handler к нему(для вывода в него). Я создаю поток в котором я с некоторым интервалом дергаю handler. Все идет нормально(все записи выводятся в textView). Но как только я поворачиваю телефон, перестают добавляться новые записи (но созданный поток продолжает работу). Хотя в лог выводятся (в Handler-е).

package com.example.abcd;

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();
        }

    }
}


Кто может объяснить, почему при повороте не добавляется текст.
  • Вопрос задан
  • 3108 просмотров
Решения вопроса 1
mik_os
@mik_os
Если у вас активити пересоздается после переворота (поведение по-умолчанию) то поток будет обращаться к handler'у из прошлого объекта, и постить в него, а не в новый. У вас тут вообще утечка помяти, старые объекты не удаляются GC'ом потому что ваш поток храник на них референсы.
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
itspers
@itspers
Так в конце ж написано "if(!b){" - а b будет true после поворота
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы