2012-06-25 5 views
1

Я работаю с Android 2.3.3. У меня возникла проблема с обновлением вида активности после поворота экрана.Обновить активность после поворота экрана

В моей деятельности есть переменная (счетчик), TextView (отображает значение счетчика), кнопку (увеличение счетчика и ее отображение) и TimerTask (увеличение счетчика и отображение его). Он работает правильно. Мой TextView показывает новое значение после каждого события из Button или TimerTask.

Работает, пока я не вращаю свой телефон. Событие TimerTask больше не обновляет мой TextView. Кнопка и экран поворота могут изменить мой вид. Мой TimerTask по-прежнему увеличивает мою переменную, но на экране нет изменений. Я проверил, TimerTask все еще выполняется и выполняется.

Это не мой настоящий проект, это просто та часть, где есть моя ошибка.

Моя единственная деятельность:

package com.test; 

import java.util.Timer; 
import java.util.TimerTask; 

import android.app.Activity; 
import android.os.Bundle; 
import android.os.Handler; 
import android.util.Log; 
import android.view.View; 
import android.widget.TextView; 
import android.widget.Toast; 

public class TestRefreshActivity extends Activity { 
    static TimerTask mTimerTask=null; 
    static Timer t=new Timer(); 
    final Handler handler = new Handler(); 
    static int counter=0; 

    //------------------------------------------------- 
    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.main); 

     //create and run the timer 
     if(mTimerTask==null){ 
      Log.d("Test","new TimerTask"); 
      mTimerTask = new TimerTask() { 
       public void run() { 
        handler.post(new Runnable(){ 
         public void run(){ 
          counter++; 
          refreshCounter(); 
          Log.d("TIMER", "TimerTask run"); 
         } 
        }); 
       } 
      }; 
      t.schedule(mTimerTask, 500, 3000); 
     } 
     Log.d("Test","--onCreate--"); 
     refreshCounter(); 
    } 

    //------------------------------------------------- 
    @Override 
    public void onBackPressed() { 
     super.onBackPressed(); 
     mTimerTask.cancel(); 
     TestRefreshActivity.this.finish(); 
    } 
    //------------------------------------------------- 
    @Override 
    protected void onDestroy() { 
     super.onDestroy(); 
     Log.d("Test","--onDestroy--"); 
    } 

    //------------------------------------------------- 
    public void onBtnClick(View view){ 
     counter++; 
     refreshCounter(); 
    } 

    //------------------------------------------------- 
    //the only function which refreshes the TextView 
    private void refreshCounter(){ 
     Runnable run = new Runnable(){ 
      public void run(){ 
       TextView textView = (TextView)findViewById(R.id.textView1); 
       textView.setText("counter="+counter); 
       textView.invalidate(); 
      } 
     }; 
     synchronized(run){ 
      TestRefreshActivity.this.runOnUiThread(run); 
     } 
    } 
} 

И мой единственный вид:

<?xml version="1.0" encoding="utf-8"?> 
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="fill_parent" 
    android:layout_height="fill_parent" 
    android:orientation="vertical" > 

    <TextView 
     android:id="@+id/textView1" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:text="Large Text" 
     android:textAppearance="?android:attr/textAppearanceLarge" /> 

    <Button 
     android:id="@+id/button1" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:onClick="onBtnClick" 
     android:text="Button" /> 

</LinearLayout> 

Я не понимаю, почему мой TimerTask не может изменить вид после поворота. То, что я знаю, вращение разрушает мою деятельность для его воссоздания, но выживают только статические переменные.

Благодарим за помощь.

С уважением,

+0

Одна вещь заключается в том, что вы не закончите работу в методе onBackPressed, потому что вы уже вызвали метод super.onBackPressed. Также остановите таймер в методе onDestoy. Если вы хотите, чтобы ваша переменная вернулась после ориентации, тогда пользователь onSavedInstance и метод onRestoreInstance – Dharmendra

ответ

0

android:configChanges="keyboardHidden|orientation" - это плохое решение, которое обескураживает руководствами. Это спасет вас только от поворота экрана, но ваше приложение будет по-прежнему непригодным для использования после того, как ваша активность будет убита андроидом, когда он находится на заднем плане.

Посмотрите, что вы делаете. Вы предоставляете ссылку на обработчик статического таймера. Когда вы поворачиваете свой телефон, активность воссоздается (значит, один из них уничтожен, а другой создан). Ваша активность уничтожается, но статические члены все еще живут, и они все еще содержат ссылку на обработчик для активности, которая мертва.

Создается новое действие с новым обработчиком, но ваш timertask ничего не знает об этом.

У вас есть статический таймер, который обновляет недействительный обработчик и активность, которая ничего не делает.

Я бы сбросил статику и сохранил бы текущее значение таймера в пакете onSaveInstanceState.

Или (даже проще для вас) создать сеттер для обработчика в вашем TimerTask, и когда вы делаете эту проверку if(mTimerTask==null){ и увидеть, что таймер уже экземпляр, установите новый обработчик в нем (mTimerTask.setHandler(yourActivityHandler)), так что, когда новая деятельность создается ваш timertask, который будет размещаться в новом обработчике.

+0

Здравствуйте, модифицируйте манифест, единственное решение. Определите хорошего обработчика в моем TimeTask, после каждого воссоздания активности, не работает.Спасибо за андроид: configChanges – cbidon

-2

открыть андроид файл манифеста и изменение активности тэга следующего

<activity android:name=".aaa" 
        android:configChanges="keyboardHidden|orientation" 
        android:label="@string/app_name"></activity> 
Смежные вопросы