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 在旋转后无法更改视图。据我所知,旋转破坏了我重新创建它的活动,但只有静态变量才能存活。

谢谢你的帮助。

问候,

4

2 回答 2

0

android:configChanges="keyboardHidden|orientation"- 是一个糟糕的解决方案,指南不鼓励这样做。它只会为您节省屏幕旋转,但是当您的活动在后台时被android杀死后,您的应用程序仍然无法使用。

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

然后使用新的处理程序创建一个新的活动,但您的 timertask 对此一无所知。

所以你有一个更新无效处理程序的静态计时器,以及什么都不做的活动。

我会删除静态数据并将当前计时器值保存在 onSaveInstanceState 中的捆绑包中。

或者(对您来说更容易)在 TimerTask 中为处理程序创建一个设置器,当您执行此检查if(mTimerTask==null){并查看该计时器已经实例化时,在其中设置一个新处理程序(mTimerTask.setHandler(yourActivityHandler))以便在创建新活动时您的 timertask 将发布在新的处理程序中。

于 2012-06-25T09:47:13.090 回答
-2

打开您的android清单文件并更改Activity标签如下

 <activity android:name=".aaa"
                  android:configChanges="keyboardHidden|orientation"
                  android:label="@string/app_name"></activity>
于 2012-06-25T09:36:49.530 回答