2012-06-25 140 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" - 是由指引气馁一个贫穷的解决方案。它只会节省你在屏幕上的旋转,但是当你的活动在背景上被android杀死后,你的应用仍然不可用。

看看你在做什么。您提供了对静态计时器的处理程序的引用。当你旋转你的手机时,活动被重新创建(意味着一个被破坏,另一个被创建)。你的活动被破坏,但静态成员仍然活着,他们仍然持有对已死亡活动处理程序的引用。

然后用一个新的处理函数创建一个新的活动,但是你的timertask对此一无所知。

因此,您有一个更新无效处理程序的静态计时器,以及无所作为的活动。

我会放下静态,并将保存在捆绑onSaveInstanceState当前计时器值。

或(甚至更容易为你)在你的TimerTask创建处理程序制定者,当你做这种检查if(mTimerTask==null){看到,该计时器已经在实例中,它(mTimerTask.setHandler(yourActivityHandler))设置一个新的处理程序,以便在新的活动创建你的timertask将发布在一个新的处理程序。

+0

你好,修改清单seens唯一的解决方案。在我的TimeTask中定义好处理程序,在每次活动重新执行后都不起作用。感谢android:configChanges – cbidon

-2

打开您的Android清单文件,并在活动标签更改如下

<activity android:name=".aaa" 
        android:configChanges="keyboardHidden|orientation" 
        android:label="@string/app_name"></activity>